Ministatie meteo cu DHT11
Senzorul DTH11 ofera informatii despre temperatura si umiditate, dar nu cu o prea mare precizie, totusi pentru experimente este ok (domeniu de temperatura 0..50oC cu precizie de +2oC, respectiv umiditate 20..90%RH cu o precizie de +5%RH). L-am mai prezentat la inceputurile mele cu Arduino: Ministatie meteo cu senzorul DHT11 si.. Arduino
Exista o varianta mai buna decat DHT11, ca domeniu de masura si precizie, e vorba de DHT22: domeniu de temperatura -40..125oC cu precizie de +0,5oC, respectiv umiditate 0..100%RH cu o precizie de +2%RH.
Revenind la partea de afisare pe ecran grafic color, am folosit montajul de la partea de termometru dublu cu senzori de temperatura DS18B20 (prezentat in articolul anterior), adaptandu-l la modul de conectare al modulului cu senzor DHT11:
/*
// original sketch by niq_ro from http://nicuflorica.blogspot.com for analog clock using ucglib library
// version for 2.2" TFT with ILI9341 - 2014.07.29, Craiova - Romania
// or http://www.tehnic.go.ro
// or http://arduinotehniq.blogspot.com/
Universal uC Color Graphics Library
https://code.google.com/p/ucglib/
Copyright (c) 2014, olikraus@gmail.com
All rights reserved.
*/
#include <SPI.h>
#include "Ucglib.h"
// Ucglib_ILI9341_18x240x320_SWSPI ucg(/*sclk=*/ 13, /*data=*/ 11, /*cd=*/ 6 , /*cs=*/ 5, /*reset=*/ 4); //gordons
//Ucglib_ILI9341_18x240x320_SWSPI ucg(/*sclk=*/ 52, /*data=*/ 51, /*cd=*/ 26 , /*cs=*/ 24, /*reset=*/ 22); //at Mega
//Ucglib_ILI9341_18x240x320_HWSPI ucg(/*cd=*/ 6 , /*cs=*/ 5, /*reset=*/ 4); // at Uno
Ucglib_ILI9341_18x240x320_HWSPI ucg(/*cd=*/ 26 , /*cs=*/ 24, /*reset=*/ 22); // at Mega
/*
http://gordonsprojects.blogspot.ro/2014/04/arduino-tft-serial-spi-22-ili9341.html
Mega | Uno | TFT - ILI9341
----------------------
D22 | D4 | RESET
D24 | D5 | CS
D26 | D6 | D/C
? | ? | LED (via 220 ohms resistor at 5V)
D51 | D11 | MOSI
D50 | D12 | MISO
D52 | D13 | SCK
-----------------------------
with CD4050 adapter or 10k resistor, power supply and logical levels is 3.3V
schematic: http://nicuflorica.blogspot.ro/2014/07/afisaj-grafic-color-qvga-de-22-cu.html
*/
#include "DHT.h"
#define DHTPIN A0 // what pin we're connected to
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
void subrutina(void) {
ucg.setRotate90();
// graphic commands to redraw the complete screen should be placed here
// pictez un chenar
ucg.setColor(255, 255, 255); // culoare alba
ucg.drawFrame(0,0,320,240); //
ucg.setFont(ucg_font_courB24); // 20 pixel height
ucg.setColor(255, 0, 0); // culoare rosie
ucg.setPrintPos(60,30);
ucg.print("Ministatie");
ucg.setColor(0, 255, 0); // culoare verde
ucg.setColor(0, 255, 0);
ucg.setColor(0, 0, 255); // culoare albastru
ucg.setPrintPos(20, 60);
ucg.print("meteo cu DHT11");
ucg.setFont(ucg_font_fur17r); // 17 pixel height
ucg.setColor(255, 255, 0); // culoare galbena
ucg.setPrintPos(25,90);
ucg.print("ecran grafic 2,2'' (5,6cm)");
ucg.setFont(ucg_font_courB24); // 20 pixel height
ucg.setColor(0, 255, 255); // culoare bleo
ucg.setPrintPos(10,120);
ucg.print("QVGA cu ILI9341");
ucg.setColor(255, 0, 255); // culoare mov
ucg.setPrintPos(40,150);
ucg.print("versiune 3.0");
ucg.setFont(ucg_font_fur17r); // 17 pixel height
ucg.setColor(255, 255, 255); // culoare alb
ucg.setPrintPos(60,200);
ucg.print("realizat de niq_ro");
}
// variables
// variabile
int t1, t2;
int t10, t20;
int t11, t21;
int t12, t22;
int t13, t23;
int h11, h12;
void setup(void) {
dht.begin();
// Serial.begin(9600); // open the serial port at 9600 bps:
delay(1000);
ucg.begin(UCG_FONT_MODE_TRANSPARENT);
//ucg.begin(UCG_FONT_MODE_SOLID);
ucg.clearScreen();
// ucg.clearScreen();
ucg.setFont(ucg_font_ncenR14r);
ucg.setColor(255, 0, 255);
ucg.setColor(1, 255, 0,0);
subrutina(); // unde e mesajul de intampinare
delay(5000);
ucg.clearScreen();
// initial value
t12=40.0;
t12=40.0;
}
void loop(void) {
// DHT11 part
int h11 = dht.readHumidity();
int t11 = dht.readTemperature();
//-------------------------------------------------------
if (t11 != t12)
{
texte(t11, t12, 20, 0); // temperature, x, y
termometre(t11, 20);
}
if (h11 != h12)
{
texte(h11, h12, 100, 90); // humidity, x, y
sticla(h11, h12);
}
delay (2000);
// store old value
t12=t11;
h12=h11;
} // final de program, se revine de la inceput
void texte(int t3, int t4, int ics, int igrec)
{
int t5 = t3;
int t6 = t4;
ucg.setFont(ucg_font_courB24); // 20 pixel height
// ucg.clearScreen();
if (t3*t4 < 0)
{ucg.setColor(0, 0, 0);
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(ics+7, qy + igrec , 105);
}
}
// sterg semnul ??
int t51 = t5/10;
int t61 = t6/10;
ucg.setColor(0, 0, 0);
// sterg zeci daca e cazul
if (t51 != t61)
{
//ucg.setColor(255, 255, 0);
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(ics+28, qy + igrec , 21);
}
}
t5 = t3 - t51*10;
t6 = t4 - t61*10;
// sterg unitati daca e cazul
//if ((t5 != t6) || (t5-t6>0.2))
if (t5 != t6)
{
//ucg.setColor(0, 255, 255);
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(ics+49, qy + igrec , 21);
}
}
if (igrec <30)
{
ucg.setColor(255, 255, 0);
ucg.setPrintPos(10 + ics, 30 + igrec);
ucg.print("temperatura:");
}
else
{
ucg.setColor(0, 255, 255);
ucg.setPrintPos(15 + ics, 30 + igrec);
ucg.print("umiditate:");
}
// ucg.setPrintPos(10 + ics, 30 + igrec);
// ucg.print("temperatura:");
//ucg.setFont(ucg_font_fub42n); // 20 pixel height
ucg.setPrintPos(10 + ics, 60 + igrec);
if (t3 > 10) ucg.print("+");
else
{
//ucg.setColor(255, 255, 0);
ucg.setColor(0, 0, 0);
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(ics+10, qy + igrec , 21);
}
if (igrec <30) ucg.setColor(255, 255, 0);
else ucg.setColor(0, 255, 255);
ucg.setPrintPos(31 + ics, 60 + igrec);
ucg.print("+");
}
//if (t3==0.0) ucg.print(" ");
// ucg.print(t12,1);
ucg.print(t3,1);
// ucg.print("23.6");
if (igrec <30)
{
ucg.print(" C");
ucg.setFont(ucg_font_fur17r); // 17 pixel height
/* ucg.setPrintPos(30 + ics, 35 + igrec);
if (igrec == 0) ucg.print("int");
else ucg.print("ext");
*/
ucg.setPrintPos(75 + ics, 50 + igrec);
ucg.print("o");
}
else ucg.print("%");
}
void termometre (int t, int ics1)
{
ucg.setColor(255, 255, 255);
// ucg.setColor(r2, g2, b2);
ucg.drawFrame(ics1-4,10,9,200); // desenez corp termometru
// ucg.drawDisc(ics1,220,10,UCG_DRAW_ALL); // desenez partea de jos, cu mercur
ucg.drawCircle(ics1,220,10,UCG_DRAW_ALL); // desenez partea de jos, cu mercur
for (int a = 0; a < 5; a++)
{
ucg.drawLine(ics1-5,15+35*a,ics1-7,15+35*a);
ucg.drawLine(ics1+5,15+35*a,ics1+7,15+35*a);
}
ucg.drawLine(ics1-10,190,ics1+10,190); // zero degree
ucg.setFont(ucg_font_courB24); // 20 pixel height
ucg.setPrintPos(15 + ics1, 199);
ucg.print("0 C");
ucg.setFont(ucg_font_fur17r); // 17 pixel height
ucg.setPrintPos(39 + ics1, 185);
ucg.print("o");
// temperature "lengh"
//int lin = 140 - 2*t;
int lin = 190-3.5*t;
ucg.setColor(0, 0, 0); // black
//ucg.drawBox(ics1-2,20, 5, 190); // erase
ucg.drawBox(ics1-2,21, 5, lin+5);
// temperature gaphics
if (ics1 <30) ucg.setColor(255, 255, 0);
else ucg.setColor(0, 0, 255);
ucg.drawDisc(ics1,220,8,UCG_DRAW_ALL); // desenez partea de jos, cu mercur
//ucg.setColor(255, 255, 0);
// ucg.drawLine(ics1-10,lin,ics1+10,lin); // just for control
ucg.drawBox(ics1-2,lin, 5, 210-lin);
}
void sticla (int h, int h2)
{
int xmax = 319;
int ymax = 239;
int raza = 98;
// h = 45; // pentru teste
ucg.setColor(255, 255, 255);
ucg.drawCircle(319,239,100,UCG_DRAW_UPPER_LEFT); // desenez arc de cerc in stanga sus
ucg.setColor(0, 0, 255);
ucg.drawHLine(220, 239, 100); // desenez linia de 0% (orizontala)
ucg.setColor(255, 0, 0);
ucg.drawVLine(319, 140, 100); // desenez linia de 100% (verticala)
//calculez coordonate
int xa=100*cos(2*h2*0.9*3.14/360);
int ya=100*sin(2*h2*0.9*3.14/360);
int xn=100*cos(2*h*3.14*0.9/360);
int yn=100*sin(2*h*3.14*0.9/360);
//sterg indicatia anterioara
ucg.setColor(0, 0, 0);
ucg.drawLine(xmax-xa, ymax-ya, xmax, ymax); //
//desenez indicatia noua
ucg.setColor(0, 255, 255);
ucg.drawLine(xmax-xn, ymax-yn, xmax, ymax); //
}
Avand in vedere ca folosesc Arduino Mega nu mai am restrictii la marimea programului, asa ca pana o sa cumpar un senzor performant DHT22, o sa sa masor temperatura cu senzorul DS18B20 si umiditatea cu DHT11.Schema de conectare a celor 2 senzori este combinatia schemelor anterioare:
Ministatie meteo cu DHT11 si DS18B20
Am facut si un filmulet numit ministatie meteo cu DHT11 si DS18B20 pe ecran TFT de 2.2" cu ILI9341:
Schema de conectare este o combinatie a celei anterioare si a celei de la DS18B20, iar sketch-ul folosit este:
/*
original sketch by niq_ro from http://nicuflorica.blogspot.com using ucglib library
version for 2.2" TFT with ILI9341 - 2014.07.29, Craiova - Romania
use Universal uC Color Graphics Library from https://code.google.com/p/ucglib/
*/
#include <SPI.h>
#include "Ucglib.h"
//Ucglib_ILI9341_18x240x320_HWSPI ucg(/*cd=*/ 6 , /*cs=*/ 5, /*reset=*/ 4); // at Uno
Ucglib_ILI9341_18x240x320_HWSPI ucg(/*cd=*/ 26 , /*cs=*/ 24, /*reset=*/ 22); // at Mega
/*
Mega | Uno | TFT - ILI9341
----------------------
D22 | D4 | RESET
D24 | D5 | CS
D26 | D6 | D/C
? | ? | LED (via 220 ohms resistor at 5V)
D51 | D11 | MOSI
D50 | D12 | MISO
D52 | D13 | SCK
-----------------------------
with CD4050 adapter or 10k resistor, power supply and logical levels is 3.3V
schematic: http://nicuflorica.blogspot.ro/2014/07/afisaj-grafic-color-qvga-de-22-cu.html
*/
#include <OneWire.h>
OneWire ds(10); // on pin 10 (a 4.7K resistor is necessary)
int ics =0; //count number of sensor
#include "DHT.h"
#define DHTPIN A0 // what pin we're connected to
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
float t1, t2;
float t10, t20;
float t11, t21;
float t12, t22;
float t13, t23;
int h11, h12;
void setup(void) {
delay(1000);
dht.begin();
ucg.begin(UCG_FONT_MODE_TRANSPARENT);
ucg.clearScreen();
ucg.setFont(ucg_font_ncenR14r);
ucg.setColor(255, 0, 255);
ucg.setColor(1, 255, 0,0);
ucg.setRotate90();
ucg.setColor(255, 255, 255); // culoare alba
ucg.drawFrame(0,0,320,240); //
ucg.setFont(ucg_font_courB24); // 20 pixel height
ucg.setColor(255, 0, 0); // culoare rosie
ucg.setPrintPos(60,30);
ucg.print("Ministatie");
ucg.setColor(0, 255, 0); // culoare verde
ucg.setColor(0, 255, 0);
ucg.setColor(0, 0, 255); // culoare albastru
ucg.setPrintPos(20, 60);
ucg.print("meteo cu DHT11");
ucg.setPrintPos(60, 90);
ucg.setColor(0, 255, 0); // culoare verde
ucg.print("si DS18B20");
ucg.setFont(ucg_font_fur17r); // 17 pixel height
ucg.setColor(255, 255, 0); // culoare galbena
ucg.setPrintPos(25,120);
ucg.print("ecran grafic 2,2'' (5,6cm)");
ucg.setFont(ucg_font_courB24); // 20 pixel height
ucg.setColor(0, 255, 255); // culoare bleo
ucg.setPrintPos(10,150);
ucg.print("QVGA cu ILI9341");
ucg.setColor(255, 0, 255); // culoare mov
ucg.setPrintPos(40,180);
ucg.print("versiune 4.0");
ucg.setFont(ucg_font_fur17r); // 17 pixel height
ucg.setColor(255, 255, 255); // culoare alb
ucg.setPrintPos(60,210);
ucg.print("realizat de niq_ro");
delay(5000);
ucg.clearScreen();
t13=40.0;
h12=40.0;
}
void loop(void) {
// DHT11 part
int h11 = dht.readHumidity();
//DS18B20 part
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;
if ( !ds.search(addr)) {
ds.reset_search();
ics=0;
return;
}
ics++;
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
// Convert the data to actual temperature
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
t12 = (float)raw / 16.0;
int t15 = t12;
float t16 = 10*t15;
t16 = t16/10;
t16 = t12;
if (t16 != t13)
{
temperaturi(t16, t13, 20, 0);
termometre(t16, 20);
}
if (h11 != h12)
{
umiditate(h11, h12, 115, 90); // humidity, x, y
sticla(h11, h12);
}
//}
delay (2000);
t13=t16;
h12=h11;
} // final de program, se revine de la inceput
void temperaturi(float t3, float t4, int ics, int igrec)
{
int t5 = t3;
int t6 = t4;
ucg.setFont(ucg_font_courB24);
if (t3*t4 < 0)
{ucg.setColor(0, 0, 0);
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(ics+7, qy + igrec , 105);
}
}
int t51 = t5/10;
int t61 = t6/10;
ucg.setColor(0, 0, 0);
if (t51 != t61)
{
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(ics+28, qy + igrec , 21);
}
}
t5 = t3 - t51*10;
t6 = t4 - t61*10;
if (t5 != t6)
{
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(ics+49, qy + igrec , 21);
}
}
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(ics+91, qy + igrec , 21);
}
if (igrec <30) ucg.setColor(255, 0, 0);
else ucg.setColor(0, 0, 255);
ucg.setPrintPos(10 + ics, 30 + igrec);
//ucg.print("t :");
ucg.print("temperatura:");
ucg.setPrintPos(10 + ics, 60 + igrec);
if (t3 > 10.0) ucg.print("+");
else
if (t3>0.0) ucg.print(" +");
else
if (t3<0.0)
{
t3=-t3;
if (t3 > 10.0) ucg.print("-");
else
if (t3 > 0.0) ucg.print(" -");
}
if (t3==0.0) ucg.print(" ");
ucg.print(t3,1);
ucg.print(" C");
ucg.setFont(ucg_font_fur17r);
ucg.setPrintPos(30 + ics, 35 + igrec);
//if (igrec == 0) ucg.print("int");
//else ucg.print("ext");
ucg.setPrintPos(115 + ics, 50 + igrec);
ucg.print("o");
}
void termometre (float t, int ics1)
{
ucg.setColor(255, 255, 255);
ucg.drawFrame(ics1-4,10,9,200);
ucg.drawCircle(ics1,220,10,UCG_DRAW_ALL);
for (int a = 0; a < 10; a++)
{
ucg.drawLine(ics1-5,20+20*a,ics1-7,20+20*a);
ucg.drawLine(ics1+5,20+20*a,ics1+7,20+20*a);
}
ucg.drawLine(ics1-10,140,ics1+10,140);
ucg.setFont(ucg_font_courB24);
ucg.setPrintPos(13 + ics1, 149);
ucg.print("0 C");
ucg.setFont(ucg_font_fur17r);
ucg.setPrintPos(37 + ics1, 135);
ucg.print("o");
int lin = 140 - 2*t;
ucg.setColor(0, 0, 0); // black
ucg.drawBox(ics1-2,21, 5, lin+5);
if (ics1 <30) ucg.setColor(255, 0, 0);
else ucg.setColor(0, 0, 255);
ucg.drawDisc(ics1,220,8,UCG_DRAW_ALL);
ucg.drawBox(ics1-2,lin, 5, 210-lin);
}
void umiditate(int h3, int h4, int zet, int igrec1)
{
ucg.setFont(ucg_font_courB24); // 20 pixel height
// sterg semnul ??
int h51 = h3/10;
int h61 = h4/10;
ucg.setColor(0, 0, 0);
// sterg zeci daca e cazul
if (h51 != h61)
{
//ucg.setColor(255, 255, 0);
ucg.setColor(0, 0, 0);
for (int qy = 39 ; qy < 60; qy++)
{
// ucg.drawHLine(zet+28, qy + igrec1 , 21);
ucg.drawHLine(zet+10, qy + igrec1, 42);
}
}
int h5 = h3 - h51*10;
int h6 = h4 - h61*10;
// sterg unitati daca e cazul
//if ((t5 != t6) || (t5-t6>0.2))
if (h5 != h6)
{
//ucg.setColor(0, 255, 0);
ucg.setColor(0, 0, 0);
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(zet+49, qy + igrec1 , 21);
}
}
ucg.setColor(0, 255, 255);
ucg.setPrintPos(zet, 30 + igrec1);
ucg.print("umiditate:");
//ucg.setFont(ucg_font_fub42n); // 20 pixel height
ucg.setPrintPos(10 + zet, 60 + igrec1);
if (h3 > 10) ucg.print("+");
else
{
//ucg.setColor(255, 255, 0);
ucg.setColor(0, 0, 0);
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(zet+10, qy + igrec1 , 42);
}
if (igrec1 <30) ucg.setColor(255, 255, 0);
else ucg.setColor(0, 255, 255);
ucg.setPrintPos(31 + zet, 60 + igrec1);
ucg.print("+");
}
ucg.print(h3);
ucg.print("%");
}
void sticla (int h, int h2)
{
int xmax = 319;
int ymax = 239;
int raza = 98;
// h = 45; // pentru teste
ucg.setColor(255, 255, 255);
ucg.drawCircle(319,239,100,UCG_DRAW_UPPER_LEFT); // desenez arc de cerc in stanga sus
ucg.setColor(0, 0, 255);
ucg.drawHLine(220, 239, 100); // desenez linia de 0% (orizontala)
ucg.setColor(255, 0, 0);
ucg.drawVLine(319, 140, 100); // desenez linia de 100% (verticala)
//calculez coordonate
int xa=100*cos(2*h2*0.9*3.14/360);
int ya=100*sin(2*h2*0.9*3.14/360);
int xn=100*cos(2*h*3.14*0.9/360);
int yn=100*sin(2*h*3.14*0.9/360);
//sterg indicatia anterioara
ucg.setColor(0, 0, 0);
ucg.drawLine(xmax-xa, ymax-ya, xmax, ymax); //
//desenez indicatia noua
ucg.setColor(0, 255, 255);
ucg.drawLine(xmax-xn, ymax-yn, xmax, ymax); //
}
Ulterior am modificat sketch-ul inlocuind indicatorul acele pe sfert de cerc cu o "baterie":
Am scos semnul "+" de la umiditate si am schimbat "bateria" cu o barcuta cu vele, care pluteste ce o apa, a carei nivel este proportional cu umiditatea...
Sketch-ul folosit la versiunea 4.1.2 este:
/*
original sketch by niq_ro from http://nicuflorica.blogspot.com using ucglib library
version for 2.2" TFT with ILI9341 - 2014.07.29, Craiova - Romania
use Universal uC Color Graphics Library from https://code.google.com/p/ucglib/
*/
#include <SPI.h>
#include "Ucglib.h"
//Ucglib_ILI9341_18x240x320_HWSPI ucg(/*cd=*/ 6 , /*cs=*/ 5, /*reset=*/ 4); // at Uno
Ucglib_ILI9341_18x240x320_HWSPI ucg(/*cd=*/ 26 , /*cs=*/ 24, /*reset=*/ 22); // at Mega
/*
Mega | Uno | TFT - ILI9341
----------------------
D22 | D4 | RESET
D24 | D5 | CS
D26 | D6 | D/C
? | ? | LED (via 220 ohms resistor at 5V)
D51 | D11 | MOSI
D50 | D12 | MISO
D52 | D13 | SCK
-----------------------------
with CD4050 adapter or 10k resistor, power supply and logical levels is 3.3V
schematic: http://nicuflorica.blogspot.ro/2014/07/afisaj-grafic-color-qvga-de-22-cu.html
*/
#include <OneWire.h>
OneWire ds(10); // on pin 10 (a 4.7K resistor is necessary)
int ics =0; //count number of sensor
#include "DHT.h"
#define DHTPIN A0 // what pin we're connected to
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
float t1, t2;
float t10, t20;
float t11, t21;
float t12, t22;
float t13, t23;
int h11, h12;
void setup(void) {
delay(1000);
dht.begin();
ucg.begin(UCG_FONT_MODE_TRANSPARENT);
ucg.clearScreen();
ucg.setFont(ucg_font_ncenR14r);
ucg.setColor(255, 0, 255);
ucg.setColor(1, 255, 0,0);
ucg.setRotate90();
ucg.setColor(255, 255, 255); // culoare alba
ucg.drawFrame(0,0,320,240); //
ucg.setFont(ucg_font_courB24); // 20 pixel height
ucg.setColor(255, 0, 0); // culoare rosie
ucg.setPrintPos(60,30);
ucg.print("Ministatie");
ucg.setColor(0, 255, 0); // culoare verde
ucg.setColor(0, 255, 0);
ucg.setColor(0, 0, 255); // culoare albastru
ucg.setPrintPos(20, 60);
ucg.print("meteo cu DHT11");
ucg.setPrintPos(60, 90);
ucg.setColor(0, 255, 0); // culoare verde
ucg.print("si DS18B20");
ucg.setFont(ucg_font_fur17r); // 17 pixel height
ucg.setColor(255, 255, 0); // culoare galbena
ucg.setPrintPos(25,120);
ucg.print("ecran grafic 2,2'' (5,6cm)");
ucg.setFont(ucg_font_courB24); // 20 pixel height
ucg.setColor(0, 255, 255); // culoare bleo
ucg.setPrintPos(10,150);
ucg.print("QVGA cu ILI9341");
ucg.setColor(255, 0, 255); // culoare mov
ucg.setPrintPos(20,180);
ucg.print("versiune 4.1.2");
ucg.setFont(ucg_font_fur17r); // 17 pixel height
ucg.setColor(255, 255, 255); // culoare alb
ucg.setPrintPos(60,210);
ucg.print("realizat de niq_ro");
delay(5000);
ucg.clearScreen();
t13=40.0;
h12=40.0;
}
void loop(void) {
// DHT11 part
int h11 = dht.readHumidity();
//DS18B20 part
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;
if ( !ds.search(addr)) {
ds.reset_search();
ics=0;
return;
}
ics++;
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
// Convert the data to actual temperature
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
t12 = (float)raw / 16.0;
int t15 = t12;
float t16 = 10*t15;
t16 = t16/10;
t16 = t12;
if (t16 != t13)
{
temperaturi(t16, t13, 20, 0); // temperature, old temperature, x,y
termometre(t16, 20);
}
if (h11 != h12)
{
umiditate(h11, h12, 115, 90); // humidity, old humidity x, y
barca (h11, h12);
}
//}
delay (2000);
t13=t16;
h12=h11;
} // final de program, se revine de la inceput
void temperaturi(float t3, float t4, int ics, int igrec)
{
int t5 = t3;
int t6 = t4;
ucg.setFont(ucg_font_courB24);
if (t3*t4 < 0)
{ucg.setColor(0, 0, 0);
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(ics+7, qy + igrec , 105);
}
}
int t51 = t5/10;
int t61 = t6/10;
ucg.setColor(0, 0, 0);
if (t51 != t61)
{
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(ics+28, qy + igrec , 21);
}
}
t5 = t3 - t51*10;
t6 = t4 - t61*10;
if (t5 != t6)
{
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(ics+49, qy + igrec , 21);
}
}
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(ics+91, qy + igrec , 21);
}
if (igrec <30) ucg.setColor(255, 255, 0);
else ucg.setColor(0, 0, 255);
ucg.setPrintPos(10 + ics, 30 + igrec);
//ucg.print("t :");
ucg.print("temperatura:");
ucg.setPrintPos(10 + ics, 60 + igrec);
if (t3 > 10.0) ucg.print("+");
else
if (t3>0.0) ucg.print(" +");
else
if (t3<0.0)
{
t3=-t3;
if (t3 > 10.0) ucg.print("-");
else
if (t3 > 0.0) ucg.print(" -");
}
if (t3==0.0) ucg.print(" ");
ucg.print(t3,1);
ucg.print(" C");
ucg.setFont(ucg_font_fur17r);
ucg.setPrintPos(30 + ics, 35 + igrec);
//if (igrec == 0) ucg.print("int");
//else ucg.print("ext");
ucg.setPrintPos(115 + ics, 50 + igrec);
ucg.print("o");
ucg.setPrintPos(75 + ics, 60 + igrec);
ucg.print(",");
}
void termometre (float t, int ics1)
{
ucg.setColor(255, 255, 255);
ucg.drawFrame(ics1-4,10,9,200);
ucg.drawCircle(ics1,220,10,UCG_DRAW_ALL);
for (int a = 0; a < 10; a++)
{
ucg.drawLine(ics1-5,20+20*a,ics1-7,20+20*a);
ucg.drawLine(ics1+5,20+20*a,ics1+7,20+20*a);
}
ucg.drawLine(ics1-10,140,ics1+10,140);
ucg.setFont(ucg_font_courB24);
ucg.setPrintPos(13 + ics1, 149);
ucg.print("0 C");
ucg.setFont(ucg_font_fur17r);
ucg.setPrintPos(37 + ics1, 135);
ucg.print("o");
int lin = 140 - 2*t;
ucg.setColor(0, 0, 0); // black
ucg.drawBox(ics1-2,21, 5, lin+5);
if (ics1 <30) ucg.setColor(255, 0, 0);
else ucg.setColor(0, 0, 255);
ucg.drawDisc(ics1,220,8,UCG_DRAW_ALL);
ucg.drawBox(ics1-2,lin, 5, 210-lin);
}
void umiditate(int h3, int h4, int zet, int igrec1)
{
ucg.setFont(ucg_font_courB24); // 20 pixel height
// sterg semnul ??
int h51 = h3/10;
int h61 = h4/10;
ucg.setColor(0, 0, 0);
// sterg zeci daca e cazul
if (h51 != h61)
{
//ucg.setColor(255, 255, 0);
ucg.setColor(0, 0, 0);
for (int qy = 39 ; qy < 60; qy++)
{
// ucg.drawHLine(zet+28, qy + igrec1 , 21);
ucg.drawHLine(zet+40, qy + igrec1, 42);
}
}
int h5 = h3 - h51*10;
int h6 = h4 - h61*10;
// sterg unitati daca e cazul
//if ((t5 != t6) || (t5-t6>0.2))
if (h5 != h6)
{
//ucg.setColor(0, 255, 0);
ucg.setColor(0, 0, 0);
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(zet+79, qy + igrec1 , 21);
}
}
ucg.setColor(0, 255, 255);
ucg.setPrintPos(zet, 30 + igrec1);
ucg.print("umiditate:");
//ucg.setFont(ucg_font_fub42n); // 20 pixel height
ucg.setPrintPos(40 + zet, 60 + igrec1);
//if (h3 > 10) ucg.print("+");
if (h3 > 10) ucg.print(" ");
else
{
//ucg.setColor(255, 255, 255);
ucg.setColor(0, 0, 0);
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(zet+40, qy + igrec1 , 42);
}
if (igrec1 <30) ucg.setColor(255, 255, 0);
else ucg.setColor(0, 255, 255);
ucg.setPrintPos(61 + zet, 60 + igrec1);
//ucg.print("+");
ucg.print(" ");
}
ucg.print(h3);
ucg.print("%");
}
void barca (int h, int h2) // new humidity, old humidity.,
{
int xx = 280;
int yy = 230;
//sterg barca
//ucg.setColor(100,100,100);
ucg.setColor(0,0,0);
ucg.drawBox(xx-25, yy-20-h2, 50, 30);
//sterg apa
//ucg.setColor(125, 125, 125);
ucg.setColor(0, 0, 0);
ucg.drawBox(xx-35, yy+10-h2, 70, h2-h);
//desenez apa
ucg.setColor(0, 255, 255);
ucg.drawBox(xx-35, yy+10-h, 70, h);
//desenz barcuta;
//desenez carena
ucg.setColor(255, 255, 0);
ucg.drawBox(xx-20, yy-h, 40, 10);
ucg.drawTriangle(xx-25, yy-h, xx-20, yy-h, xx-20, yy+10-h);
ucg.drawTriangle(xx+25, yy-h, xx+20, yy-h, xx+20, yy+10-h);
//desenez catarg
ucg.drawBox(xx-1, yy-20-h, 2, 20);
//desenez velele
ucg.setColor(0, 0, 255); // vela albastra
ucg.drawTriangle(xx+2, yy-20-h, xx+2, yy-h, xx+20, yy-h);
ucg.setColor(255, 0, 0); // vela rosie
ucg.drawTriangle(xx-2, yy-15-h, xx-2, yy-h, xx-20, yy-h);
}
6.8.2014
Am facut un alt filmulet, cu lumina ambianta mai multa, pentru a se mai defocaliza camera, numit ministatie meteo cu DHT11 si DS18B20 pe ecran TFT de 2.2" cu ILI9341 (4)