Utente:Piergio.andri/Arduino
Termostato
modificaTramite l'utilizzo del microcontrollore Arduino andiamo a creare un termostato dove possiamo andare a impostare la temperatura attraverso una manopola la temperatura. Poi andremo a verificare la temperatura ambientale, tramite un sensore di temperatura, se essa è più bassa si accende un led, altrimenti si spegne. Se si preme un tasto si vedrà la temperatura impostata, la temperatura rilevata e l'umidità rilevata.
Descrizione del progetto
modificaIl termostato ha un funzionamento abbastanza semplice:
- Come prima cosa rileva la temperatura e l'umidità;
- Come seconda cosa rilevo la temperatura impostata attraverso un resistore variabile, mappando i caratteri partendo da 0 a 1023 arrivando dalla temperatura minima alla temperatura massima;
- Successivamente confronto il valore letto con il valore impostata;
- Se la temperatura letta è superiore alla temperatura impostata il led si spegne, se è inferiore il led si accende;
- Verifico se il bottone viene premuto;
- Se esso viene premuto stampo una scritta sul display LCD che può essere temperatura impostata, letta, e umidità
Schema elettrico
modificaQui si trovalo schema elettrico.
Il potenziometro è collegato con il pin1 ai 5V, con il pin 2 al pin Analogico 5 dell'Arduino Uno, il pin3 è collegato a massa;
Il display LCD è collegato in riferimento alla wiki di Arduino;
Il pulsante è collegato ai 5V e tramite una resistenza di pull-down al pin numero 10 di Arduino;
Il led collegato con una resistenza da 220Ω e al pin 9 di Arduino;
Il DHT11 è collegato come da datasheet, il pin 1 alla Vcc(5V), il pin 2 ai dati, collegati alla Vcc tramite una resistenza da 10kΩ per forzare il valore di default, che poi è collegato al pin2 di Arduino, il pin 3 non è collegato a niente e il pin 4 a massa.
Schema di montaggio
modificaComponenti utilizzati:
- 1 Arduino Uno;
- 1 Display LCD 16x2;
- 1 DTH11;
- 1 Led rosso;
- 1 Potenziometro 100kΩ;
- 1 Trimmer 10kΩ:
- 1 Pulsante;
- 1 resistenza da 220Ω per il led;
- 1 resistenza da 1kΩ come resistenza di pull-down per il pulsante;
- 1 resistenza da 10kΩ per portare il valore di default del dht11;
- Cavi;
Codice
modificaPer leggere i dati dal sensore di temperatura bisogna importare la libreria Simple DHT11, andando nella voce Skecth, poi nella sezione librerie e cliccare "Gestione librerie", e cercare "Simple DHT11" e cliccare su installa come in immagine.
//Importo le librerie
#include <LiquidCrystal.h>
#include <SimpleDHT.h>
//Inizializzo delle variabili che mi serviranno più avanti
int setTemp = 0, circaUmidita = 0, temperaturaLegg = 10;
int temperatura = 0, umidita = 0;
int riposo = 3, oldRiposoMills = 0;
int stato = 0, erroriConsecutivi = 0;
int led = 9;
int valButtonHold = LOW, menu = LOW, hold = 0;
int tMax = 22, tMin = 10;
//Componenti esterne: pulsanti, potenziometri ecc...
const int potTemp = A5;
const int btn = 10;
//inizializzo DHT11
const int DHTPIN = 2; //da definire
SimpleDHT11 dht11;
//Inizializzo display LCD
const int rs = 8, e = 7, d4 = 6, d5 = 5, d6 = 4, d7 = 3;
LiquidCrystal lcd(rs, e, d4, d5, d6, d7);
void setup() {
//Inizializzo il display
lcd.begin(16, 2);
//Inizializzo i pin di input e output
pinMode(led, OUTPUT);
pinMode(btn, INPUT);
}
void loop() {
oldRiposoMills = millis();
// Controllo della temperatura e dell'umidità nell'ambiente
byte t = 0;
byte u = 0;
int err = SimpleDHTErrSuccess;
//Controllo degli errori
if ((err = dht11.read(DHTPIN, &t, &u, NULL)) != SimpleDHTErrSuccess) {
erroriConsecutivi++;
//Serial.println(err);
return;
}
if (erroriConsecutivi >= 3) {
//lcd.clear();
//lcd.print("Errore nel rilevamento temperatura ");
erroriConsecutivi--;
}
erroriConsecutivi = 0;
// Valori definiti
temperatura = (int)t;
umidita = (int)u;
// Controllo della temperatura impostata
if (setTemp != analogRead(potTemp)) {
setTemp = analogRead(potTemp);
// Converto il valore analogico della temperatura in un valore leggibile
// Range temperature 10 a 22
temperaturaLegg = map(setTemp, 0 ,1023, tMin, tMax);
}
int valButton = digitalRead(btn);
//Controllo se il pulsante viene premuto
if(valButton == HIGH && valButtonHold == LOW) {
if (hold > 3) {hold = 0;}
else {hold++;}
valButtonHold = valButton;
} else {valButtonHold = LOW;}
//Confronto temperatura letta e la temperatura impostata
if (temperaturaLegg > temperatura) {digitalWrite(led, HIGH);}
else {digitalWrite(led, LOW);}
//Controllo di cosa mostrare sul display
if (hold == 0) {
lcd.clear();
lcd.print("Temp. impostata:");
lcd.setCursor(0,1);
lcd.print(temperaturaLegg);
}
if (hold == 1) {
lcd.clear();
lcd.print("Temp. letta:");
lcd.setCursor(0,1);
lcd.print(temperatura);
}
if (hold == 2) {
lcd.clear();
lcd.print("Umidita");
lcd.setCursor(0,1);
lcd.print(umidita);
}
}
Conclusioni
modificaQuesto circuito è piuttosto semplice, e al posto del led ci si può collegare un circuito di potenza per poter controllare davvero il riscaldamento domestico, oppure si potrebbe modificare il codice per controllare anche l'umidità.
Insomma si potrebbero implementare un sacco di features.