/* * 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 lettura_ts = 0; //conterrà l'ultimo valore "millis" in cui è stata controllata la temperatura unsigned long lettura_interval = 5000; //intervallo di check e controllo temperatura unsigned long ultimapressione = 0; //conterrà l'ultimo valore "millis" in cui è stata controllata la temperatura int soglia_umidita = 5; //variazione minima umidità per accendere led // se true disattiva led e buzzer boolean spento_led = false; boolean spento_beep = false; boolean statopulsante = false; boolean serial = true; unsigned long currentMillis = 0; unsigned long pulsante_ts = 0; unsigned long pulsante_interval = 1000; int noled = 9; int rosso = 1; int verde = 2; int blu = 3; char buff[50]; 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, RISING); Serial.begin(9600); avvio(); } void loop() { currentMillis = millis(); //se ho premuto il pulsante attendo il tempo necessario a visualizzare il messaggio e rivalorizzo i millis di lettura if ((statopulsante) && (currentMillis - pulsante_ts > pulsante_interval)) { statopulsante = false; tempLCD(); lettura_ts = currentMillis; } //verifico se è il momento di aggiornare i dati sul display se non ho attivato il pulsante if ((currentMillis - lettura_ts > lettura_interval ) && statopulsante == false) { lettura_ts = currentMillis; if (serial) Serial.println("Nuova lettura"); //visualizzo i dati sul display tempLCD(); if (serial){ Serial.print("T ril: "); Serial.println(t); Serial.print("T pre: "); Serial.println(to); Serial.print("H ril: "); Serial.println(h); Serial.print("H pre: "); Serial.println(ho); } if ((to != t) && (to != 0)) { //se cambia la temperatura if (to < t){ //se la temperatura è aumentata accendo il led rgb verde accendiLed(verde); beep(verde); }else{ //se la temperatura è scesa accendo il led rgb rosso accendiLed(rosso); beep(rosso); } }else{ //se non è cambiata la temperatura verifico la variazione dell'umidità if ((ho > h+soglia_umidita-1 || ho < h-soglia_umidita-1) && (ho != 0)){ //se non è variata la temperatura ma è variata l'umidità di almeno 5 punti percentuali suono 2000 e accendo il led blu accendiLed(blu); beep(blu); } } } } void spegni(){ statopulsante = true; pulsante_ts = millis(); if (spento_led && spento_beep){ spento_led = false; spento_beep = false; beep(4); lcd.clear(); lcd.setCursor(0,0); lcd.print("Audio e Led "); lcd.setCursor(0,1); lcd.print("Attivati "); if (serial){ Serial.println("Audio e Led Attivati"); Serial.println(digitalRead(interruptPin)); } }else{ accendiLed(noled); spento_led=true; spento_beep=true; lcd.clear(); lcd.setCursor(0,0); lcd.print("Audio e Led "); lcd.setCursor(0,1); lcd.print("Disattivati "); if (serial){ Serial.println("Audio e Led Disattivati"); Serial.println(digitalRead(interruptPin)); } } if (serial){ Serial.print("Pulsante: "); Serial.println(digitalRead(interruptPin)); Serial.print("Valore: "); Serial.println(digitalRead(interruptPin)-1); } } void tempLCD(){ //memorizzo le letture precedenti to = t; ho = h; //leggo temperatura e umidità t = dht.readTemperature(); h = dht.readHumidity(); //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 i 2 secondi necessari a ricevere i dati dal DHT11 //nell'attesa accendo tutti i led e mostro un messaggio "Avvio in corso..." //sempre che le variabili spento_led e spento_beep non siano attive if (serial){ sprintf(buff, "Spento led: %1, Spento beep: %2", spento_led, spento_beep); Serial.println(buff); } delay(500); //accendo rosso lcd.setCursor(8,1); lcd.print("."); accendiLed(1); beep(1); delay(500); //accendo verde lcd.setCursor(9,1); lcd.print("."); accendiLed(2); beep(2); delay(500); //accendo blu lcd.setCursor(10,1); lcd.print("."); accendiLed(3); beep(3); delay(500); //visualizzo dati su LCD tempLCD(); //spengo il led digitalWrite(RED,LOW); digitalWrite(GREEN,LOW); digitalWrite(BLUE,LOW); } void accendiLed(int c){ if (spento_led) return; if (serial) Serial.print(c); switch (c){ case 1: digitalWrite(RED,HIGH); digitalWrite(GREEN,LOW); digitalWrite(BLUE,LOW); if (serial) Serial.print(c); break; case 2: digitalWrite(RED,LOW); digitalWrite(GREEN,HIGH); digitalWrite(BLUE,LOW); if (serial) Serial.print(c); break; case 3: digitalWrite(RED,LOW); digitalWrite(GREEN,LOW); digitalWrite(BLUE,HIGH); if (serial) Serial.print(c); break; case 9: digitalWrite(RED,LOW); digitalWrite(GREEN,LOW); digitalWrite(BLUE,LOW); if (serial) Serial.print(c); break; } } void beep(int b){ if (spento_beep) return; switch (b){ case 1: tone(buzzer,1000,200); break; case 2: tone(buzzer,2000,200); break; case 3: tone(buzzer,3000,200); break; case 4: tone(buzzer,4000,100); break; } }