Programma
Programma
h>
#include <DS1302.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <Servo.h>
#define invertpol 22 //invertitore polarità cella di
Pelitier
#define peltier 27 //alimentazione cella di Peltier
#define irrig 23 //pompa irrigazione
#define vent 24 //ventilazione serra
#define illum 25 //illuminazione led notturna
#define clim 26//ventole climatizzazione con cella di
Peltier
#define livserb A8 //livello acqua serbatoio
#define umidterreno1 A9 //pin sensore1 umidità
terreno
#define umidterreno2 A10 //pin sensore2 umidità
terreno
//DHT11
#define DHTPIN 7
#define DHTTYPE DHT11
#define p1 53 //selettore modlità AUTO/MAN
#define p2 52 //irrigazione manuale
#define p3 51 //ventilazione manuale
#define p4 50 //illuminazione manuale
#define p5 49 //riscaldamento manuale
#define p6 48 //apertura finestre manuale
#define l1red 45 //led rosso irrigazione
#define l2red 44 //led rosso ventilazione
#define l3red 43 //led rosso illuminazione
#define l4red 42 //led rosso riscaldamento
#define l5red 41 //led rosso raffrescamento
#define l1green 39 //led verde irrigazione
#define l2green 38 //led verde ventilazione
#define l3green 37 //led verde illuminazione
#define l4green 36 //led verde riscaldamento
#define l5green 35 //led verde raffrescamento
#define buzzer1 12 //buzzer1
#define buzzer2 13 //buzzer2
//VARIABILI DI UMIDITÀ E TEMPERATURA
float temp;
float hum;
//SETTAGGIO SERVOMOTORI FINESTRE
int val1=1;
int val11=90;
int val2=90;
int val22=1;
int flagAUTO=1;
int flagMAN=1;
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x3F, 20, 4); //DISPLAY 20X4
DS1302 rtc(2, 3, 4);
Servo myservo1;
Servo myservo2;
void setup()
{
analogWrite(buzzer1, 0);
analogWrite(buzzer1, 0);
dht.begin(); //inizializza DHT11
lcd.begin(); //inizializza LCD
myservo1.attach(8); //pin Servo1
myservo2.attach(9); //pin Servo2
myservo1.write(val11);
myservo2.write(val22);
rtc.halt(false); //RTC DS1302
rtc.writeProtect(false); //RTC DS1302
/* DOPO AVER CARICATO IL PROGRAMMA CON LA DATA E
L'ORA CORRETTE,
COMMENTARLE PER I CARICAMENTI SUCCESSIVI
rtc.setDOW(MONDAY); // GIORNO DELLA SETTIMANA
rtc.setTime(10, 35, 0); // ORA FORMATO 24Hr
rtc.setDate(29, 6, 2018); // DATA */
//IMPOSTAZIONE PIN DI INPUT/OUTPUT
pinMode(invertpol, OUTPUT);
pinMode(peltier, OUTPUT);
pinMode(irrig, OUTPUT);
pinMode(vent, OUTPUT);
pinMode(illum, OUTPUT);
pinMode(clim, OUTPUT);
pinMode(livserb, INPUT);
pinMode(umidterreno1, INPUT);
pinMode(umidterreno2, INPUT);
pinMode(p1, OUTPUT);
pinMode(p2, OUTPUT);
pinMode(p3, OUTPUT);
pinMode(p4, OUTPUT);
pinMode(p5, OUTPUT);
pinMode(p6, OUTPUT);
pinMode(l1red, OUTPUT);
pinMode(l2red, OUTPUT);
pinMode(l3red, OUTPUT);
pinMode(l4red, OUTPUT);
pinMode(l5red, OUTPUT);
pinMode(l1green, OUTPUT);
pinMode(l2green, OUTPUT);
pinMode(l3green, OUTPUT);
pinMode(l4green, OUTPUT);
pinMode(l5green, OUTPUT);
pinMode(buzzer1, OUTPUT);
pinMode(buzzer2, OUTPUT);
//SETTA A 0 I TRASDUTTORI
digitalWrite(irrig,HIGH);
digitalWrite(vent,HIGH);
digitalWrite(illum,HIGH);
digitalWrite(clim,HIGH);
//TEST PANNELLO DI CONTROLLO: breve test per
controllare il
funzionamento dei led del pannello del controllo e
dei buzzer
lcd.setCursor(5,0);
lcd.print("BENVENUTO!");
delay(1000);
lcd.setCursor(1,1);
lcd.print("**TEST PANNELLO**");
digitalWrite(l1red, HIGH);
digitalWrite(l2red, HIGH);
digitalWrite(l3red, HIGH);
digitalWrite(l4red, HIGH);
digitalWrite(l5red, HIGH);
delay(1000);
digitalWrite(l1red, LOW);
digitalWrite(l2red, LOW);
digitalWrite(l3red, LOW);
digitalWrite(l4red, LOW);
digitalWrite(l5red, LOW);
digitalWrite(l1green, HIGH);
digitalWrite(l2green, HIGH);
digitalWrite(l3green, HIGH);
digitalWrite(l4green, HIGH);
digitalWrite(l5green, HIGH);
delay(1000);
digitalWrite(l1green, LOW);
digitalWrite(l2green, LOW);
digitalWrite(l3green, LOW);
digitalWrite(l4green, LOW);
digitalWrite(l5green, LOW);
delay(500);
lcd.setCursor(2,2);
lcd.print("**TEST BUZZER**");
analogWrite(buzzer1, 250);
delay(500);
analogWrite(buzzer1, 0);
delay(500);
analogWrite(buzzer2, 250);
delay(500);
analogWrite(buzzer2, 0);//buzzer2
delay(2000);
lcd.setCursor(0,3);
lcd.print("**TEST COMPLETATO**");
delay(2000);
lcd.clear();
}
void loop()
{
int letturap1;
int letturap2;
int letturap3;
int letturap4;
int letturap5;
int letturap6;
int flag=0;
int flag2=0;
int val1=1;
int val11=90;
int val2=90;
int val22=1;
letturap1=digitalRead(p1);
letturap2=digitalRead(p2);
letturap3=digitalRead(p3);
letturap4=digitalRead(p4);
letturap5=digitalRead(p5);
letturap6=digitalRead(p6);
float umidterr1;
float umidterr2;
float mediaumidterr=0;
float risultatoumidterr=0;
float mapumidterr;
float livellomap;
float livelloread;
String ora = rtc.getTimeStr(); //converte la stringa
dell'ora
in un valore numerico
umidterr1=analogRead(umidterreno1); //gestione
sensori terreno
e calcolo media dei due seganli
umidterr2=analogRead(umidterreno2);
mediaumidterr=umidterr1 + umidterr2;
risultatoumidterr=(mediaumidterr/2);
mapumidterr=map(risultatoumidterr, 0, 1023, 100,
0); //mappa il
valore di umidità terreno da 0 a 100 (Percentuale)
hum = dht.readHumidity(); //gestione umidità e temp
DHT11
temp=dht.readTemperature();
livelloread=analogRead(livserb);
livellomap=map(livelloread, 0, 1023, 100, 10);
if(letturap1==HIGH) //MANUALE
{
if(flagMAN==1)
{
lcd.clear();
delay(250);
lcd.setCursor(6,0);
lcd.print("MAN MODE");
digitalWrite(irrig,HIGH);
digitalWrite(vent,HIGH);
digitalWrite(illum,HIGH);
digitalWrite(clim,HIGH);
digitalWrite(peltier,LOW);
digitalWrite(invertpol,LOW);
digitalWrite(l1red, LOW);
digitalWrite(l2red, LOW);
digitalWrite(l3red, LOW);
digitalWrite(l4red, LOW);
digitalWrite(l5red, LOW);
digitalWrite(l1green, LOW);
digitalWrite(l2green, LOW);
digitalWrite(l3green, LOW);
digitalWrite(l4green, LOW);
digitalWrite(l5green, LOW);
myservo1.write(val11);
myservo2.write(val22);
analogWrite(buzzer1, 250);
delay(250);
analogWrite(buzzer1, 0);
delay(1000);
flagMAN=0;
}
else
if (flagMAN==0)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Ta:");
lcd.print(temp,1);
lcd.print("C");
lcd.setCursor(12,0);
lcd.print("Ha:");
lcd.print(hum,1);
lcd.print("%");
lcd.setCursor(0,1);
lcd.print("Ht:");
lcd.print(mapumidterr,1);
lcd.print("%");
lcd.setCursor(11,1);
lcd.print("Lvl:");
lcd.print(livellomap,1);
lcd.print("%");
lcd.setCursor(0,2);
lcd.print("PUMP:");
lcd.setCursor(8,2);
lcd.print("|AIR:");
lcd.setCursor(16,2);
lcd.print("|M:");
lcd.setCursor(0,3);
lcd.print("LED:");
lcd.setCursor(12,3);
lcd.print(rtc.getTimeStr()); //stringa ora in
hh:mm:ss
flagAUTO=1; //PORTO ALTO IL FLAG CHE INIZIALIZZA LA
MODALITÀ
AUTOMATICA
flagMAN=0; //AZZERO IL FLAG DELLA MODALITÀ MANUALE
if(letturap2==HIGH) //IRRIGAZIONE MANUALE
{ //ON
digitalWrite(irrig, LOW);
digitalWrite(l1green, HIGH);
digitalWrite(l1red, LOW);
lcd.setCursor(5,2);
lcd.print("ON");}
else
{ //OFF
digitalWrite(irrig, HIGH);
digitalWrite(l1green, LOW);
digitalWrite(l1red, HIGH);
lcd.setCursor(5,2);
lcd.print("OFF");}
if(letturap3==HIGH) //VENTILAZIONE+SERVO MANUALI
{ //ON
digitalWrite(vent, LOW);
digitalWrite(l2green, HIGH);
digitalWrite(l2red, LOW);
myservo1.write(val1);
myservo2.write(val2);
lcd.setCursor(13,2);
lcd.print("ON");}
else
{ //OFF
digitalWrite(vent, HIGH);
digitalWrite(l2green, LOW);
digitalWrite(l2red, HIGH);
myservo1.write(val11);
myservo2.write(val22);
lcd.setCursor(13,2);
lcd.print("OFF");}
if(letturap4==HIGH) //LUCI MANUALI
{ //ON
digitalWrite(illum, LOW);
digitalWrite(l3green, HIGH);
digitalWrite(l3red, LOW);
lcd.setCursor(4,3);
lcd.print("ON");}
else
{ //OFF
digitalWrite(illum, HIGH);
digitalWrite(l3green, LOW);
digitalWrite(l3red, HIGH);
lcd.setCursor(4,3);
lcd.print("OFF");
}
if(letturap5==HIGH) //RISCALDAMENTO
{ //ON
digitalWrite(clim, LOW);
digitalWrite(peltier, HIGH);
digitalWrite(l4green, HIGH);
digitalWrite(l4red, LOW);
lcd.setCursor(19,2);
lcd.print("H");
flag=1;}
else
if(letturap5==LOW && flag2==0)
{ //OFF
digitalWrite(clim, HIGH);
digitalWrite(peltier, LOW);
digitalWrite(l4green, LOW);
digitalWrite(l4red, HIGH);
lcd.setCursor(19,2);
lcd.print("");
flag=0;
}
if(letturap6==HIGH) //RAFFREDDAMENTO
{ //ON
digitalWrite(clim, LOW);
digitalWrite(peltier, HIGH);
digitalWrite(invertpol, HIGH);
digitalWrite(l5green, HIGH);
digitalWrite(l5red, LOW);
lcd.setCursor(19,2);
lcd.print("C");
flag2=1;
}
else
if(letturap6==LOW && flag==0)
{ //OFF
digitalWrite(clim, HIGH);
digitalWrite(peltier, LOW);
digitalWrite(invertpol,LOW);
digitalWrite(l5green, LOW);
digitalWrite(l5red, HIGH);
lcd.setCursor(19,2);
lcd.print("");
flag2=0;
}
delay(1000);
}
flagAUTO=1;
}
else
if(letturap1==LOW) //AUTOMATICO
{
if(flagAUTO==1)
{
lcd.clear();
delay(250);
lcd.setCursor(5,0);
lcd.print("AUTO MODE");
digitalWrite(irrig,HIGH);
digitalWrite(vent,HIGH);
digitalWrite(illum,HIGH);
digitalWrite(clim,HIGH);
digitalWrite(peltier,LOW);
digitalWrite(invertpol,LOW);
digitalWrite(l1red, LOW);
digitalWrite(l2red, LOW);
digitalWrite(l3red, LOW);
digitalWrite(l4red, LOW);
digitalWrite(l5red, LOW);
digitalWrite(l1green, LOW);
digitalWrite(l2green, LOW);
digitalWrite(l3green, LOW);
digitalWrite(l4green, LOW);
digitalWrite(l5green, LOW);
myservo1.write(val11);
myservo2.write(val22);
analogWrite(buzzer1, 250);
delay(250);
analogWrite(buzzer1, 0);
delay(1000);
flagAUTO=0;
}
else
{
lcd.clear();
flagAUTO=0; //AZZERO IL FLAG DELLA MODALITÀ
AUTOMATICA
flagMAN=1; //PORTO ALTO IL FLAG CHE INIZIALIZZA LA
MODALITÀ
MANUALE
delay(250);
lcd.setCursor(0,0);
lcd.print("GreenLogic");
lcd.setCursor(12,0);
lcd.print(rtc.getTimeStr()); //stringa ora in
hh:mm:ss
lcd.setCursor(0,1);
lcd.print("TEMPERATURE:"); //stampa TEMPERATURA ARIA
SERRA
lcd.print(temp);
lcd.print("C");
lcd.setCursor(0,2);
lcd.print("AIR HUMIDITY:"); //stampa UMIDITÀ ARIA
SERRA
lcd.print(hum);
lcd.print("%");
lcd.setCursor(11,3);
lcd.print("/WL:");
lcd.print(livellomap);
lcd.setCursor(0,3);
lcd.print("S.H.:"); //stampa UMIDITÀ TERRENO MEDIA
lcd.print(mapumidterr);
lcd.print("%");
if(mapumidterr<=50) //ACCENSIONE POMPA
{digitalWrite(irrig, LOW);
digitalWrite(l1green, HIGH);}
else
if(mapumidterr>=60) //SPEGNIMENTO POMPA
{digitalWrite(irrig, HIGH);
digitalWrite(l1green, LOW);}
if(temp<=18) //ACCENSIONE RISCALDAMENTO
{digitalWrite(peltier, HIGH);
digitalWrite(invertpol, LOW);
digitalWrite(clim, LOW);
digitalWrite(l4green, HIGH);
}
else //SPEGNIMENTO RISCALDAMENTO
if(temp>=21 && temp<=22)
{digitalWrite(peltier, LOW);
digitalWrite(invertpol, LOW);
digitalWrite(clim, HIGH);
digitalWrite(l4green, LOW);
}
if(temp>=36) //ACCENSIONE RAFFREDDAMENTO
{digitalWrite(peltier, HIGH);
digitalWrite(invertpol, HIGH);
digitalWrite(clim, LOW);
digitalWrite(l5green, HIGH);
}
else //SPEGNIMENTO RAFFREDDAMENTO
if(temp>=33 && temp<=34)
{digitalWrite(peltier, LOW);
digitalWrite(invertpol, LOW);
digitalWrite(clim, HIGH);
digitalWrite(l5green, HIGH);
}
if(hum>=80) //ACCENSIONE VENTOLA E APERTURA PORTA
{digitalWrite(vent, LOW);
digitalWrite(l2green, HIGH);
myservo1.write(val1);
myservo2.write(val2);
}
else
if(hum<=70) //SPEGNIMENTO VENTOLA E CHIUSURA PORTE
{digitalWrite(vent, HIGH);
digitalWrite(l2green, LOW);
myservo1.write(val11);
myservo2.write(val22);
}
if(ora>="20:00:00" && ora<="5:00:00")
{
digitalWrite(illum, LOW);
digitalWrite(l3green, HIGH);
}
else
{
digitalWrite(illum, HIGH);
digitalWrite(l3green, LOW);
}
delay(1000);
}
}
}