Se afișează postările cu eticheta LM335. Afișați toate postările
Se afișează postările cu eticheta LM335. Afișați toate postările

marți, 27 ianuarie 2015

Termometru dublu si indicator tensiune baterie cu ATtiny85 pe afisaj LCD1602

   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 from
http://www.tehnic.go.ro
http://www.niqro.3x.ro
http://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, clockpin

byte 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.0
int 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 A1

int divbaterie = A2; //the input pin for voltage divider
int u = 0;  // variable to store the value coming from the sensor
float k=4.90/5; // corection voltage (real voltage after 7805 output)
float k1 = k; // real divider correction

float u1 = 0; // voltage on battery
float divizor = 0.25; // divider raport

void setup() {
    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 text
 delay (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 text
 delay (3000);
 lcd.clear(); // clear the screen

}


void loop() {

  // Read and store Sensor Data
t11=0;
t21=0;
//lcd.clear(); // clear the screen

for (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:
   Ca de obicei, am facut un filmulet.. numit termometru dublu cu indicare stare acumulator masina cu ATtiny85

luni, 26 ianuarie 2015

Termometru dublu cu ATTiny85

   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 from
http://www.tehnic.go.ro
http://www.niqro.3x.ro
http://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, clockpin

byte 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.0
int 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 A1


void setup() {
    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 text
 delay (3000);
 lcd.clear(); // clear the screen

}


void loop() {
  
  // Read and store Sensor Data
t11=0;
t21=0;
//lcd.clear(); // clear the screen

for (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));
}
   Deoarece am fost bucuros ca mi-a iesit treaba, am facut la inceput 2 filme, nedandu-mi seama, ca temperaturile sunt inversate:
termometru dublu cu ATTiny85 folosind senzori LM335
ATtiny85 dual thermometer with LM335
   Ulterior, am facut corectii, facand alte 2 filme:
termometru dublu cu ATTiny85 folosind senzori LM335 (2)
ATtiny85 dual thermometer with LM335 (2)
   Am desenat si schema de conexiuni, completa:
27.01.2015
   Pastrand modul de desenare a cablajului din articolul de la Attiny_LCD_595 Board: LCD controlled by ATtiny85… stand-alone am desenat cablajul pentru schema de mai sus, utilizand programul Eagle PCB Software si, din graba, l-am gresit, ca sa fie functional, trebuie modificat astfel:

joi, 24 iulie 2014

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

poze actualizate in 08.07.2015

Termometru dublu cu LM335

   Avand partea de interfata realizata cu CD4050, am zis sa fac si cu acest afisaj termometrul dublu cu senzorii LM335, cum am facut si cu afisajul de Nokia 3410 si cu cel grafic monocrom cu ST7292, avand in vedere ca rezolutia este mult mai mare la afisajul color cu ILI9341, respectiv 320x240 (QVGA).
   Pentru inceput am realizat schema:
si am incercat mai multe moduri de afisare, folosindu-ma de libraria grafica ucglib
 
 
 
   Deoarece rata de improspatare (refresh) este mica, e deranjant modul de afisare, dupa cum se vede in filmuletul termometru dublu pe afisaj color de 2,2"
   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.18, Craiova - Romania

Universal uC Color Graphics Library
  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_HWSPI ucg(/*cd=*/ 6 , /*cs=*/ 5, /*reset=*/ 4); // gordons

/*
http://gordonsprojects.blogspot.ro/2014/04/arduino-tft-serial-spi-22-ili9341.html
D4  : RESET
D5  : CS
D6  : D/C
D7  : LED (via 220 ohms resistor)
D11 : MOSI
D12 : MISO
D13 : SCK
with CD4050 adapter or 10k resistor, power supply and logical levels is 3.3V
*/


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(50,30);
  ucg.print("Termometru");
  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("dublu cu LM335");
  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 1.2");
  ucg.setFont(ucg_font_fur17r); // 17 pixel height
  ucg.setColor(255, 255, 255); // culoare alb
  ucg.setPrintPos(70,200);
  ucg.print("realizat de niq_ro");

}


// 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.0
int 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


void setup(void) {
  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();
}

void loop(void) {

 ucg.setScale2x2();
//  ucg.clearScreen(); 

  // Read and store Sensor Data
t11=0;
t21=0;

for (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  
  


//-------------------------------------------------------
ucg.clearScreen(); 
// temp int
temperaturi(t12, 0);
//temperaturi(22.5, 0);
// temp exterioara
temperaturi(t22, 60);
//temperaturi(29.5, 60);


 
 delay (2000); 
} // final de program, se revine de la inceput



void temperaturi(float t3, int igrec)
{
   ucg.setFont(ucg_font_courB24); // 20 pixel height   
// ucg.clearScreen(); 
/*
ucg.setColor(0, 0, 0); 
for (int qy = 39; qy < 60; qy++) 
{
  ucg.drawHLine(0, qy + igrec , 110);

*/
int r1 = random(100,255);
int g1 = random(100,255);
int b1 = random(100,255);
 ucg.setColor(r1, g1, b1);  
 ucg.setPrintPos(10, 30 + igrec);
 ucg.print("t  :"); 

//ucg.setFont(ucg_font_fub42n); // 20 pixel height   
ucg.setPrintPos(10, 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(t12,1); 
 ucg.print(t3,1); 
// ucg.print("23.6"); 
 ucg.print(" C"); 
 ucg.setFont(ucg_font_fur17r); // 17 pixel height
 ucg.setPrintPos(30, 35 + igrec);
 if (igrec == 0) ucg.print("int"); 
 else ucg.print("ext"); 
 ucg.setPrintPos(115, 50 + igrec);
 ucg.print("o"); 
}
   Avand si o placa Arduino Mega ADK am conectat-o si pe ea, sperand ca se imbunatateste modul de afisare. Modul de conectare este putin diferit:
                             ----------------------------
                            | Mega | Uno | TFT - ILI9341 |
                             ----------------------------
                            | D22  | D4  | RESET         |
                             ----------------------------  
                            | D24  | D5  | CS            |
                             ----------------------------
                            | D26  | D6  | D/C           |
                             ----------------------------
                            | D51  | D11 | MOSI          |
                             ----------------------------
                            | D50  | D12 | MISO          |
                             ----------------------------  
                            | D52  | D13 | SCK           |
                             ----------------------------
   LED-ul de fundal l-am alimentat printr-o rezistenta de 220 ohmi de la 5V.
   Din pacate nu este nici o imbunatatire, dupa cum se vede in filmuletul termometru dublu pe afisaj color de 2,2" cu Arduino Mega
   Solutia ar fi o placa cu procesor mai rapid cum e Arduino Due, care lucreaza la 84MHz, fata de 16MHz la Arduino Uno si Mega.    M-am gandit sa schimb modul de afisare, cu fonturi mai mici si o grafica:
   Ca si in celelalte cazuri, trebuie alimentare separata, deoarece valorile masurate sunt comparate cu tensiunea de referinta, care este, in mod uzual, 5V, dar daca e consum mare, scate si la 4,8V...
   Sketch-ul folosit 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.18, Craiova - Romania

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
*/


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("Termometru");
  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("dublu cu LM335");
  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 1.5");
  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;
float t10, t20;
float t11, t21;
float t12, t22;

int temperaturePin1 = A0; // output from first LM335 is put at analog input no.0
int 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


void setup(void) {
  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();
}

void loop(void) {

// ucg.setScale2x2();
//  ucg.clearScreen();

// Read and store Sensor Data
t11=0;
t21=0;

for (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  
  


//-------------------------------------------------------
//ucg.clearScreen(); 
// temp int
int r = random(150,255);
int g = random(150,255);
int b = random(150,255);
temperaturi(t12, 20, 0); // temperature, x, y
// termometre2(t12, 20);
termometre(t12, 20);


temperaturi(t22, 85, 160);
// termometre2(t22,250); 
termometre(t22,250);
// temp exterioara


 
 delay (2000); 
} // final de program, se revine de la inceput



void temperaturi(float t3, int ics, int igrec)
{
   ucg.setFont(ucg_font_courB24); // 20 pixel height   
// ucg.clearScreen(); 
ucg.setColor(0, 0, 0); 
for (int qy = 39 ; qy < 60; qy++) 
{
  ucg.drawHLine(ics+7, qy + igrec , 105);
}
if (igrec <30) ucg.setColor(255, 0, 0);  
else ucg.setColor(0, 0, 255);  

 ucg.setPrintPos(10 + ics, 30 + igrec);
 ucg.print("t  :"); 

//ucg.setFont(ucg_font_fub42n); // 20 pixel height   
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(t12,1); 
 ucg.print(t3,1); 
// ucg.print("23.6"); 
 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(115 + ics, 50 + igrec);
 ucg.print("o"); 
}

void termometre (float 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 < 10; a++)
{
  ucg.drawLine(ics1-5,20+20*a,ics1-2,20+20*a);
  ucg.drawLine(ics1+5,20+20*a,ics1+2,20+20*a);
}
  ucg.drawLine(ics1-10,140,ics1+10,140);  // zero degree

ucg.setFont(ucg_font_courB24); // 20 pixel height   
ucg.setPrintPos(13 + ics1, 149);
ucg.print("0 C"); 

ucg.setFont(ucg_font_fur17r); // 17 pixel height
ucg.setPrintPos(37 + ics1, 135);
 ucg.print("o"); 

// temperature "lengh"
int lin = 140 - 2*t;

ucg.setColor(0, 0, 0);  // black 
ucg.drawBox(ics1-2,20, 5, 190); // erase 

// temperature gaphics
if (ics1 <30) ucg.setColor(255, 0, 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);
 
}  
   Am facut un filmulet, numit termometru dublu pe afisaj color de 2,2" cu Arduino Mega (2) in care se vede noul mod de prezentare:
   Tot "mesterind" la sketch-uri am "evoluat", zic eu, in sensul de a elimina modul de afisare deranjant:

si o mica compartie:
30.07.2014
   Schema de conectare a afisajului prin intermediul integratului CD4050 si a senzorilor de temperatura LM335Z la placa Arduino Mega este: