ARD001 – Controllo temperatura umidità
Avere sotto controllo la temperatura e l'umidità di un ambiente è determinante per stabilirne la salubrità e/o per ottenere determinati scopi, come ricreare specifici ambienti naturali.
Questo progetto può essere utilizzato per controllare temperatura e umidità in terrari, allevamenti, cantine, o anche nel proprio laboratorio, ufficio o garage.
Per ottimizzare costi benefici e realizzare un progetto versatile facilmente espandibile, ad esempio anche al pilotaggio di periferiche esterne, abbiamo deciso di utilizzare il famosissimo Arduino Nano.
Arduino da solo non è però sufficiente in quanto mancante del Real Time Clock(RTC), sarà inoltre necessario utilizzare un sensore di temperatura umidità e un display LCD.
La sola connessione del display LDC occuperebbe almeno 7 PIN di I/O su Arduino, questo non è accettabile.
Viste i numerosi dispositivi da connettere e la scarsa disponibilità dei PIN di I/O si è reso necessario cambiare la modalità di comunicazione da e verso i componenti, in particolare abbiamo deciso per l'utilizzo del protocollo seriale I2C questo implica l'utilizzo di un modulo adattatore per il display LCD.
1 Arduino Nano (anche compatibile)
1 Modulo RTC compatibile I2C tipo DS1307
1 sensore di temperatura umidità DTH11 o compatibile
1 modulo I2C_LCD1602
1 display LCD 16x2 tipo HD44780
1 scatola di derivazione dimensioni 8,5 cm di lato
1 batteria di 9 volt
1 clip per batteria 9 volt
1 interruttore microswitch
Per la sperimentazione:
Basetta millefori e tanti jumper
Qui la foto con i componenti pronti al montaggio:
Qui di seguito lo schema di montaggio:
Il sensore utilizzato da noi è un compatibile con il DTH11, tenete conto che primo e ultimo pin sono l'alimentazione mentre il centrale invia i segnali di trasformazione. Fate attenzione a non invertire la polarità di alimentazione.
Attenzione che nella visione di montaggio qui a sinistra la linea rossa rappresenta la massa mentre quella blu il positivo!
Come potete vedere i segnali SCL (A5) e SDA (A4) seguono il seguente flusso:
Arduino -> RTC -> I2C_LCD1602
Il sensore DTH11 viene alimentato a 5V da Arduino stesso ed il suo segnale di uscita viene letto dal pin D11.
Qui di seguito la foto del montaggio del prototipo su millefori:
Fase di preparazione:
Per prima cosa, collegate Arduino e il modulo RTC via I2C, avviate Arduino IDE ed impostare l'orario eseguendo il seguente programma:
#include <Wire.h> #include <Time.h> #include <TimeLib.h> #include <DS1307RTC.h> const char *monthName[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; tmElements_t tm; void setup() { bool parse=false; bool config=false; // get the date and time the compiler was run if (getDate(__DATE__) && getTime(__TIME__)) { parse = true; // and configure the RTC with this info if (RTC.write(tm)) { config = true; } } Serial.begin(9600); while (!Serial) ; // wait for Arduino Serial Monitor delay(200); if (parse && config) { Serial.print("DS1307 configured Time="); Serial.print(__TIME__); Serial.print(", Date="); Serial.println(__DATE__); } else if (parse) { Serial.println("DS1307 Communication Error :-{"); Serial.println("Please check your circuitry"); } else { Serial.print("Could not parse info from the compiler, Time=\""); Serial.print(__TIME__); Serial.print("\", Date=\""); Serial.print(__DATE__); Serial.println("\""); } } void loop() { } bool getTime(const char *str) { int Hour, Min, Sec; if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false; tm.Hour = Hour; tm.Minute = Min; tm.Second = Sec; return true; } bool getDate(const char *str) { char Month[12]; int Day, Year; uint8_t monthIndex; if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false; for (monthIndex = 0; monthIndex < 12; monthIndex++) { if (strcmp(Month, monthName[monthIndex]) == 0) break; } if (monthIndex >= 12) return false; tm.Day = Day; tm.Month = monthIndex + 1; tm.Year = CalendarYrToTm(Year); return true; }
Questo codice serve ad inizializzare il modulo RTC secondo l'orario impostato sul nostro PC.
Una volta impostato l'orario correttamente, procedete a collegare il resto dei componenti ed eseguite il seguente programma:
#include <DS1307RTC.h> #include <TimeLib.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #define BACKLIGHT_PIN 3 LiquidCrystal_I2C lcd(0x27, 16, 2); #include <SimpleDHT.h> int pinDHT11 = 11; SimpleDHT11 dht11; const char *monthName[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; void setup() {
lcd.begin(16, 2); lcd.setBacklight(HIGH); Serial.begin(9600); } void loop() { tmElements_t tm; if (RTC.read(tm)) { //1th Line //Print time HH:MI:SS lcd.setCursor (0, 0); lcd.print("Time: "); LCDprint2digits(tm.Hour); lcd.print(':'); LCDprint2digits(tm.Minute); lcd.print(':'); LCDprint2digits(tm.Second); //2th Line //Print DD/MM/YYYY lcd.setCursor (0, 1); LCDprint2digits(tm.Day); lcd.print('/'); lcd.print(monthName[tm.Month-1]); lcd.print('/'); lcd.print(tmYearToCalendar(tm.Year)); // clear the rest of the second line lcd.setCursor (11, 1); lcd.print(' '); lcd.setCursor (12, 1); lcd.print(' '); lcd.setCursor (13, 1); lcd.print(' '); lcd.setCursor (14, 1); lcd.print(' '); lcd.setCursor (15, 1); lcd.print(' '); } else { if (RTC.chipPresent()) { lcd.println("DS1307 started."); lcd.println("Iniz. orologio"); } else { lcd.setCursor (0, 0); lcd.print("DS1307 errore"); lcd.setCursor (0, 1); lcd.print("Verifica conness"); Serial.println("Impossibile leggere da DS1307"); } delay(9000); } delay(2000); // read the value from the sensor byte temperature = 0; byte humidity = 0; int err = SimpleDHTErrSuccess; if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) { Serial.print("Impossibile leggere da DHT11, err="); Serial.println(err); delay(1000); return; } Serial.print("Temp/Hum="); Serial.print((int)temperature); Serial.print(" *C, "); Serial.print((int)humidity); Serial.println(" %H"); //2th Line //Show temperature and humidity lcd.setCursor (0, 1); lcd.print((float)temperature); lcd.print(" C/"); lcd.print((float)humidity); lcd.print(" %H"); delay(5000); } void LCDprint2digits(int number) { if (number >= 0 && number < 10) { lcd.write('0'); } lcd.print(number); }
Il codice esegue il setup del display LCD volta impostato l'orario correttamente, ogni 5 secondi legge il tempo, la temperatura e l'umidità e li mostra sul display.
Verificato che tutto funzioni correttamente saldate gli estremi della clip 9 volt ai pin Vin (+) e GND (-).
Importante: non alimentate contemporaneamente Arduino dalla presa USB e dai PIN Vin e GND, questo brucerà il microcontrollore.
Una volta assemblato tutto nella scatola ricordate di eseguire almeno due fori di areazione nei lati per mermettere una lettura adeguata da parte del sensore DTH.
Buon divertimento e Buona Pasqua!
Lascia una Risposta
Devi essere connesso per inviare un commento.
Buongiorno
Vorrei acquistare il kit per il controllo della temperatura e umidità, ma nel relativo kit non c’è la possibilità di aggiungerlo nel carrello. Come posso fare?
Grazie.
Salve, questo KIT non è in vendita, trova tutte le istruzioni per realizzarlo in proprio nell’articolo. Buon Divertimento!
Ho comprato il kit con il display LCD I2C e l’orologio RTC. Ho montato il circuito L’impostazione dell’orario nell’orologio ha funzionato (lo vedo nel Serial Monitor), ma non riesco a visualizzarlo sul display. Ho scaricato le librerie LiquidCrystal_I2C.h, TimeLib.h, SimpleDHT.h e DS1307RTC.h, ma non ha funzionato. L’IDE non mi da’ nessun errore ma non appare nulla sul display. Come posso fare?
Salve, dalla descrizione del problema è molto probabile che sia sbagliato il collegamento tra l’orologio e il display, si prega di controllare i collegamenti.
Se da controllo le linee SCL e SDA risultano corrette sia su RTC che sull’adattatore del display I2C.
Verificare che l’indirizzo del display sia quello corretto, talvolta cambia tra un modello e l’altro.
Salve, al momento ancora non vendiamo KIT di Arduino, altresì sviluppiamo e pubblichiamo progetti che usano questo micro-controllore.