In acest articol vom face o statie meteo folosindu-ne de Arduino Mega, un display grafic 128x64 pixeli, cative senzori si un modul de ceas real (RTC).
Ca si senzori vom folosi 2 bucati DHT22 pentru interior si exterior si inca 3 senzori DS18B20 pentru a monitoriza temperaturile a inca 3 zone diferite.
Conectarea display-ului la Arduino este conform articolului de aici.
Iar pentru inceput vom crea grafica statiei meteo. Pentru acest lucru vom desena pe display 2 dreptunghiuri, primul este cu inaltimea de 20 de pixeli iar cel de-al doilea cu inaltimea de 42 de pixeli. In primul dreptunghi, cel mic, vom afisa 6 iconite care ne vor arata ce informatii se afiseaza in dreptunghiul de dedesubt.
Pentru crearea iconitelor personalizate am folosit programul Gimp, am creat o imagine de 16x16 pixeli si acolo am desenat fiecare iconita, cand am terminat am exportat fiecare iconita in format *.xbm. Exportand in acest format putem deschide fisierul cu un editor de text (eu am folosit Notepad++) si codul afisat va fi copiat si folosit in sketchul nostru.
Am creat 6 iconite: ceas, interior, exterior zona 1, zona 2 si zona 3. La fiecare iconita se va afisa informatia timp de 2 secunde.
Pentru ca nu am folosit inca senzorii si modulul RTC am declarat valorile acestor senzori ca si variabile la inceputul sketch-ului, acestea urmand a fi inlocuite pe masura ce se vor adauga senzori in montaj.
Sketch-ul folosit este urmatorul:
/* www.electronicstore.ro
* Sketch statie meteo cu 2 senzori DHT22 si 3 senzori DS18B20
* impreuna cu modul de ceas RTC si afisare pe display grafic 128x64
* ver 1.0
* */
#include "U8glib.h"
U8GLIB_ST7920_128X64 u8g(52, 51, 50, U8G_PIN_NONE);
#define icon_width 16
#define icon_height 16
static unsigned char clock_bits[] = {
0x00, 0x00, 0xc0, 0x01, 0xb0, 0x06, 0x8c, 0x18, 0x82, 0x20, 0x82, 0x20,
0x81, 0x40, 0x81, 0x7f, 0x01, 0x40, 0x02, 0x20, 0x02, 0x20, 0x0c, 0x18,
0x30, 0x06, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00 };
static unsigned char clock2_bits[] = {
0xff, 0xff, 0x3f, 0xfe, 0x4f, 0xf9, 0x73, 0xe7, 0x7d, 0xdf, 0x7d, 0xdf,
0x7e, 0xbf, 0x7e, 0x80, 0xfe, 0xbf, 0xfd, 0xdf, 0xfd, 0xdf, 0xf3, 0xe7,
0xcf, 0xf9, 0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff };
static unsigned char home_bits[] = {
0x00, 0x00, 0x80, 0x01, 0x40, 0x02, 0x20, 0x04, 0x10, 0x08, 0x08, 0x10,
0x04, 0x20, 0xfc, 0x3f, 0x04, 0x20, 0x74, 0x2f, 0x74, 0x2f, 0x74, 0x20,
0x74, 0x20, 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00 };
static unsigned char home2_bits[] = {
0xff, 0xff, 0x7f, 0xfe, 0xbf, 0xfd, 0xdf, 0xfb, 0xef, 0xf7, 0xf7, 0xef,
0xfb, 0xdf, 0x03, 0xc0, 0xfb, 0xdf, 0x8b, 0xd0, 0x8b, 0xd0, 0x8b, 0xdf,
0x8b, 0xdf, 0x03, 0xc0, 0xff, 0xff, 0xff, 0xff };
static unsigned char out_bits[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x10, 0x01, 0x08, 0x02,
0x08, 0x02, 0x08, 0x02, 0x10, 0x01, 0x10, 0x01, 0xe0, 0x00, 0xe0, 0x00,
0xe0, 0x00, 0xe0, 0x38, 0xe3, 0xfe, 0xff, 0xff };
static unsigned char out2_bits[] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xef, 0xfe, 0xf7, 0xfd,
0xf7, 0xfd, 0xf7, 0xfd, 0xef, 0xfe, 0xef, 0xfe, 0x1f, 0xff, 0x1f, 0xff,
0x1f, 0xff, 0x1f, 0xc7, 0x1c, 0x01, 0x00, 0x00 };
static unsigned char unu_bits[] = {
0x00, 0x00, 0xc0, 0x01, 0xe0, 0x01, 0xf0, 0x01, 0xb8, 0x01, 0x98, 0x01,
0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
0x80, 0x01, 0xe0, 0x07, 0xe0, 0x07, 0x00, 0x00 };
static unsigned char unu2_bits[] = {
0xff, 0xff, 0x3f, 0xfe, 0x1f, 0xfe, 0x0f, 0xfe, 0x47, 0xfe, 0x67, 0xfe,
0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe,
0x7f, 0xfe, 0x1f, 0xf8, 0x1f, 0xf8, 0xff, 0xff };
static unsigned char doi_bits[] = {
0x00, 0x00, 0xc0, 0x0f, 0xe0, 0x1f, 0x30, 0x18, 0x30, 0x18, 0x00, 0x18,
0x00, 0x1c, 0x00, 0x0e, 0x00, 0x07, 0x80, 0x03, 0xc0, 0x01, 0xe0, 0x00,
0x60, 0x00, 0xe0, 0x1f, 0xe0, 0x1f, 0x00, 0x00 };
static unsigned char doi2_bits[] = {
0xff, 0xff, 0x3f, 0xf0, 0x1f, 0xe0, 0xcf, 0xe7, 0xcf, 0xe7, 0xff, 0xe7,
0xff, 0xe3, 0xff, 0xf1, 0xff, 0xf8, 0x7f, 0xfc, 0x3f, 0xfe, 0x1f, 0xff,
0x9f, 0xff, 0x1f, 0xe0, 0x1f, 0xe0, 0xff, 0xff };
static unsigned char trei_bits[] = {
0x00, 0x00, 0x80, 0x07, 0xc0, 0x0f, 0x60, 0x18, 0x20, 0x30, 0x00, 0x30,
0x00, 0x18, 0x00, 0x0e, 0x80, 0x0f, 0x00, 0x18, 0x00, 0x30, 0x20, 0x30,
0x60, 0x18, 0xc0, 0x0f, 0x80, 0x07, 0x00, 0x00 };
static unsigned char trei2_bits[] = {
0xff, 0xff, 0x7f, 0xf8, 0x3f, 0xf0, 0x9f, 0xe7, 0xdf, 0xcf, 0xff, 0xcf,
0xff, 0xe7, 0xff, 0xf1, 0x7f, 0xf0, 0xff, 0xe7, 0xff, 0xcf, 0xdf, 0xcf,
0x9f, 0xe7, 0x3f, 0xf0, 0x7f, 0xf8, 0xff, 0xff };
int temp1 = 25;
int temp2 = 12;
int hum1 = 53;
int hum2 = 49;
int ora = 10;
int minut = 25;
int sec = 22;
int zi = 12;
int luna = 3;
int an = 2020;
int zona1 = 22;
int zona2 = 28;
int zona3 = 18;
void ecran1(void) {
u8g.setFont(u8g_font_unifont);
u8g.drawStr( 15, 18, "www.");
u8g.drawStr( 03, 38, "electronicstore");
u8g.drawStr( 80, 58, ".ro");
}
void ecran2(void) {
u8g.setFont(u8g_font_unifont);
u8g.drawStr( 27, 18, "Ceas si");
u8g.drawStr( 17, 38, "statie meteo");
u8g.drawStr( 47, 58, "grafica");
}
int arata1(int ora, int minut, int sec, int zi, int luna, int an) {
enum {BufSize=20};
char buf[BufSize];
snprintf (buf, BufSize, "%d:%d:%d", ora, minut, sec);
enum {BufSize2=20};
char buf2[BufSize2];
snprintf (buf2, BufSize2, "%d/%d/%d", zi, luna, an);
u8g.setFont(u8g_font_7x13);
u8g.drawFrame(0,0,128,20);
u8g.drawXBM( 2, 2, icon_width, icon_height, clock2_bits);
u8g.drawXBM( 19, 2, icon_width, icon_height, home_bits);
u8g.drawXBM( 36, 2, icon_width, icon_height, out_bits);
u8g.drawXBM( 53, 2, icon_width, icon_height, unu_bits);
u8g.drawXBM( 70, 2, icon_width, icon_height, doi_bits);
u8g.drawXBM( 87, 2, icon_width, icon_height, trei_bits);
u8g.drawFrame(0,22,128,42);
u8g.drawStr( 7, 38, buf);
u8g.drawStr( 7, 58, buf2);
}
int arata2(int temp1, int hum1) {
enum {BufSize=20};
char buf[BufSize];
snprintf (buf, BufSize, "Temp: %d %cC", temp1, 0xB0);
enum {BufSize2=20};
char buf2[BufSize2];
snprintf (buf2, BufSize2, "Hum: %d %%", hum1);
u8g.setFont(u8g_font_7x13);
u8g.drawFrame(0,0,128,20);
u8g.drawXBM( 2, 2, icon_width, icon_height, clock_bits);
u8g.drawXBM( 19, 2, icon_width, icon_height, home2_bits);
u8g.drawXBM( 36, 2, icon_width, icon_height, out_bits);
u8g.drawXBM( 53, 2, icon_width, icon_height, unu_bits);
u8g.drawXBM( 70, 2, icon_width, icon_height, doi_bits);
u8g.drawXBM( 87, 2, icon_width, icon_height, trei_bits);
u8g.drawFrame(0,22,128,42);
u8g.drawStr( 7, 38, buf);
u8g.drawStr( 10, 58, buf2);
}
int arata3(int temp2, int hum2) {
enum {BufSize=20};
char buf[BufSize];
snprintf (buf, BufSize, "Temp: %d %cC", temp2, 0xB0);
enum {BufSize2=20};
char buf2[BufSize2];
snprintf (buf2, BufSize2, "Hum: %d %%", hum2);
u8g.setFont(u8g_font_7x13);
u8g.drawFrame(0,0,128,20);
u8g.drawXBM( 2, 2, icon_width, icon_height, clock_bits);
u8g.drawXBM( 19, 2, icon_width, icon_height, home_bits);
u8g.drawXBM( 36, 2, icon_width, icon_height, out2_bits);
u8g.drawXBM( 53, 2, icon_width, icon_height, unu_bits);
u8g.drawXBM( 70, 2, icon_width, icon_height, doi_bits);
u8g.drawXBM( 87, 2, icon_width, icon_height, trei_bits);
u8g.drawFrame(0,22,128,42);
u8g.drawStr( 7, 38, buf);
u8g.drawStr( 10, 58, buf2);
}
int arata4(int zona1) {
enum {BufSize=20};
char buf[BufSize];
snprintf (buf, BufSize, "Temp: %d %cC", zona1, 0xB0);
u8g.setFont(u8g_font_7x13);
u8g.drawFrame(0,0,128,20);
u8g.drawXBM( 2, 2, icon_width, icon_height, clock_bits);
u8g.drawXBM( 19, 2, icon_width, icon_height, home_bits);
u8g.drawXBM( 36, 2, icon_width, icon_height, out_bits);
u8g.drawXBM( 53, 2, icon_width, icon_height, unu2_bits);
u8g.drawXBM( 70, 2, icon_width, icon_height, doi_bits);
u8g.drawXBM( 87, 2, icon_width, icon_height, trei_bits);
u8g.drawFrame(0,22,128,42);
u8g.drawStr( 7, 38, "Zona 1...");
u8g.drawStr( 7, 58, buf);
}
int arata5(int zona2) {
enum {BufSize=20};
char buf[BufSize];
snprintf (buf, BufSize, "Temp: %d %cC", zona2, 0xB0);
u8g.setFont(u8g_font_7x13);
u8g.drawFrame(0,0,128,20);
u8g.drawXBM( 2, 2, icon_width, icon_height, clock_bits);
u8g.drawXBM( 19, 2, icon_width, icon_height, home_bits);
u8g.drawXBM( 36, 2, icon_width, icon_height, out_bits);
u8g.drawXBM( 53, 2, icon_width, icon_height, unu_bits);
u8g.drawXBM( 70, 2, icon_width, icon_height, doi2_bits);
u8g.drawXBM( 87, 2, icon_width, icon_height, trei_bits);
u8g.drawFrame(0,22,128,42);
u8g.drawStr( 7, 38, "Zona 2...");
u8g.drawStr( 7, 58, buf);
}
int arata6(int zona3) {
enum {BufSize=20};
char buf[BufSize];
snprintf (buf, BufSize, "Temp: %d %cC", zona3, 0xB0);
u8g.setFont(u8g_font_7x13);
u8g.drawFrame(0,0,128,20);
u8g.drawXBM( 2, 2, icon_width, icon_height, clock_bits);
u8g.drawXBM( 19, 2, icon_width, icon_height, home_bits);
u8g.drawXBM( 36, 2, icon_width, icon_height, out_bits);
u8g.drawXBM( 53, 2, icon_width, icon_height, unu_bits);
u8g.drawXBM( 70, 2, icon_width, icon_height, doi_bits);
u8g.drawXBM( 87, 2, icon_width, icon_height, trei2_bits);
u8g.drawFrame(0,22,128,42);
u8g.drawStr( 7, 38, "Zona 3...");
u8g.drawStr( 7, 58, buf);
}
void clearLCD(){
u8g.firstPage();
do {
} while( u8g.nextPage() );
}
void setup(void) {
u8g.setColorIndex(1);
u8g.firstPage();
do {
u8g.drawFrame(0,0,128,64);
ecran1();
} while( u8g.nextPage() );
delay(2000);
clearLCD();
u8g.firstPage();
do {
u8g.drawFrame(0,0,128,64);
u8g.drawFrame(2,2,124,60);
ecran2();
} while( u8g.nextPage() );
delay(2000);
clearLCD();
}
void loop(void) {
u8g.firstPage();
do {
arata1(ora, minut, sec, zi, luna, an);
} while( u8g.nextPage() );
delay(2000);
clearLCD();
u8g.firstPage();
do {
arata2(temp1, hum1);
} while( u8g.nextPage() );
delay(2000);
clearLCD();
u8g.firstPage();
do {
arata3(temp2, hum2);
} while( u8g.nextPage() );
delay(2000);
clearLCD();
u8g.firstPage();
do {
arata4(zona1);
} while( u8g.nextPage() );
delay(2000);
clearLCD();
u8g.firstPage();
do {
arata5(zona2);
} while( u8g.nextPage() );
delay(2000);
clearLCD();
u8g.firstPage();
do {
arata6(zona3);
} while( u8g.nextPage() );
delay(2000);
clearLCD();
}
Rezultatul se poate vedea in ozele de mai jos:






Va urma....