
I post all my code:
#include <dht.h>
#include <EEPROM.h>
#include <DHT22.h>
#include <LiquidCrystal.h>
//Definisco tutti i PIN
#define UMIDIFICATORE A4
#define RISCALDATORE A5
#define DHT22_PIN 13
#define DHT11_PIN 12
#define RETROILL 10
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
//Definisco l'istanza DHT22
DHT22 myDHT22(DHT22_PIN);
//Definisco l'istanza DHT11
dht DHT;
//Inizializzo il display Hitachi HDD7780 (16x2)
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
//Creo il menù e il submenù
char* menu_principale[4] = {
"Home","Temperatura","Umidita'ambiente","Configurazione" };
char* submenut[2] = {
"Tmax","Tmin" };
char* submenuh[2] = {
"Hmax","Hmin" };
//Definisco la struttura per temperatura e umidità
typedef struct t_Envir{
double tmax;
double tmin;
int hmax;
int hmin;
} Envir;
Envir setting();
//Carattere speciale "ARROW"
byte arrow[8] = {0,4,6,31,6,4,0,0};
//Variabili
float temp = 0;
int posizione = 0;
double tmax = 0;
double tmin = 0;
int hmax = 0;
int hmin = 0;
//Variabili gestione pulsanti
int lcd_key = 0;
int adc_key_in = 0;
//Variabili che uso per lo standby della retroilluminazione del display
int time = 0;
int brightness = 255;
void setup(){
Serial.begin(9600);
//Inizializzazione lcd
lcd.begin(20,4);
//Inizializzazione PIN (INPUT - OUTPUT)
pinMode(RISCALDATORE, OUTPUT);
digitalWrite(RISCALDATORE, LOW);
pinMode(UMIDIFICATORE, OUTPUT);
digitalWrite(UMIDIFICATORE, LOW);
pinMode(RETROILL, OUTPUT);
analogWrite(RETROILL, brightness);
//Pulisco e setto il display
lcd.clear();
lcd.setCursor(0,0);
lcd.print("LOADING...");
delay(2000);
//Creo il carattere
lcd.createChar(0, arrow);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Home");
}
void loop(){
DHT22_ERROR_t errorCode;
boolean flag = false;
boolean fly = false;
lcd_key = read_LCD_buttons();
int m = 0;
errorCode = myDHT22.readData();
//Inizializzo il sensore DHT11
int chk = DHT.read11(DHT11_PIN);
//Gestisco il sensore di umidità e temperatura DHT11
switch (chk)
{
case DHTLIB_OK:
//Serial.print("OK,\t");
break;
case DHTLIB_ERROR_CHECKSUM:
//Serial.print("Checksum error,\t");
break;
case DHTLIB_ERROR_TIMEOUT:
//Serial.print("Time out error,\t");
break;
default:
//Serial.print("Unknown error,\t");
break;
}
int a;
int b;
//Gestisco il sensore di umidità e temperatura DHT22
switch(errorCode)
{
case DHT_ERROR_NONE:
//Serial.print("Got Data ");
//Serial.print(myDHT22.getTemperatureC());
//Serial.print("C ");
//Serial.print(myDHT22.getHumidity());
//Serial.println("%");
// Alternately, with integer formatting which is clumsier but more compact to store and
// can be compared reliably for equality:
//
char buf[128];
sprintf(buf, "Integer-only reading: Temperature %hi.%01hi C, Humidity %i.%01i %% RH",
myDHT22.getTemperatureCInt()/10, abs(myDHT22.getTemperatureCInt()%10),
myDHT22.getHumidityInt()/10, myDHT22.getHumidityInt()%10);
//Serial.println(buf);
break;
case DHT_ERROR_CHECKSUM:
//Serial.print("check sum error ");
//Serial.print(myDHT22.getTemperatureC());
//Serial.print("C ");
//Serial.print(myDHT22.getHumidity());
//Serial.println("%");
break;
case DHT_BUS_HUNG:
//Serial.println("BUS Hung ");
break;
case DHT_ERROR_NOT_PRESENT:
//Serial.println("Not Present ");
break;
case DHT_ERROR_ACK_TOO_LONG:
//Serial.println("ACK time out ");
break;
case DHT_ERROR_SYNC_TIMEOUT:
//Serial.println("Sync Timeout ");
break;
case DHT_ERROR_DATA_TIMEOUT:
//Serial.println("Data Timeout ");
break;
case DHT_ERROR_TOOQUICK:
//Serial.println("Polled to quick ");
break;
}
//Standby
time++;
if(time == 300){
while(brightness != 0){
brightness = brightness - 1;
analogWrite(RETROILL, brightness);
delay(10);
}
}
if(lcd_key != btnNONE && brightness == 0){
brightness = 255;
if(digitalRead(RETROILL) == 0){
if(lcd_key == btnRIGHT){
analogWrite(RETROILL, brightness);
posizione--;
}
else if(lcd_key != btnNONE){
analogWrite(RETROILL, brightness);
}
time = 0;
}
}
//Menù
if(lcd_key == btnRIGHT){
posizione++;
flag = true;
} else if(lcd_key == btnLEFT){
posizione--;
flag = true;
}
//Inizializzo le sogliee con i valori salvati nella EEPROM
tmax = EEPROM_readDouble(0);
tmin = EEPROM_readDouble(4);
//Inizializzo le sogliee con i valori salvati nella EEPROM
hmax = EEPROM_readInt(8);
hmin = EEPROM_readInt(10);
if ( posizione > 3 )
posizione = 0;
if ( posizione < 0 )
posizione = 0;
switch(posizione){
case 0:
if(flag == true){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(menu_principale[0]);
//flag = false;
}
lcd.setCursor(0,1);
//Visualizzo i valori letti dal sensore DHT22
lcd.print("T1: ");
lcd.print(myDHT22.getTemperatureC(),1);
lcd.print("C ");
lcd.print("H1: ");
lcd.print(myDHT22.getHumidity(),1);
lcd.print("%");
lcd.setCursor(0,2);
//Visualizzo i valori letti dal sensore DHT11
lcd.print("T2: ");
lcd.print(DHT.temperature,0);
lcd.print("C ");
lcd.print("H1: ");
lcd.print(DHT.humidity,0);
lcd.print("%");
lcd.setCursor(0,3);
lcd.print(" Destra");
lcd.write(byte(0));
lcd.print("Menu'");
delay(300);
break;
case 1:
if(flag == true){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(menu_principale[1]);
lcd.setCursor(1,1);
lcd.print(submenut[0]);
lcd.setCursor(1,2);
lcd.print(submenut[1]);
Envir result = setting();
//Imposto le soglie di temperature
tmax = result.tmax;
tmin = result.tmin;
//Controllo soglie temperatura
if(tmin > tmax){
tmin = tmax - 4;
lcd.setCursor(0,1);
lcd.print(tmin);
}
}
//Salvo le soglie nella EEPROM
EEPROM_writeDouble(0, tmax);
EEPROM_writeDouble(4, tmin);
time = 0;
delay(200);
break;
case 2:
if(flag == true){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(menu_principale[2]);
//Imposte le soglie di umidità
hmax = set_hum_max();
hmin = set_hum_min();
//Serial.println(menu_principale[2]);
// flag = false;
//Controllo soglie umidità
if(hmin > hmax){
hmin = hmax - 10;
lcd.setCursor(0,1);
lcd.print(hmin);
}
}
//Salvo le soglie nella EEPROM
EEPROM_writeInt(8, hmax);
EEPROM_writeInt(10, hmin);
time = 0;
delay(200);
break;
case 3:
if(flag == true){
lcd.clear();
//Visualizzo le tutte le soglie impostate
lcd.setCursor(0,0);
//lcd.print(menu_principale[3]);
lcd.print("H:");
lcd.print(hmax);
lcd.print("-");
lcd.print(hmin);
lcd.print("% ");
lcd.setCursor(0,1);
lcd.print("T:");
lcd.print(tmax);
lcd.print("C ");
lcd.print(tmin);
lcd.print("C ");
//flag = false;
}
time = 0;
delay(200);
break;
}
}