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