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.

Elenco componenti:

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!

Ti è piaciuto questo progetto?
Iscrivite oggi stesso alla nostra newsletter e ricevi gli aggiornamenti su tutti i nostri nuovi progetti direttamente nella tua email!
I agree to have my personal information transfered to MailChimp ( more information )
5 Commenti
  1. s.desantis91 49 anni ago
    • studiotopweb 49 anni ago
      • s.desantis91 49 anni ago
        • studiotopweb 49 anni ago
    • studiotopweb 49 anni ago

Lascia una Risposta

Web Hosting