/* * ARDUINO TEST N.1 * Descrizione funzionamento: * Rilevatore di temperatura e umidità su display 1602 con le seguenti caratteristiche: * - beep frequenza 1000 al cambio di temperatura * - beep frequenza 2000 al cambio di umidità di almeno 3 punti percentuali * - accensione led ROSSO se la temperatura scende * - accensione led VERDE se la temperatura sale * - accensione led BLU se l'umidità cambia di almeno 3 punti percentuali * - pulsane di spegnimento led * - potenziometro regolatore display * The circuit: * LCD RS pin to digital pin 7 * LCD Enable pin to digital pin 8 * LCD D4 pin to digital pin 9 * LCD D5 pin to digital pin 10 * LCD D6 pin to digital pin 11 * LCD D7 pin to digital pin 12 * LCD R/W pin to ground * LCD VSS pin to ground * LCD VCC pin to 5V * 10K resistor: * ends to +5V and ground * wiper to LCD VO pin (pin 3) * * BUTTON to digital pin 2 * * DHT to digital pin 13 * * BUZZER to digital pin 4 */ // include the library code: #include #include //definisco il DHT11 #define DHTPIN 13 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); // initialize the library with the numbers of the interface pins LiquidCrystal lcd(7, 8, 9, 10, 11, 12); //definisco i pin del led RGB #define BLUE 3 #define GREEN 5 #define RED 6 // definisco il pin del buzzer int buzzer = 4; //definisco le variabili di temperature e umidità int t = dht.readTemperature(); int h = dht.readHumidity(); //definisco le variabili che uso per memorizzare i valori precedenti int to = t; int ho = h; //definisco l'interrupt alla pressione del pulsante sul pin 2 const byte interruptPin = 2; int val = 0; unsigned long previousMillis = 0; //conterrà l'ultimo valore "millis" in cui è stata controllata la temperatura unsigned long interval = 5000; //intervallo di check e controllo temperatura unsigned long ultimapressione = 0; //conterrà l'ultimo valore "millis" in cui è stata controllata la temperatura int sogliaH = 5; //variazione minima umidità per accendere led // se true disattiva led e buzzer boolean spento = true; void setup() { // preimposto il contenuto del LCD lcd.begin(16, 2); lcd.print("Avvio"); lcd.setCursor(0,1); lcd.print("in corso"); //imposto il buzzer su output pinMode(buzzer,OUTPUT); //imposto il led rbg su output pinMode(RED,OUTPUT); pinMode(GREEN,OUTPUT); pinMode(BLUE,OUTPUT); //imposto il led rgb su spento digitalWrite(RED,LOW); digitalWrite(GREEN,LOW); digitalWrite(BLUE,LOW); // pinMode(BUTTON, INPUT); pinMode(interruptPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin), spegni, CHANGE); Serial.begin(9600); } void loop() { if (to == 0){ //all'accesione eseguo la procedura di Avvio avvio(); } // controllo quanto è passato dall'ultima lettura, se ho superato l'intervallo indicato allora rieseguo la lettura unsigned long currentMillis = millis(); if (((currentMillis - previousMillis > interval) ) or ( to == 0)) { previousMillis = currentMillis; Serial.println("Trascorsi 5 secondi"); //leggo temperatura e umidità t = dht.readTemperature(); h = dht.readHumidity(); tempLCD(); Serial.print("T ril: "); Serial.println(t); Serial.println("T pre: "); Serial.println(to); Serial.println("H ril: "); Serial.println(h); Serial.println("H pre: "); Serial.println(ho); if ((to > 0) && ((!spento))){ if (to != t) { //se cambia la temperatura buz di 1000 if (to < t){ //se la temperatura è aumentata accendo il led rgb verde onVerde(); }else{ //se la temperatura è scesa accendo il led rgb rosso onRosso(); } }else{ if (ho > h+sogliaH-1 || ho < h-sogliaH-1){ //se non è variata la temperatura ma è variata l'umidità di almeno 5 punti percentuali suono 2000 e accendo il led blu onBlu(); } } } //salvo i valori precedenti to = t; ho = h; } } void spegni(){ //if ((1 - digitalRead(interruptPin)) == 0 && (to > 0)){ if ((1 - digitalRead(interruptPin)) == 0 ){ if (spento){ spento = false; lcd.clear(); lcd.setCursor(0,0); lcd.print("Audio e Led "); lcd.setCursor(0,1); lcd.print("Attivati "); delay(1000); // tempLCD(); Serial.println("Audio e Led Attivati"); }else{ spento=true; lcd.clear(); lcd.setCursor(0,0); lcd.print("Audio e Led "); lcd.setCursor(0,1); lcd.print("Disattivati "); delay(1000); // tempLCD(); Serial.println("Audio e Led Disattivati"); } Serial.print("Pulsante: "); Serial.println(spento); //spengo i led in ogni caso digitalWrite(RED,LOW); digitalWrite(GREEN,LOW); digitalWrite(BLUE,LOW); } } void tempLCD(){ //visualizzo i dati sul display lcd.clear(); lcd.setCursor(0,0); lcd.print("Temperatura "); lcd.setCursor(0,1); lcd.print("Umidita' "); // scrivo temperatura e umidità sul display lcd.setCursor(12, 0); lcd.print(t); lcd.setCursor(14, 0); lcd.print(char(223)); lcd.setCursor(15, 0); lcd.print("C"); lcd.setCursor(12, 1); lcd.print(h); lcd.setCursor(14, 1); lcd.print("%"); } void avvio(){ //Attendo 2 secondi altrimenti non valorizza le variabili del DHT11 //nell'attesa accendo tutti i led e mostro un messaggio "Avvio in corso..." (vedi setup) //se in avvio la variabile spento è true, accendo i led ma non emetto suoni Serial.println(spento); delay(500); //accendo rosso lcd.setCursor(8,1); lcd.print("."); digitalWrite(RED,HIGH); digitalWrite(GREEN,LOW); digitalWrite(BLUE,LOW); if (!spento) tone(buzzer,1000,200); delay(500); //accendo verde lcd.setCursor(9,1); lcd.print("."); digitalWrite(RED,LOW); digitalWrite(GREEN,HIGH); digitalWrite(BLUE,LOW); if (!spento) tone(buzzer,2000,200); delay(500); //accendo blu lcd.setCursor(10,1); lcd.print("."); digitalWrite(RED,LOW); digitalWrite(GREEN,LOW); digitalWrite(BLUE,HIGH); if (!spento) tone(buzzer,3000,200); delay(500); //spengo il led spegni(); //delay(3000); } void onVerde(){ digitalWrite(RED,LOW); digitalWrite(GREEN,HIGH); digitalWrite(BLUE,LOW); tone(buzzer,1000,200); } void onRosso(){ digitalWrite(RED,HIGH); digitalWrite(GREEN,LOW); digitalWrite(BLUE,LOW); tone(buzzer,2000,200); } void onBlu(){ digitalWrite(RED,LOW); digitalWrite(GREEN,LOW); digitalWrite(BLUE,HIGH); tone(buzzer,3000,200); }