chrisdaloa icon

Test Restyling

chrisdaloa | PRO | 10/27/17 10:29:29 PM UTC | 0 ⭐ | 479 👁️ | Never ⏰ | []
C++ |

9.07 KB

|

None

|

0 👍

/

0 👎

 
 
/*
 * 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;
    }
}

Comments