Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * 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 <LiquidCrystal.h>
- #include <DHT.h>
- //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;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement