Daca am putut face cu microcontroleul ATtiny85 un termometru dublu cu afisare pe ecran alfanumeric LCD1602 prin intermediul unui registru de deplasare 74HC595, m-am gandit ca pot sa am si indicarea tensiunii bateriei unei masini si astfel sa am indicatii despre temperatura din exterior si cea din interior, asta daca pot folosi pinul fizic 1, RESET, dar si ADC0 (A0), dupa cum e prezentat pe site-ul http://www.pighixxx.com/
In cel mai rau caz, voi renunta la temperatura din interior... Schema gandita de mine deriva din cea a termometrului dublu la care am adaugat un divizor rezistiv cu raport de 1:4 (tensiune maxima de intrare de 20V), cum am facut la indicarul starii bateriei masinii cu led multicolor.
Trebuie sa schimb pictogramele, iar afisarea sa fie ceva de genul:
Pictogramele vor fi de genul:
- baterie:
- temperatura interior (masina):
- temperatura exterior (un copac):
Sketch-ul pe care l-am gandit si de care am fost multumit:
/*this sketch is adapted by niq_ro fromhttp://www.tehnic.go.rohttp://www.niqro.3x.rohttp://nicuflorica.blogspot.ro/http://arduinotehniq.blogspot.com/for made a dual thermometer & battery status for car with ATtiny85 as Arduino.. * 3-pin Arduino interface for HD44780 LCDs via 74HC595 Shift Register * by Rowan Simms code@rowansimms.com * License: Creative Commons - Attribution. * Full Documentation and Description: http://rowansimms.com/article.php/lcd-hookup-in-seconds * * This sketch allows Arduinos to use a shift register to control an LCD, allowing * a reduction in pins it requires from 6 to 3 while still retaining full control * including backlight on/off. * This requires the use of the LiquidCrystal595 library * available at: http://code.google.com/p/arduino-lcd-3pin/ */
#include <LiquidCrystal595.h> // include the library
LiquidCrystal595 lcd(0,1,2); // datapin, latchpin, clockpinbyte baterie1[8] = {
B00000,
B01100,
B11111,
B10000,
B10000,
B10000,
B10000,
B11111,
};
byte baterie2[8] = {
B00000,
B00110,
B11111,
B00001,
B00001,
B00001,
B00001,
B11111,
};
byte masina1[8] = {
B00111,
B01000,
B01111,
B10110,
B10000,
B11111,
B01100,
B01100
};
byte masina2[8] = {
B11100,
B00010,
B11110,
B01101,
B00001,
B11111,
B00110,
B00110
};
byte grad[8] = {
B01110,
B10001,
B10001,
B01110,
B00000,
B00000,
B00000,
};
byte pom1[8] = {
B00111,
B01000,
B10101,
B10010,
B10000,
B01111,
B00001,
B00001
};
byte pom2[8] = {
B11000,
B00110,
B10101,
B01001,
B00010,
B11100,
B10000,
B10000
};
// variables // variabile int t1, t2;
float t10, t20;
float t11, t21;
float t12, t22;
int temperaturePin1 = A0; // output from first LM335 is put at analog input no.0int temperaturePin2 = A3; // output from second LM335 is put at analog input no.1// cei 2 senzori de temperaturia LM335 sunt legati la pinii A0 si A1int divbaterie = A2; //the input pin for voltage dividerint u = 0; // variable to store the value coming from the sensorfloat k=4.90/5; // corection voltage (real voltage after 7805 output)float k1 = k; // real divider correctionfloat u1 = 0; // voltage on batteryfloat divizor = 0.25; // divider raportvoidsetup() {
lcd.begin(16,2); // 16 characters, 2 rows
lcd.createChar(0, grad);
lcd.createChar(1, baterie1);
lcd.createChar(2, baterie2);
lcd.createChar(3, masina1);
lcd.createChar(4, masina2);
lcd.createChar(5, pom1);
lcd.createChar(6, pom2);
lcd.clear(); // clear the screen
lcd.setCursor(2, 0); // put cursor at colon 2 and row 0 = left/up
lcd.print("ATtiny85 dual"); // print a text
lcd.setCursor(2, 1); // put cursor at colon 0 and row 0 = left/down
lcd.print("thermometer +"); // print a textdelay (3000);
lcd.clear(); // clear the screen
lcd.setCursor(0, 0); // put cursor at colon 2 and row 0 = left/up
lcd.print("+ battery status"); // print a text
lcd.setCursor(4, 1); // put cursor at colon 0 and row 0 = left/down
lcd.print("by niq_ro"); // print a textdelay (3000);
lcd.clear(); // clear the screen
}
voidloop() {
// Read and store Sensor Data
t11=0;
t21=0;
//lcd.clear(); // clear the screenfor (int x=1; x <= 5; x++)
{
// calculate the value
t1 = analogRead(temperaturePin1); // read value from temperature from first sensor (LM335);
t10 = 100.0*(k*5.0*t1/1023-2.980)+25.0;
t11 = t10 + t11;
t2 = analogRead(temperaturePin2); // read value from temperature from second sensor (LM335);
t20 = 100.0*(k*5.0*t2/1023-2.980)+25.0;
t21 = t20 + t21;
delay (500);
}
t12 = t11/5.0 -1.5 ; // average and corrected temperature
t22 = t21/5.0 -1.0; // average and corrected temperature
lcd.setCursor(0, 0);
lcd.write(byte(3));
lcd.write(byte(4));
lcd.print(":");
// lcd.print("t1="); if (t12<10) lcd.print(" ");
if (t12>0.0) lcd.print("+");
lcd.print(t12,1);
// lcd.write(0b11011111);
lcd.write(byte(0));
lcd.print("C ");
lcd.setCursor(0, 1);
// lcd.print("ext:");// lcd.print("t2=");
lcd.write(byte(5));
lcd.write(byte(6));
lcd.print(":");
if (t22<10) lcd.print(" ");
if (t22>0.0) lcd.print("+");
lcd.print(t22,1);
// lcd.write(0b11011111);
lcd.write(byte(0));
lcd.print("C ");
// read the value from the sensor:
u = analogRead(divbaterie);
u1 = k1*5.0*u/1023.0; // conver ADC in voltage value
u1 = u1/divizor+0.05;
lcd.setCursor(14, 0);
lcd.write(byte(1));
lcd.write(byte(2));
lcd.setCursor(11, 1);
if (u1<10) lcd.print(" ");
lcd.print(u1,1);
lcd.print("V");
}
Ca marime, el nu este foarte mare fata de cel care avea doar termometru dublu:
Am realizat montajul si am comparat cu un multimetru:
Dupa ce am reusit sa "aprind" cu un ATtiny85 un afisaj alfanumeric LCD1602 prin intermediul unui registru de deplasare 74HC595, am zis sa fac si ceva util cu el. Am incercat pentru inceput sa preiau informatiile de la un senzor de uniditate si tenmperatura DHT11, dar nu am am reusit, apoi am incercat cu senzori de temperatura DS18B20 si rezultat negativ, asa ca am folosit placuta mea cu 2 senzori analogici LM335, pe care i-am folosit in proiecte anterioare cu Arduino, unul fiind cel prezentat in articolul Termometru dublu cu LM335Z si un afisaj LCD cu 16 coloane si 2 randuri
Placuta cu cei 2 senzori LM335 are schema:
in care IC1 este senzorul de interior, care va fi conectat la A2 (pinul fizic 3 al lui ATtiny85), iar IC2 este senzorul de exterior, care va fi conectat la A3 (pinul fizic 2 al lui ATtiny85).
Schema de conectare a lui ATtiny85 la afisaj este cea din articolul anterior:
Montajul de test arata asa:
si are in partea din stanga jos un breadboad micut pe care se afla placa Arduino Nano, folosita la programare, si ATtiny85,
acolo se afla si placuta adaptoare pentru cei 2 senzori, apoi este bradboard-ul mai mare pe care se gaseste registrul de deplasare 74HC595, mai sus se vede transformatorul de retea cu stabilizatorul de tensiune cu LM317 reglat la 5V si afisajul alfanumeric..
De retinut: deoarece la senzorii analogici se compara tensiunea de pe intrare la care sunt conectati cu tensiunea de referinta si daca aceasta este tensiunea de 5V, la alimentarea din USB-ul unui calculator, din cauza consumului mare, citirile pot fi eronate, de aceea trebuie folosita o tensiune stabilizata de 5V.
- alimentare cu tensiune de 5V stabilizata:
- alimentare combinata (USB si stabilizator):
- alimentare doar din USB:
Ca si la testele anterioare cu DHT11 si DS18B20, la compilare pentru ATtiny85 la 1MHz, primeam un mesaj de eroare:
Dupa schimbarea placii la Arduino Uno, am constatat ca sketch-urile sunt mai mari de 4k si... am gasit pe net ca trebuie actualizat WinAVR-ul folosit de programul Arduino IDE... (toti pasii ce trebuie urmati sunt prezentati pe forumul Arduino in discutia http://forum.arduino.cc/index.php/topic,60649.0.html, eu nu am mai facut schimbari in fisierul avrdude.conf ).
Dupa aceasta, compilarea este fara erori:
Sketch-ul scris de mine este:
/*this sketch is adapted by niq_ro fromhttp://www.tehnic.go.rohttp://www.niqro.3x.rohttp://nicuflorica.blogspot.ro/http://arduinotehniq.blogspot.com/for made a dual thermometer with ATtiny85 as Arduino.. * 3-pin Arduino interface for HD44780 LCDs via 74HC595 Shift Register * by Rowan Simms code@rowansimms.com * License: Creative Commons - Attribution. * Full Documentation and Description: http://rowansimms.com/article.php/lcd-hookup-in-seconds * * This sketch allows Arduinos to use a shift register to control an LCD, allowing * a reduction in pins it requires from 6 to 3 while still retaining full control * including backlight on/off. * This requires the use of the LiquidCrystal595 library * available at: http://code.google.com/p/arduino-lcd-3pin/ */
#include <LiquidCrystal595.h> // include the library
LiquidCrystal595 lcd(0,1,2); // datapin, latchpin, clockpinbyte home13[8] = {
B00011,
B00100,
B01000,
B11111,
B01000,
B01000,
B01111,
};
byte home23[8] = {
B00000,
B10110,
B01110,
B11111,
B00100,
B00100,
B11100,
};
byte home33[8] = {
B00011,
B10110,
B01110,
B11111,
B00100,
B00100,
B11100,
};
byte home03[8] = {
B11111,
B00000,
B00000,
B11111,
B00000,
B00000,
B11111,
};
byte grad[8] = {
B01110,
B10001,
B10001,
B01110,
B00000,
B00000,
B00000,
};
// variables // variabile int t1, t2;
float t10, t20;
float t11, t21;
float t12, t22;
int temperaturePin1 = A2; // output from first LM335 is put at analog input no.0int temperaturePin2 = A3; // output from second LM335 is put at analog input no.1// cei 2 senzori de temperaturia LM335 sunt legati la pinii A0 si A1voidsetup() {
lcd.begin(16,2); // 16 characters, 2 rows
lcd.createChar(0, grad);
lcd.createChar(1, home13);
lcd.createChar(2, home23);
lcd.createChar(3, home33);
lcd.createChar(4, home03);
lcd.clear(); // clear the screen
lcd.setCursor(2, 0); // put cursor at colon 2 and row 0 = left/up
lcd.print("ATtiny85 dual"); // print a text
lcd.setCursor(1, 1); // put cursor at colon 0 and row 0 = left/down
lcd.print("thermometer 1.0"); // print a textdelay (3000);
lcd.clear(); // clear the screen
}
voidloop() {
// Read and store Sensor Data
t11=0;
t21=0;
//lcd.clear(); // clear the screenfor (int x=1; x <= 5; x++)
{
// calculate the value
t1 = analogRead(temperaturePin1); // read value from temperature from first sensor (LM335);
t10 = 100.0*(5.0*t1/1023-2.980)+25.0;
t11 = t10 + t11;
t2 = analogRead(temperaturePin2); // read value from temperature from second sensor (LM335);
t20 = 100.0*(5.0*t2/1023-2.980)+25.0;
t21 = t20 + t21;
delay (500);
}
t12 = t11/5.0 -1.5 ; // average and corrected temperature
t22 = t21/5.0 -1.0; // average and corrected temperature
lcd.setCursor(2, 0);
lcd.write(byte(1));
lcd.write(byte(4));
lcd.write(byte(3));
lcd.print(":");
// lcd.print("t1="); if (t12<10) lcd.print(" ");
if (t12>0.0) lcd.print("+");
lcd.print(t12,1);
// lcd.write(0b11011111);
lcd.write(byte(0));
lcd.print("C ");
lcd.setCursor(2, 1);
lcd.print("ext:");
// lcd.print("t2="); if (t22<10) lcd.print(" ");
if (t22>0.0) lcd.print("+");
lcd.print(t22,1);
// lcd.write(0b11011111);
lcd.write(byte(0));
lcd.print("C ");
delay(500);
lcd.setCursor(4, 0);
lcd.write(byte(2));
}
Avand in vedere ca libraria grafica u8glib este foarte buna, iar sketch-urile scrise pentru afisajul de Nokia 3410 se pot adapta usor pentru LCD12864, deoarece rezolutia celui de Nokia 3410 este 95x64, iar a celuilalt este 128x64.
Initial, am folosit un breadboard pentru a face repede testele, apoi am folosit doar modulul cu 2 senzori pentru conectarea afisajului si a placii Arduino:
Sketch-ul folosit, adaptat dupa cel folosit la afisajul de Nokia 3410 este:
// original sketch by niq_ro from http://nicuflorica.blogspot.com for dual thermometer with LM335// version 1m0 for Nokia 3410 LCD - 2013.10.22, Craiova - Romania// version 1m0 for LCD12864 with ST7920 - 2014.06.19, Craiova - Romania// Universal 8bit Graphics Library, http://code.google.com/p/u8glib/// Copyright (c) 2012, olikraus@gmail.com// All rights reserved.
#include "U8glib.h"// ecran de Nokia 3410//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8// ecran LCD12864 cu ST7920
U8GLIB_ST7920_128X64_1X u8g(6, 5, 4 ,7); //Enable, RW, RS, RESET // temperaturiint t1, t2;
float t10, t20;
float t11, t21;
float t12, t22;
int temperaturePin1 = A0; // output from first LM335 is put at analog input no.0int temperaturePin2 = A1; // output from second LM335 is put at analog input no.1// cei 2 senzori de temperaturia LM335 sunt legati la pinii A0 si A1void subrutina0(void) {
// pictez un chenar
u8g.drawFrame(0,0,127,63);
// pun un font maricel
u8g.setFont(u8g_font_unifont);
//u8g.setFont(u8g_font_osb21);
u8g.drawStr( 20, 15, "Termometru");
// u8g.setFont(u8g_font_unifont);
u8g.setFont(u8g_font_6x10);
u8g.drawStr( 20, 26, "dublu cu LM335");
u8g.setFont(u8g_font_5x7);
u8g.drawStr( 6, 38, "ecran LCD12864 (ST7920)");
u8g.drawStr( 20, 60, "realizat de niq_ro");
u8g.setFont(u8g_font_6x10);
u8g.drawStr( 25, 50, "versiunea 1.0");
}
// void subrutinat1(uint8_t t101)void subrutinat1(int t101)
{
char s[2] = " ";
// folosesc font mare, pentru a vedea de la distanta
u8g.setFont(u8g_font_10x20);
u8g.drawStr(4, 15, "t :");
// folosesc font mic pentru indice
u8g.setFont(u8g_font_7x14);
u8g.drawStr(15, 18, "ext");
/* if (t101=0) { // schimb semnuls[0]=48; // transform cifrele in caractere ASCIIu8g.setFont(u8g_font_10x20); u8g.drawStr(25, 32, "0.0");// u8g.drawStr(58, 32, s); }else*/if (t101<10 & t101>0)
{
// see http://www.asciitable.com/
s[0]=t101+48; // transform cifrele in caractere ASCII
u8g.setFont(u8g_font_10x20);
u8g.drawStr(25, 32, "+0.");
u8g.drawStr(58, 32, s);
}
elseif (t101<100 & t101>=10)
{
// afla cifra unitatilor
s[0]=int(t101/10)+48;
u8g.setFont(u8g_font_10x20);
u8g.drawStr(25, 32, "+");
u8g.drawStr(40, 32, s);
u8g.drawStr(48, 32, ".");
// afla cifra dupa virgula
s[0]=t101-10*int(t101/10)+48;
u8g.drawStr(58, 32, s);
}
elseif (t101>=100)
{
// afla cifra zecilor
s[0]=int(t101/100)+48;
u8g.setFont(u8g_font_10x20);
u8g.drawStr(18, 32, "+");
u8g.drawStr(28, 32, s);
// afla numarul de la unitati in jos
t101 = t101-100*int(t101/100);
s[0]=int(t101/10)+48;
u8g.drawStr(38, 32, s);
// afla cifra dupa virgula
u8g.drawStr(48, 32, ".");
s[0]=t101-10*int(t101/10)+48;
u8g.drawStr(58, 32, s);
}
elseif (t101>-10 & t101<0)
{
// schimb semnul
t101 = -t101;
s[0]=t101+48; // transform cifrele in caractere ASCII
u8g.setFont(u8g_font_10x20);
u8g.drawStr(28, 32, "-0.");
u8g.drawStr(58, 32, s);
}
elseif (t101>-100 & t101<10)
{
// schimb semnul
t101 = -t101;
// aflu cifra unitatilor
s[0]=int(t101/10)+48; // transform cifrele in caractere ASCII
u8g.setFont(u8g_font_10x20);
u8g.drawStr(28, 32, "-");
u8g.drawStr(38, 32, s);
u8g.drawStr(48, 32, ".");
// aflu cifra dupa virgula
s[0]=t101-10*int(t101/10)+48; // transform cifrele in caractere ASCII
u8g.drawStr(58, 32, s);
}
elseif (t101<=100)
{
// schimb semnul
t101=-t101;
// afla cifra zecilor
s[0]=int(t101/100)+48;
u8g.setFont(u8g_font_10x20);
u8g.drawStr(18, 32, "-");
u8g.drawStr(28, 32, s);
// afla numarul de la unitati in jos
t101 = t101-100*int(t101/100);
s[0]=int(t101/10)+48;
u8g.drawStr(38, 32, s);
// afla cifra dupa virgula
u8g.drawStr(48, 32, ".");
s[0]=t101-10*int(t101/10)+48;
u8g.drawStr(58, 32, s);
}
// afisez grade Celsius
u8g.setFont(u8g_font_10x20);
u8g.drawStr(70, 26, "o");
u8g.drawStr(80, 32, "C");
}
// void subrutinat2(uint8_t t102)void subrutinat2(int t102)
{
char s[2] = " ";
// folosesc font mare, pentru a vedea de la distanta
u8g.setFont(u8g_font_10x20);
u8g.drawStr(4, 45, "t :");
// folosesc font mic pentru indice
u8g.setFont(u8g_font_7x14);
u8g.drawStr(15, 48, "int");
/*if (t102=0) { s[0]=48; // transform cifrele in caractere ASCIIu8g.setFont(u8g_font_10x20); u8g.drawStr(25, 32, "0.0");// u8g.drawStr(58, 32, s); }else*/if (t102<10 & t102>0)
{
// see http://www.asciitable.com/
s[0]=t102+48; // transform cifrele in caractere ASCII
u8g.setFont(u8g_font_10x20);
u8g.drawStr(25, 62, "+0.");
u8g.drawStr(58, 62, s);
}
elseif (t102<100 & t102>=10)
{
// afla cifra unitatilor
s[0]=int(t102/10)+48;
u8g.setFont(u8g_font_10x20);
u8g.drawStr(25, 62, "+");
u8g.drawStr(40, 62, s);
u8g.drawStr(48, 62, ".");
// afla cifra dupa virgula
s[0]=t102-10*int(t102/10)+48;
u8g.drawStr(58, 62, s);
}
elseif (t102>=100)
{
// afla cifra zecilor
s[0]=int(t102/100)+48;
u8g.setFont(u8g_font_10x20);
u8g.drawStr(18, 62, "+");
u8g.drawStr(28, 62, s);
// afla numarul de la unitati in jos
t102 = t102-100*int(t102/100);
s[0]=int(t102/10)+48;
u8g.drawStr(38, 62, s);
// afla cifra dupa virgula
u8g.drawStr(48, 62, ".");
s[0]=t102-10*int(t102/10)+48;
u8g.drawStr(58, 62, s);
}
elseif (t102>-10 & t102<0)
{
// schimb semnul
t102 = -t102;
s[0]=t102+48; // transform cifrele in caractere ASCII
u8g.setFont(u8g_font_10x20);
u8g.drawStr(28, 62, "-0.");
u8g.drawStr(58, 62, s);
}
elseif (t102>-100 & t102<10)
{
// schimb semnul
t102 = -t102;
// aflu cifra unitatilor
s[0]=int(t102/10)+48; // transform cifrele in caractere ASCII
u8g.setFont(u8g_font_10x20);
u8g.drawStr(28, 62, "-");
u8g.drawStr(38, 62, s);
u8g.drawStr(48, 62, ".");
// aflu cifra dupa virgula
s[0]=t102-10*int(t102/10)+48; // transform cifrele in caractere ASCII
u8g.drawStr(58, 62, s);
}
elseif (t102<=100)
{
// schimb semnul
t102=-t102;
// afla cifra zecilor
s[0]=int(t102/100)+48;
u8g.setFont(u8g_font_10x20);
u8g.drawStr(18, 62, "-");
u8g.drawStr(28, 62, s);
// afla numarul de la unitati in jos
t102 = t102-100*int(t102/100);
s[0]=int(t102/10)+48;
u8g.drawStr(38, 62, s);
// afla cifra dupa virgula
u8g.drawStr(48, 62, ".");
s[0]=t102-10*int(t102/10)+48;
u8g.drawStr(58, 62, s);
}
// afisez grade Celsius
u8g.setFont(u8g_font_10x20);
u8g.drawStr(70, 56, "o");
u8g.drawStr(80, 62, "C");
}
voidsetup(void) {
// flip screen, if required// u8g.setRot180();// set SPI backup if required//u8g.setHardwareBackup(u8g_backup_avr_spi);// assign default color valueif ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
u8g.setColorIndex(255); // white
}
elseif ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
u8g.setColorIndex(3); // max intensity
}
elseif ( u8g.getMode() == U8G_MODE_BW ) {
u8g.setColorIndex(1); // pixel on
}
elseif ( u8g.getMode() == U8G_MODE_HICOLOR ) {
u8g.setHiColorByRGB(255,255,255);
}
// parte de prezentare
u8g.firstPage();
do {
subrutina0(); // unde e mesajul de intampinare
} while( u8g.nextPage() );
delay(3000);
}
voidloop(void) {
// Read and store Sensor Data
t11=0;
t21=0;
//lcd.clear(); // clear the screenfor (int x=1; x <= 5; x++)
{
// calculate the value
t1 = analogRead(temperaturePin1); // read value from temperature from first sensor (LM335);
t10 = 100.0*(5.0*t1/1023-2.980)+25.0;
t11 = t10 + t11;
t2 = analogRead(temperaturePin2); // read value from temperature from second sensor (LM335);
t20 = 100.0*(5.0*t2/1023-2.980)+25.0;
t21 = t20 + t21;
delay (500);
}
t12 = t11/5.0 -1.0 ; // calculez media si fac corectie
t22 = t21/5.0 -2.0; // calculez media si fac corectie float t123=10*t12; // inmultesc cu 10 ca sa pot face afisareafloat t223=10*t22;
/* // fac teste de afisare a primei temperaturiint t1=-765; // atentie temperatura este inmultita cu 10...int t2=0.1; // atentie temperatura este inmultita cu 10...*/
{
u8g.firstPage(); // incepere parte de graficado { // face asta pana termina ce e in subrutina de desenat
subrutinat1(t123); // munceste la ce e in subrutinat1
subrutinat2(t223); // munceste la ce e in subrutinat1
} while( u8g.nextPage() ); // pana o terminadelay(1000); // sta o secunda
}
delay(2000); // sta 2 secunde
}
Ulterior, m-am mai "jucat" cu grafica si am desenat un termometru, care indicate grafic temperatura pe stanga pentru temperatura exterioatra si pe dreapta pe cea interioara:
Pentru a pastra gama de temperatura indicata grafic pe domeniu mare (de la -300C pana la +600C) si a nu aparea eronat reprezentat, am scos liniutele care indicau temperaturile din 10 in 100C):
Sketch-ul pentru ultima varianta este:
// original sketch by niq_ro from http://nicuflorica.blogspot.com for dual thermometer with LM335// version 1m0 - 2013.10.22, Craiova - Romania, for Nokia 3410 LCD// version 1m1m1 - 2014.06.20, Craiova - Romania, for LCD12864 with ST7920// Universal 8bit Graphics Library, http://code.google.com/p/u8glib/// Copyright (c) 2012, olikraus@gmail.com// All rights reserved.
#include "U8glib.h"// ecran de Nokia 3410//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8// ecran LCD12864 cu ST7920
U8GLIB_ST7920_128X64_1X u8g(6, 5, 4 ,7); //Enable, RW, RS, RESET // temperaturiint t1, t2;
float t10, t20;
float t11, t21;
float t12, t22;
int temperaturePin1 = A0; // output from first LM335 is put at analog input no.0int temperaturePin2 = A1; // output from second LM335 is put at analog input no.1// cei 2 senzori de temperaturia LM335 sunt legati la pinii A0 si A1void subrutina0(void) {
// pictez un chenar
u8g.drawFrame(0,0,127,63);
// pun un font maricel
u8g.setFont(u8g_font_unifont);
//u8g.setFont(u8g_font_osb21);
u8g.drawStr( 20, 15, "Termometru");
// u8g.setFont(u8g_font_unifont);
u8g.setFont(u8g_font_6x10);
u8g.drawStr( 20, 26, "dublu cu LM335");
u8g.setFont(u8g_font_5x7);
u8g.drawStr( 6, 38, "ecran LCD12864 (ST7920)");
u8g.drawStr( 20, 60, "realizat de niq_ro");
u8g.setFont(u8g_font_6x10);
u8g.drawStr( 25, 50, "versiunea 1.1.1");
}
// void subrutinat1(uint8_t t101)void subrutinat1(int t101)
{
char s[2] = " ";
// folosesc font mare, pentru a vedea de la distanta
u8g.setFont(u8g_font_10x20);
u8g.drawStr(4, 15, "t :");
// folosesc font mic pentru indice
u8g.setFont(u8g_font_7x14);
u8g.drawStr(15, 18, "ext");
/* if (t101=0) { // schimb semnuls[0]=48; // transform cifrele in caractere ASCIIu8g.setFont(u8g_font_10x20); u8g.drawStr(25, 32, "0.0");// u8g.drawStr(58, 32, s); }else*/if (t101<10 & t101>0)
{
// see http://www.asciitable.com/
s[0]=t101+48; // transform cifrele in caractere ASCII
u8g.setFont(u8g_font_10x20);
u8g.drawStr(25, 32, "+0.");
u8g.drawStr(58, 32, s);
}
elseif (t101<100 & t101>=10)
{
// afla cifra unitatilor
s[0]=int(t101/10)+48;
u8g.setFont(u8g_font_10x20);
u8g.drawStr(25, 32, "+");
u8g.drawStr(40, 32, s);
u8g.drawStr(48, 32, ".");
// afla cifra dupa virgula
s[0]=t101-10*int(t101/10)+48;
u8g.drawStr(58, 32, s);
}
elseif (t101>=100)
{
// afla cifra zecilor
s[0]=int(t101/100)+48;
u8g.setFont(u8g_font_10x20);
u8g.drawStr(18, 32, "+");
u8g.drawStr(28, 32, s);
// afla numarul de la unitati in jos
t101 = t101-100*int(t101/100);
s[0]=int(t101/10)+48;
u8g.drawStr(38, 32, s);
// afla cifra dupa virgula
u8g.drawStr(48, 32, ".");
s[0]=t101-10*int(t101/10)+48;
u8g.drawStr(58, 32, s);
}
elseif (t101>-10 & t101<0)
{
// schimb semnul
t101 = -t101;
s[0]=t101+48; // transform cifrele in caractere ASCII
u8g.setFont(u8g_font_10x20);
u8g.drawStr(28, 32, "-0.");
u8g.drawStr(58, 32, s);
}
elseif (t101>-100 & t101<10)
{
// schimb semnul
t101 = -t101;
// aflu cifra unitatilor
s[0]=int(t101/10)+48; // transform cifrele in caractere ASCII
u8g.setFont(u8g_font_10x20);
u8g.drawStr(28, 32, "-");
u8g.drawStr(38, 32, s);
u8g.drawStr(48, 32, ".");
// aflu cifra dupa virgula
s[0]=t101-10*int(t101/10)+48; // transform cifrele in caractere ASCII
u8g.drawStr(58, 32, s);
}
elseif (t101<=100)
{
// schimb semnul
t101=-t101;
// afla cifra zecilor
s[0]=int(t101/100)+48;
u8g.setFont(u8g_font_10x20);
u8g.drawStr(18, 32, "-");
u8g.drawStr(28, 32, s);
// afla numarul de la unitati in jos
t101 = t101-100*int(t101/100);
s[0]=int(t101/10)+48;
u8g.drawStr(38, 32, s);
// afla cifra dupa virgula
u8g.drawStr(48, 32, ".");
s[0]=t101-10*int(t101/10)+48;
u8g.drawStr(58, 32, s);
}
// afisez grade Celsius
u8g.setFont(u8g_font_10x20);
u8g.drawStr(70, 26, "o");
u8g.drawStr(80, 32, "C");
}
// void subrutinat2(uint8_t t102)void subrutinat2(int t102)
{
char s[2] = " ";
// folosesc font mare, pentru a vedea de la distanta
u8g.setFont(u8g_font_10x20);
u8g.drawStr(4, 45, "t :");
// folosesc font mic pentru indice
u8g.setFont(u8g_font_7x14);
u8g.drawStr(15, 48, "int");
/*if (t102=0) { s[0]=48; // transform cifrele in caractere ASCIIu8g.setFont(u8g_font_10x20); u8g.drawStr(25, 32, "0.0");// u8g.drawStr(58, 32, s); }else*/if (t102<10 & t102>0)
{
// see http://www.asciitable.com/
s[0]=t102+48; // transform cifrele in caractere ASCII
u8g.setFont(u8g_font_10x20);
u8g.drawStr(25, 62, "+0.");
u8g.drawStr(58, 62, s);
}
elseif (t102<100 & t102>=10)
{
// afla cifra unitatilor
s[0]=int(t102/10)+48;
u8g.setFont(u8g_font_10x20);
u8g.drawStr(25, 62, "+");
u8g.drawStr(40, 62, s);
u8g.drawStr(48, 62, ".");
// afla cifra dupa virgula
s[0]=t102-10*int(t102/10)+48;
u8g.drawStr(58, 62, s);
}
elseif (t102>=100)
{
// afla cifra zecilor
s[0]=int(t102/100)+48;
u8g.setFont(u8g_font_10x20);
u8g.drawStr(18, 62, "+");
u8g.drawStr(28, 62, s);
// afla numarul de la unitati in jos
t102 = t102-100*int(t102/100);
s[0]=int(t102/10)+48;
u8g.drawStr(38, 62, s);
// afla cifra dupa virgula
u8g.drawStr(48, 62, ".");
s[0]=t102-10*int(t102/10)+48;
u8g.drawStr(58, 62, s);
}
elseif (t102>-10 & t102<0)
{
// schimb semnul
t102 = -t102;
s[0]=t102+48; // transform cifrele in caractere ASCII
u8g.setFont(u8g_font_10x20);
u8g.drawStr(28, 62, "-0.");
u8g.drawStr(58, 62, s);
}
elseif (t102>-100 & t102<10)
{
// schimb semnul
t102 = -t102;
// aflu cifra unitatilor
s[0]=int(t102/10)+48; // transform cifrele in caractere ASCII
u8g.setFont(u8g_font_10x20);
u8g.drawStr(28, 62, "-");
u8g.drawStr(38, 62, s);
u8g.drawStr(48, 62, ".");
// aflu cifra dupa virgula
s[0]=t102-10*int(t102/10)+48; // transform cifrele in caractere ASCII
u8g.drawStr(58, 62, s);
}
elseif (t102<=100)
{
// schimb semnul
t102=-t102;
// afla cifra zecilor
s[0]=int(t102/100)+48;
u8g.setFont(u8g_font_10x20);
u8g.drawStr(18, 62, "-");
u8g.drawStr(28, 62, s);
// afla numarul de la unitati in jos
t102 = t102-100*int(t102/100);
s[0]=int(t102/10)+48;
u8g.drawStr(38, 62, s);
// afla cifra dupa virgula
u8g.drawStr(48, 62, ".");
s[0]=t102-10*int(t102/10)+48;
u8g.drawStr(58, 62, s);
}
// afisez grade Celsius
u8g.setFont(u8g_font_10x20);
u8g.drawStr(70, 56, "o");
u8g.drawStr(80, 62, "C");
}
voidsetup(void) {
// flip screen, if required// u8g.setRot180();// set SPI backup if required//u8g.setHardwareBackup(u8g_backup_avr_spi);// assign default color valueif ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
u8g.setColorIndex(255); // white
}
elseif ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
u8g.setColorIndex(3); // max intensity
}
elseif ( u8g.getMode() == U8G_MODE_BW ) {
u8g.setColorIndex(1); // pixel on
}
elseif ( u8g.getMode() == U8G_MODE_HICOLOR ) {
u8g.setHiColorByRGB(255,255,255);
}
// parte de prezentare
u8g.firstPage();
do {
subrutina0(); // unde e mesajul de intampinare
} while( u8g.nextPage() );
delay(3000);
}
voidloop(void) {
// Read and store Sensor Data
t11=0;
t21=0;
//lcd.clear(); // clear the screenfor (int x=1; x <= 5; x++)
{
// calculate the value
t1 = analogRead(temperaturePin1); // read value from temperature from first sensor (LM335);
t10 = 100.0*(5.0*t1/1023-2.980)+25.0;
t11 = t10 + t11;
t2 = analogRead(temperaturePin2); // read value from temperature from second sensor (LM335);
t20 = 100.0*(5.0*t2/1023-2.980)+25.0;
t21 = t20 + t21;
delay (500);
}
t12 = t11/5.0 -1.0 ; // calculez media si fac corectie
t22 = t21/5.0 -2.0; // calculez media si fac corectie float t123=10*t12; // inmultesc cu 10 ca sa pot face afisareafloat t223=10*t22;
/* // fac teste de afisare a primei temperaturiint t1=-765; // atentie temperatura este inmultita cu 10...int t2=0.1; // atentie temperatura este inmultita cu 10...*/
{
u8g.firstPage(); // incepere parte de graficado { // face asta pana termina ce e in subrutina de desenat
subrutinat1(t123); // munceste la ce e in subrutinat1
subrutinat2(t223); // munceste la ce e in subrutinat1
subrutinat(); // afisez termometru
} while( u8g.nextPage() ); // pana o terminadelay(1000); // sta o secunda
}
delay(2000); // sta 2 secunde
}
void subrutinat () {
// pictez un dreptunghi// u8g.drawFrame(108,5,5,52); // (x,y) stanga sus, (dx, dy) - lungimi pe x si pe y
u8g.drawLine(110, 5, 110, 57); // desenez centrul termometrului// desenare cercuri
u8g.drawCircle(110,60,1);
u8g.drawCircle(110,60,2);
u8g.drawCircle(110,60,3);
u8g.drawCircle(110,60,4);
// desenz linii/* for (int g=0; g<10; g++) { int igrec1=10+5*g; u8g.drawLine(107, igrec1, 113, igrec1); }*/
u8g.drawLine(105, 40, 115, 40); // la zero grade Celsius// grafica temperatura pe temometruint tempe = 40 - int(t12/2+0.5);
u8g.drawLine(109, 60, 109, tempe); // linie cu "mercur"int tempi = 40 - int(t22/2+0.5);
u8g.drawLine(111, 60, 111, tempi); // linie cu "mercur"
u8g.setFont(u8g_font_6x10);
u8g.drawStr(117, 43, "0C");
u8g.drawStr(120, 36, ".");
}
Am desenat schema completa, pentru a nu aparea confuzii:
PS: Am modificat ultima varianta prezentata, cu una cu indicatii din 10 in 100C, fara a "intersecta" termometrul...:
21.iunie.2014
Am incercat diferite moduri de afisare, oprindu-ma (cel putin momentan) la varianta de mai jos:
Sketch-ul folosit a ajuns la versiunea 1.1.3:
// original sketch by niq_ro from http://nicuflorica.blogspot.com for dual thermometer with LM335// version 1m0 - 2013.10.22, Craiova - Romania, for Nokia 3410 LCD// version 1m1m3 - 2014.06.21, Craiova - Romania, for LCD12864 with ST7920// Universal 8bit Graphics Library, http://code.google.com/p/u8glib/// Copyright (c) 2012, olikraus@gmail.com// All rights reserved.
#include "U8glib.h"// ecran de Nokia 3410//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8// ecran LCD12864 cu ST7920
U8GLIB_ST7920_128X64_1X u8g(6, 5, 4 ,7); //Enable, RW, RS, RESET // temperaturiint t1, t2;
float t10, t20;
float t11, t21;
float t12, t22;
int temperaturePin1 = A0; // output from first LM335 is put at analog input no.0int temperaturePin2 = A1; // output from second LM335 is put at analog input no.1// cei 2 senzori de temperaturia LM335 sunt legati la pinii A0 si A1void subrutina0(void) {
// pictez un chenar
u8g.drawFrame(0,0,127,63);
// pun un font maricel
u8g.setFont(u8g_font_unifont);
//u8g.setFont(u8g_font_osb21);
u8g.drawStr( 20, 15, "Termometru");
// u8g.setFont(u8g_font_unifont);
u8g.setFont(u8g_font_6x10);
u8g.drawStr( 20, 26, "dublu cu LM335");
u8g.setFont(u8g_font_5x7);
u8g.drawStr( 6, 38, "ecran LCD12864 (ST7920)");
u8g.drawStr( 20, 60, "realizat de niq_ro");
u8g.setFont(u8g_font_6x10);
u8g.drawStr( 20, 50, "versiunea 1.1.3");
}
// void subrutinat1(uint8_t t101)void subrutinat1(int t101)
{
char s[2] = " ";
// folosesc font mare, pentru a vedea de la distanta
u8g.setFont(u8g_font_10x20);
u8g.drawStr(19, 15, "t :");
// folosesc font mic pentru indice
u8g.setFont(u8g_font_7x14);
u8g.drawStr(30, 18, "ext");
/* if (t101=0) { // schimb semnuls[0]=48; // transform cifrele in caractere ASCIIu8g.setFont(u8g_font_10x20); u8g.drawStr(25, 32, "0.0");// u8g.drawStr(58, 32, s); }else*/if (t101<10 & t101>0)
{
// see http://www.asciitable.com/
s[0]=t101+48; // transform cifrele in caractere ASCII
u8g.setFont(u8g_font_10x20);
u8g.drawStr(25, 32, "+0.");
u8g.drawStr(58, 32, s);
}
elseif (t101<100 & t101>=10)
{
// afla cifra unitatilor
s[0]=int(t101/10)+48;
u8g.setFont(u8g_font_10x20);
u8g.drawStr(25, 32, "+");
u8g.drawStr(40, 32, s);
u8g.drawStr(48, 32, ".");
// afla cifra dupa virgula
s[0]=t101-10*int(t101/10)+48;
u8g.drawStr(58, 32, s);
}
elseif (t101>=100)
{
// afla cifra zecilor
s[0]=int(t101/100)+48;
u8g.setFont(u8g_font_10x20);
u8g.drawStr(18, 32, "+");
u8g.drawStr(28, 32, s);
// afla numarul de la unitati in jos
t101 = t101-100*int(t101/100);
s[0]=int(t101/10)+48;
u8g.drawStr(38, 32, s);
// afla cifra dupa virgula
u8g.drawStr(48, 32, ".");
s[0]=t101-10*int(t101/10)+48;
u8g.drawStr(58, 32, s);
}
elseif (t101>-10 & t101<0)
{
// schimb semnul
t101 = -t101;
s[0]=t101+48; // transform cifrele in caractere ASCII
u8g.setFont(u8g_font_10x20);
u8g.drawStr(28, 32, "-0.");
u8g.drawStr(58, 32, s);
}
elseif (t101>-100 & t101<10)
{
// schimb semnul
t101 = -t101;
// aflu cifra unitatilor
s[0]=int(t101/10)+48; // transform cifrele in caractere ASCII
u8g.setFont(u8g_font_10x20);
u8g.drawStr(28, 32, "-");
u8g.drawStr(38, 32, s);
u8g.drawStr(48, 32, ".");
// aflu cifra dupa virgula
s[0]=t101-10*int(t101/10)+48; // transform cifrele in caractere ASCII
u8g.drawStr(58, 32, s);
}
elseif (t101<=100)
{
// schimb semnul
t101=-t101;
// afla cifra zecilor
s[0]=int(t101/100)+48;
u8g.setFont(u8g_font_10x20);
u8g.drawStr(18, 32, "-");
u8g.drawStr(28, 32, s);
// afla numarul de la unitati in jos
t101 = t101-100*int(t101/100);
s[0]=int(t101/10)+48;
u8g.drawStr(38, 32, s);
// afla cifra dupa virgula
u8g.drawStr(48, 32, ".");
s[0]=t101-10*int(t101/10)+48;
u8g.drawStr(58, 32, s);
}
// afisez grade Celsius
u8g.setFont(u8g_font_10x20);
u8g.drawStr(70, 26, "o");
u8g.drawStr(80, 32, "C");
}
// void subrutinat2(uint8_t t102)void subrutinat2(int t102)
{
char s[2] = " ";
// folosesc font mare, pentru a vedea de la distanta
u8g.setFont(u8g_font_10x20);
u8g.drawStr(62, 44, "t :");
// folosesc font mic pentru indice
u8g.setFont(u8g_font_7x14);
u8g.drawStr(73, 47, "int");
/*if (t102=0) { s[0]=48; // transform cifrele in caractere ASCIIu8g.setFont(u8g_font_10x20); u8g.drawStr(25, 32, "0.0");// u8g.drawStr(58, 32, s); }else*/if (t102<10 & t102>0)
{
// see http://www.asciitable.com/
s[0]=t102+48; // transform cifrele in caractere ASCII
u8g.setFont(u8g_font_10x20);
u8g.drawStr(35, 62, "+0.");
u8g.drawStr(68, 62, s);
}
elseif (t102<100 & t102>=10)
{
// afla cifra unitatilor
s[0]=int(t102/10)+48;
u8g.setFont(u8g_font_10x20);
u8g.drawStr(35, 62, "+");
u8g.drawStr(50, 62, s);
u8g.drawStr(58, 62, ".");
// afla cifra dupa virgula
s[0]=t102-10*int(t102/10)+48;
u8g.drawStr(68, 62, s);
}
elseif (t102>=100)
{
// afla cifra zecilor
s[0]=int(t102/100)+48;
u8g.setFont(u8g_font_10x20);
u8g.drawStr(28, 62, "+");
u8g.drawStr(38, 62, s);
// afla numarul de la unitati in jos
t102 = t102-100*int(t102/100);
s[0]=int(t102/10)+48;
u8g.drawStr(48, 62, s);
// afla cifra dupa virgula
u8g.drawStr(58, 62, ".");
s[0]=t102-10*int(t102/10)+48;
u8g.drawStr(68, 62, s);
}
elseif (t102>-10 & t102<0)
{
// schimb semnul
t102 = -t102;
s[0]=t102+48; // transform cifrele in caractere ASCII
u8g.setFont(u8g_font_10x20);
u8g.drawStr(38, 62, "-0.");
u8g.drawStr(68, 62, s);
}
elseif (t102>-100 & t102<10)
{
// schimb semnul
t102 = -t102;
// aflu cifra unitatilor
s[0]=int(t102/10)+48; // transform cifrele in caractere ASCII
u8g.setFont(u8g_font_10x20);
u8g.drawStr(38, 62, "-");
u8g.drawStr(48, 62, s);
u8g.drawStr(58, 62, ".");
// aflu cifra dupa virgula
s[0]=t102-10*int(t102/10)+48; // transform cifrele in caractere ASCII
u8g.drawStr(68, 62, s);
}
elseif (t102<=100)
{
// schimb semnul
t102=-t102;
// afla cifra zecilor
s[0]=int(t102/100)+48;
u8g.setFont(u8g_font_10x20);
u8g.drawStr(28, 62, "-");
u8g.drawStr(38, 62, s);
// afla numarul de la unitati in jos
t102 = t102-100*int(t102/100);
s[0]=int(t102/10)+48;
u8g.drawStr(48, 62, s);
// afla cifra dupa virgula
u8g.drawStr(58, 62, ".");
s[0]=t102-10*int(t102/10)+48;
u8g.drawStr(68, 62, s);
}
// afisez grade Celsius
u8g.setFont(u8g_font_10x20);
u8g.drawStr(80, 56, "o");
u8g.drawStr(90, 62, "C");
}
voidsetup(void) {
// flip screen, if required// u8g.setRot180();// set SPI backup if required//u8g.setHardwareBackup(u8g_backup_avr_spi);// assign default color valueif ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
u8g.setColorIndex(255); // white
}
elseif ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
u8g.setColorIndex(3); // max intensity
}
elseif ( u8g.getMode() == U8G_MODE_BW ) {
u8g.setColorIndex(1); // pixel on
}
elseif ( u8g.getMode() == U8G_MODE_HICOLOR ) {
u8g.setHiColorByRGB(255,255,255);
}
// parte de prezentare
u8g.firstPage();
do {
subrutina0(); // unde e mesajul de intampinare
} while( u8g.nextPage() );
delay(3000);
}
voidloop(void) {
// Read and store Sensor Data
t11=0;
t21=0;
//lcd.clear(); // clear the screenfor (int x=1; x <= 5; x++)
{
// calculate the value
t1 = analogRead(temperaturePin1); // read value from temperature from first sensor (LM335);
t10 = 100.0*(5.0*t1/1023-2.980)+25.0;
t11 = t10 + t11;
t2 = analogRead(temperaturePin2); // read value from temperature from second sensor (LM335);
t20 = 100.0*(5.0*t2/1023-2.980)+25.0;
t21 = t20 + t21;
delay (500);
}
t12 = t11/5.0 -1.0 ; // calculez media si fac corectie
t22 = t21/5.0 -2.0; // calculez media si fac corectie float t123=10*t12; // inmultesc cu 10 ca sa pot face afisareafloat t223=10*t22;
/* // fac teste de afisare a primei temperaturiint t1=-765; // atentie temperatura este inmultita cu 10...int t2=0.1; // atentie temperatura este inmultita cu 10...*/
{
u8g.firstPage(); // incepere parte de graficado { // face asta pana termina ce e in subrutina de desenat
subrutinat1(t123); // munceste la ce e in subrutinat1
subrutinat2(t223); // munceste la ce e in subrutinat1
subrutinat(); // afisez termometru
} while( u8g.nextPage() ); // pana o terminadelay(1000); // sta o secunda
}
delay(2000); // sta 2 secunde
}
void subrutinat () {
// pictez un dreptunghi in dreapta
u8g.drawFrame(109,5,3,52); // (x,y) stanga sus, (dx, dy) - lungimi pe x si pe y// u8g.drawLine(110, 4, 110, 57); // desenez centrul termometrului// desenare cercuri
u8g.drawCircle(110,60,1);
u8g.drawCircle(110,60,2);
u8g.drawCircle(110,60,3);
u8g.drawCircle(110,60,4);
// desenez liniifor (int g=0; g<10; g++)
{
int igrec1=10+5*g;
u8g.drawLine(112, igrec1, 113, igrec1);
u8g.drawLine(108, igrec1, 107, igrec1);
}
u8g.drawLine(105, 40, 115, 40); // la zero grade Celsius// pictez un dreptunghi in stanga
u8g.drawFrame(9,5,3,52); // (x,y) stanga sus, (dx, dy) - lungimi pe x si pe y// u8g.drawLine(110, 4, 110, 57); // desenez centrul termometrului// desenare cercuri
u8g.drawCircle(10,60,1);
u8g.drawCircle(10,60,2);
u8g.drawCircle(10,60,3);
u8g.drawCircle(10,60,4);
// desenez liniifor (int g=0; g<10; g++)
{
int igrec1=10+5*g;
u8g.drawLine(12, igrec1, 13, igrec1);
u8g.drawLine(8, igrec1, 7, igrec1);
}
u8g.drawLine(5, 40, 15, 40); // la zero grade Celsius// grafica temperatura pe temometruint tempe = 40 - int(t12/2+0.5);
u8g.drawLine(10, 60, 10, tempe); // linie cu "mercur"int tempi = 40 - int(t22/2+0.5);
u8g.drawLine(110, 60, 110, tempi); // linie cu "mercur"
u8g.setFont(u8g_font_6x10);
u8g.drawStr(117, 43, "0C");
u8g.drawStr(120, 36, ".");
u8g.drawStr(17, 43, "0C");
u8g.drawStr(20, 36, ".");
u8g.setFont(u8g_font_5x7);
u8g.drawStr(117, 10, "i");
u8g.drawStr(117, 18, "n");
u8g.drawStr(117, 26, "t");
u8g.drawStr(0, 10, "e");
u8g.drawStr(0, 18, "x");
u8g.drawStr(0, 26, "t");
}