TERMOMETRO LED CON ARDUINO

Termometro con indicazione a barra LED il quale utilizza un sensore LM35 collegato ad un Arduino MEGA2560…

 

 

 



 

INTRO

In questo progetto abbiamo costruito una scala termometrica, la quale, tramite l’accensione di diodi led, segnala la temperatura dell’ambiente in cui si trova il dispositivo. La temperatura viene rilevata da un sensore LM35 (la spiegazione del seguente componente è spiegata nell’articolo seguente: https://www.ne555.it/il-sensore-di-temperatura-lm35/), il quale manda un segnale di tipo analogico di valore 10mV/°C ad Arduino, che a sua volta tramite i pin di output (dal 22 al 29) manderà segnali di tensione continua  in uscita. Ai pin di output abbiamo collegato, tramite una breadboard, per quanto riguarda la prima versione:
8 resistori e 8 diodi led, rispettivamente: 3 verdi, 2 gialli, 3 rossi;
Per quanto riguarda la seconda versione:
8 resistori  e 8 diodi led, rispettivamente: 1 blu, 2 verdi, 2 gialli, 3 rossi;
Per quanto riguarda la terza versione rispettivamente: 1 blu, 2 verdi, 2 gialli, 2 rossi e un cicalino;
Le tre versioni differiscono dunque solo nell’accensione dei carichi, ovvero led e/o cicalino.

 



 

CODICE

Il codice della prima versione è:

int Sensore = A0;                             //Inizializzo il sensore a A0
unsigned int ValoreADC1, Temp;
unsigned int max_temp=50;
unsigned int Step = (max_temp)/7;
void setup() {
  pinMode (22, OUTPUT);
  pinMode (23, OUTPUT);
  pinMode (24, OUTPUT);
  pinMode (25, OUTPUT);
  pinMode (26, OUTPUT);
  pinMode (27, OUTPUT);
  pinMode (28, OUTPUT);
  pinMode (29, OUTPUT);
}

void loop() {
  ValoreADC1 = analogRead(Sensore);           //Leggo ingresso LM35
  Temp=ValoreADC1*0.48828;                    //Converto da valore binario in temperatura

  if(Temp<Step){                              //Condizione accensione led 1
    digitalWrite(22, HIGH);
    digitalWrite(23, LOW);
    digitalWrite(24, LOW);
    digitalWrite(25, LOW);
    digitalWrite(26, LOW);
    digitalWrite(27, LOW);
    digitalWrite(28, LOW);
    digitalWrite(29, LOW);
  }
    if(Temp>(Step)&&(Temp<(Step*2))){        //Condizione accensione led 1 e 2
    digitalWrite(22, HIGH);
    digitalWrite(23, HIGH);
    digitalWrite(24, LOW);
    digitalWrite(25, LOW);
    digitalWrite(26, LOW);
    digitalWrite(27, LOW);
    digitalWrite(28, LOW);
    digitalWrite(29, LOW);
  }
if((Temp>(Step*2))&&(Temp<(Step*3))){          //Condizione accensione led 1, 2, 3
    digitalWrite(22, HIGH);
    digitalWrite(23, HIGH);
    digitalWrite(24, HIGH);
    digitalWrite(25, LOW);
    digitalWrite(26, LOW);
    digitalWrite(27, LOW);
    digitalWrite(28, LOW);
    digitalWrite(29, LOW);
  }
  if((Temp>(Step*3))&&(Temp<(Step*4))){      //Condizione accensione led 1, 2, 3, 4
    digitalWrite(22, HIGH);
    digitalWrite(23, HIGH);
    digitalWrite(24, HIGH);
    digitalWrite(25, HIGH);
    digitalWrite(26, LOW);
    digitalWrite(27, LOW);
    digitalWrite(28, LOW);
    digitalWrite(29, LOW);
  }
if((Temp>(Step*4))&&(Temp<(Step*5))){       //Condizione accensione led 1, 2, 3, 4, 5
    digitalWrite(22, HIGH);
    digitalWrite(23, HIGH);
    digitalWrite(24, HIGH);
    digitalWrite(25, HIGH);
    digitalWrite(26, HIGH);
    digitalWrite(27, LOW);
    digitalWrite(28, LOW);
    digitalWrite(29, LOW);
  }  
if((Temp>(Step*5))&&(Temp<(Step*6))){       //Condizione accensione led 1, 2, 3, 4, 5, 6
    digitalWrite(22, HIGH);
    digitalWrite(23, HIGH);
    digitalWrite(24, HIGH);
    digitalWrite(25, HIGH);
    digitalWrite(26, HIGH);
    digitalWrite(27, HIGH);
    digitalWrite(28, LOW);
    digitalWrite(29, LOW);
  } 
if((Temp>(Step*6))&&(Temp<(Step*7))){     //Condizione accensione led 1, 2, 3, 4, 5, 6, 7
    digitalWrite(22, HIGH);
    digitalWrite(23, HIGH);
    digitalWrite(24, HIGH);
    digitalWrite(25, HIGH);
    digitalWrite(26, HIGH);
    digitalWrite(27, HIGH);
    digitalWrite(28, HIGH);
    digitalWrite(29, LOW);
  } 
  if((Temp>(Step*7))){                    //Condizione accensione led 1, 2, 3, 4, 5, 6, 7, 8
     digitalWrite(22, HIGH);
    digitalWrite(23, HIGH);
    digitalWrite(24, HIGH);
    digitalWrite(25, HIGH);
    digitalWrite(26, HIGH);
    digitalWrite(27, HIGH);
    digitalWrite(28, HIGH);
    digitalWrite(29, HIGH);
  }
  delay(500) //Inserisco un ritardo di 500ms
}

Inseriamo per prima cosa una temperatura massima, mentre la temperatura minima sarà già preimpostata dall’LM35 a 0 gradi poiché, tale componente non è in grado di leggere valori negativi di temperatura. Con degli if impostiamo le condizioni di accensione dei vari led.
Decidiamo il passo, ossia lo step che sarà dato dal valore massimo di temperatura/numero led.
Il primo led si accenderà quando la temperatura sarà compresa tra 0 e il valore dello step.
Il secondo led si accenderà quando la temperatura sarà compre tra il valore dello step e il valore dello step*2.
Il terzo led si accenderà quando la temperatura sarà compre tra il valore dello step*2 e il valore dello step*3. E così via.

Codice della seconda versione:

int Sensore = A0;                             //Inizializzo le variabili
unsigned int ValoreADC1, Temp;              
unsigned int max_temp=50;
unsigned int min_temp=0;
unsigned int Step = (max_temp-min_temp)/7;
void setup() {                                //Inizializzo le porte di uscita
  pinMode (22, OUTPUT);
  pinMode (23, OUTPUT);
  pinMode (24, OUTPUT);
  pinMode (25, OUTPUT);
  pinMode (26, OUTPUT);
  pinMode (27, OUTPUT);
  pinMode (28, OUTPUT);
  pinMode (29, OUTPUT);
}

void loop() {
  ValoreADC1 = analogRead(Sensore);           //Leggo ingresso 
  Temp=ValoreADC1*0.48828;                    //Converto l'ingresso in temperatura
  digitalWrite(22,(Temp < min_temp) ? HIGH : LOW); //Accendo il led blu se la temperatura è minore della temperatura minima
  
  for (int i = 0; i < 7; i++) {
    digitalWrite(23 + i, (Temp > min_temp + Step*i ) ? HIGH : LOW); //Accendo i led ad ogni incremento di temperatura in base al passo/Step
  } 
  delay(500);     //Inserisco un ritardo di 500ms
}

Inseriamo una temperatura massima ed una temperatura minima, il passo questa volta sarà dato da (temperatura massima – temperatura minima)/numero led-1. Il meno uno è dato dal fatto che un led è preimpostato per indicare se la temperatura è al disotto del valore della temperatura minima. Al posto di utilizzare gli if, utilizziamo un ciclo for e la funzione digitalWrite che ci permettono di scegliere le condizioni di accensione dei vari led.

Codice della terza versione:

int Sensore = A0;                             //Inizializzo le variabili
unsigned int ValoreADC1, Temp;
unsigned int max_temp=60;
unsigned int min_temp=30;
unsigned int Step = (max_temp-min_temp)/6;
void setup() {                              //Inizializo i pin di output
  pinMode (22, OUTPUT);
  pinMode (23, OUTPUT);
  pinMode (24, OUTPUT);
  pinMode (25, OUTPUT);
  pinMode (26, OUTPUT);
  pinMode (27, OUTPUT);
  pinMode (28, OUTPUT);
  pinMode (29, OUTPUT);
}

void loop() {
  ValoreADC1 = analogRead(Sensore);           //Leggo ingresso
  Temp=ValoreADC1*0.48828;                    //Converto ingresso
  digitalWrite(22,(Temp < min_temp) ? HIGH : LOW);  //Accendo il led blu se la temperatura è minore della temperatura minima
  digitalWrite(29,(Temp > max_temp) ? HIGH : LOW);  //Accendo il cicalin se la temperatura è maggiore della temperatura massima
  
  for (int i = 0; i < 6; i++) {
    digitalWrite(23 + i, (Temp > min_temp + Step*i ) ? HIGH : LOW); //Accendo i led ad ogni incremento di temperatura in base al passo/Step
  } 
  delay(500);   //Inserisco un ritardo di 500ms 
}

In questa versione del codice è pressoché identica alla precedente, a variare è l’aggiunta di un cicalino attivo che ci indica il superamento della temperatura massima. Questa volta la scala dei led non sarà composta da 7 bensì 6, poiché 1 è il led blu, che ha lo scopo di segnalare eventuali temperature inferiori alla temperatura minima, e l’altro è il cicalino, che come già specificato segnalerà una eventuale temperatura superiore al valore della temperatura massima da noi settata.

 

SCHEMA

Lo schema per la versione 1 del codice e la versione 2 è uguale, quello che cambia se lo si desidera è il colore del primo LED, nella versione 1 noi abbiamo usato un LED verde, nella seconda versione un LED blu.

Il modulo ARDUINO MEGA2560 viene alimentato dall’esterno (porta USB), il sensore è connesso tra VCC 5V, GND mentre la sua uscita è connessa all’ingresso analogico A0. I LED sono connessi dalla porta 22 alla porta 29 con un resistore di protezione sull’anodo da 470 ohm mentre tutti i catodi sono connessi a massa (GND).

Lo schema per la terza versione è:

In questo caso vi è semplicemente connesso un cicalino al posto dell’ultimo LED rosso. Il cicalino deve essere attivo, ovvero deve funzionare con una tensione di alimentazione continua, non vi è bisogno di inviare un onda quadra per creare il suono. Inoltre il cicalino non deve avere un assorbimento superiore a 20mA con alimentazione a 5V per evitare di bruciare il microcontrollore.

DOWNLOAD

Potete scaricare gli sketch e la simulazione con proteus dei circuiti al seguente LINK!!!

 



 

[Voti Totali: 0 Media Voti: 0]
Segui la Nostra Pagina Facebook: Facebook

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *