Ulterior, am primit o solicitare sa adaug si numele zilei din saptamana si numele lunii, asa ca am adaugat asta, dar bilingv (o data in romana, o data in engleza),
Bazandu-ma pe ce am testat cu ceasul NTP si termometrul/higrometrul ce folosesc un modul cu afisaj led din 4 caractere a 14 segmente fiecare , am realizat un "ceas NTP si termometru/higrometru".
Schema este aceasi cu cea a termometrului/higrometrului
si, in prima faza, indicatiile sunt simple:
- ceas, cu secunda clipitoare (bate secunda)
- numele zilei (o data in engleza, o data in romana), cu text deplasabil din dreapta in stanga
Masurare temperaturi in 2 zone si afisare pe ecran de Nokia 3410
De data aceasta voi combina modulul cu cei 2 senzori de temperatura LM335 si modul de interfatare a afisajului de Nokia 3410 la o placa Arduino. Deoarece textul clasic pe afisaj e mic, voi folosi libraria grafica u8glib pentru a putea citi de la distanta temperatura.
// version 1m0 - 2013.10.22, 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// 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,95,65);
// pun un font maricel
u8g.setFont(u8g_font_unifont);
//u8g.setFont(u8g_font_osb21);
u8g.drawStr( 6, 15, "Termometru");
// u8g.setFont(u8g_font_unifont);
u8g.setFont(u8g_font_6x10);
u8g.drawStr( 6, 26, "dublu cu LM335");
u8g.setFont(u8g_font_5x7);
u8g.drawStr( 9, 38, "ecran Nokia 3410");
u8g.drawStr( 3, 60, "realizat de niq_ro");
u8g.setFont(u8g_font_6x10);
u8g.drawStr( 9, 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
}
Apoi am conectat si placuta cu LED-ul multicolor pentru a face un indicator de confort, ca si in articolul Termometru dublu cu LM335Z si un afisaj LCD cu 16 coloane si 2 randuri (II) schimband si modul de conectare al afisajului, deoarece aveam ocupate iesirile digitale de la 8 la 13 cu placuta cu LED multicolor...
F.F.important: cand se fac masuratori si avem si afisaje cu lumina de fundal, cabluri prelungitoare pentru USB o sa avem masuratori eronate, deoarece tensiunea de 5V scade mult si, odata cu ea, tensiunea de referinta, asa ca folositi si un alimentator...
25.10.2013 Am facut alte poze pentru cele 3 situatii: - prea rece in camera (temperatura mai mica de 190C)
si m-am gandit sa fac un "indicator de confort", sa zic asa, adica voi aprinde LED-ul albastru cand este temperatura mai scazuta decat 19 grade Celsius, pe cel verde cand este intre 19 si 26 grade, iar cel rosu daca temperatura este mai mare de 26 grade Celsius.
Schema de conectare este simpla, combinatia celei de masurare:
cu cea de afisare cu LED multicolor (RGB):
Sketch-ul deriva din cel de masurare a 2 temperaturi:
/*
original sketch by niq_ro (Nicu FLORICA) from http://nicuflorica.blogspot.comversion 1.6program original scris de mine (niq_ro) versiunea 1.6..............................................................*/
#include <LiquidCrystal.h>
// folosesc libraria pentru afisaje LCD simpleLiquidCrystal lcd(7, 6, 5, 4, 3, 2);
// indic modul de legare, vezi mai jos:/* ------------------- | LCD | Arduino | ------------------- LCD RS pin to digital pin 7 | RS | D7 | LCD Enable pin to digital pin 6 | E | D6 | LCD D4 pin to digital pin 5 | D4 | D5 | LCD D5 pin to digital pin 4 | D5 | D4 | LCD D6 pin to digital pin 3 | D6 | D3 | LCD D7 pin to digital pin 2 | D7 | D2 | LCD R/W pin to ground | R/W | GND | -------------------*/// http://arduino.cc/en/Reference/LiquidCrystalCreateCharbyte 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] = {
B01100,
B10010,
B10010,
B01100,
B00000,
B00000,
B00000,
};
byte copac12[8] = {
B00111,
B01000,
B10101,
B10010,
B01000,
B00111,
B00001,
B00001,
};
byte copac22[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 = A1; // output from second LM335 is put at analog input no.1// cei 2 senzori de temperaturia LM335 sunt legati la pinii A0 si A1// other int led = 13; //pin for LEDint ledr = 11; //pin for red LEDint leda = 10; //pin for blue LEDint ledv = 9; //pin for green LEDvoidsetup() {
lcd.createChar(0, grad);
lcd.createChar(1, home13);
lcd.createChar(2, home23);
lcd.createChar(3, home33);
lcd.createChar(4, home03);
lcd.createChar(5, copac12);
lcd.createChar(6, copac22);
lcd.begin(16, 2); // set up the LCD's number of columns and rows: pinMode(led, OUTPUT);
lcd.clear(); // clear the screen
lcd.setCursor(0, 0); // put cursor at colon 2 and row 0 = left/up
lcd.print("dual thermometer"); // print a text
lcd.setCursor(1, 1); // put cursor at colon 0 and row 0 = left/down
lcd.print("1.6 by niq_ro"); // print a textdelay (2000);
lcd.clear(); // clear the screen
} // END void setupvoidloop(){
digitalWrite(led, HIGH);
// 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 -2.0 ; // average and corrected temperature
t22 = t21/5.0 -1.0; // average and corrected temperature /*t1 = analogRead(temperaturePin1); // read value from temperature from first sensor (LM335);t2 = analogRead(temperaturePin2); // read value from temperature from first sensor (LM335);t10 = (100.0*(5.0*t1/1023.0-2.980)+25.0)-1.0;t20 = (100.0*(5.0*t2/1023.0-2.980)+25.0);*/analogWrite(ledr, 0);
analogWrite(leda, 0);
analogWrite(ledv, 0);
lcd.setCursor(3, 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(3, 1);
// lcd.print("ext:");
lcd.write(byte(5));
lcd.write(byte(6));
lcd.print(":");
// 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");
digitalWrite(led, LOW);
// temperature leds indicatorif (t12<=19.0) analogWrite(leda, 255);
if ((t12>19.0) and (t12<26.0)) analogWrite(ledv, 255);
if (t12>=26.0) analogWrite(ledr, 255);
delay(500);
lcd.setCursor(4, 0);
lcd.write(byte(2));
}