vineri, 1 august 2014

Afisaj grafic color QVGA de 2,2" cu integrat ILI9341 conectat la Arduino (4)

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:
   Am facut si un filmulet numit ministatie meteo cu DHT11 pe ecran TFT de 2.2" cu ILI9341:
   Sketch-ul folosit de mine este:
/*
// 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 combinat sketch-ul anterior cu cel de la masurarea cu DS18B20 obtinand:
   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":
iar filmul care prezinta modul de afisare si anumite cazuri se numeste ministatie meteo cu DHT11 si DS18B20 pe ecran TFT de 2.2" cu ILI9341 (2)
5.8.2014
   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...
dupa cum se vede si in filmuletul ministatie meteo cu DHT11 si DS18B20 pe ecran TFT de 2.2" cu ILI9341 (3)
   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)

2 comentarii:

  1. sketch_mar10a:26: error: 'DHT11' was not declared in this scope

    #define DHTTYPE DHT11 // DHT 11

    RăspundețiȘtergere