Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**********************************************************
- * Sistema automatico
- * Irrigazione orto
- * Da pozzo o serbatoi accumulo
- * Usando fonti rinnovabili off-grid
- * RTC - MPL315A2 - Arduino
- * Data creazione 14 Aprile 2020
- * Ultima modifica 6 Giugno 2020
- * autore: Daniele Carrieri
- * mail: dancarri@tiscali.it
- /**********************************************************/
- #include <LiquidCrystal_I2C.h>
- LiquidCrystal_I2C lcd(0x27,20,4);
- #include <RTClib.h> //libreria modulo Real Time Clock
- #include <SoftwareSerial.h> //libreria per creare porte seriali aggiuntive
- #include <Wire.h> //libreria I2C
- #include <Adafruit_MPL3115A2.h> //libreria modulo Altimetro, Barometro, Temperatura
- #include "U8glib.h" //libreria display grafico LCD 128x32
- U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: en=18,rw=16,di=17 A4,A2,A3
- #define SensTemp A0 //sensore di temperatura
- #define RICICLO 3 //pulsante riciclo/antigelo serbatoio
- #define AVVIO 4 //interruttore on/off avvio
- #define LPV 5 //sensore Livello Pozzo Vuoto
- #define LSP 6 //sensore Livello Serbatoio Pieno
- #define LSV 7 //sensore Livello Sebatoio Vuoto
- #define POMPA 9 //pompa acqua
- #define EVI 10 //valvola solenoide 3 vie ingresso pompa
- #define EVU 11 //valvola solenoide 3 vie uscita pompa
- byte STATO=0;
- bool avvio;
- bool lpv=0;
- bool lsv;
- bool lsp;
- bool riciclo;
- int pompa;
- int velmin=64; //impostazione velocità minima pompa
- int velmax=255; //impostazione velocità massima pompa
- bool evi;
- bool evu;
- unsigned long TimeStart;
- float tempminima=2; //impostazione temperatura di solidificazione
- float pascals;
- float altm;
- float temp2C;
- const int RX=12;
- const int TX=13;
- SoftwareSerial HC12 (RX,TX);
- RTC_DS1307 rtc;
- DateTime now = rtc.now();
- int Ora = now.hour();
- int Minuto = now.minute();
- Adafruit_MPL3115A2 baro = Adafruit_MPL3115A2();
- bool pari() //metodo che restituisce un valore booleano, 0 se ora pari, 1 se ora dispari (per ciclo antingelo ogni 2 ore)
- {
- bool oraPari=0;
- int resto;
- resto=Ora%2;
- if (resto==0)
- oraPari=0;
- else
- oraPari=1;
- return oraPari;
- }
- bool consenso() //metodo che restituisce un valore booleano, per dare consenso ad innaffiare all'ora impostata
- {
- bool orto=0;
- int innaffio[]={20,30,21,30};// formato ora_avvio,minuti_avvio,ora_arresto,minuti_arresto
- if (innaffio[0]<=Ora && innaffio[2]>=Ora &&innaffio[1]<=Minuto && innaffio[3]>=Minuto)
- orto=1;
- else
- orto=0;
- return orto;
- }
- float temperatura() //metodo che restituisce la temperatura rilevata
- {
- int valore=analogRead(SensTemp);
- float tempC=valore * 0.48875;
- return tempC;
- }
- void visualizza() // metodo per visualizzare gli stati e I/O su seriale
- {
- Serial.print("Stato : ");
- if(STATO==0)
- Serial.println("pompa ferma");
- else if(STATO==1)
- Serial.println("riempimento serbatoio");
- else if(STATO==2)
- Serial.println("riciclo/antigelo");
- else if(STATO==3)
- Serial.println("irrigazione da pozzo");
- else if(STATO==4)
- Serial.println("irrigazione da serbatoio");
- Serial.print("Avvio : "); Serial.println(avvio);
- Serial.print("Pozzo : "); Serial.println(lpv);
- Serial.print("Liv min: "); Serial.println(lsv);
- Serial.print("Liv max: "); Serial.println(lsp);
- Serial.print("Riciclo: "); Serial.println(riciclo);
- Serial.print("Pompa : "); Serial.println(pompa);
- Serial.print("3Vie In: "); Serial.println(evi);
- Serial.print("3Vie Us: "); Serial.println(evu);
- Serial.print("Temp: "); Serial.print(temperatura()); Serial.println("°C");
- Serial.print("Temp2: "); Serial.print(temp2C); Serial.println("°C");
- Serial.print("Altimetro: "); Serial.print(altm); Serial.println("metri");
- Serial.print("hPa: "); Serial.println(pascals*100);
- /* La pagina indica la pressione in ectoPascal (hPa), equivalente a 0,001 bar.
- * In atmosfesa tipo (ISA), la pressione al livello del mare è 1013,25 hPa
- * con un gradiente barico verticale 1hPa/27ft, descrescente con la quota
- * in questo modo possiamo determinare quando c'è alta o bassa pressione
- * Usare http://www.onlineconversion.com/pressure.htm per altre unità
- */
- Serial.println();
- }
- void draw()
- {
- u8g.setFont(u8g_font_5x7);
- u8g.drawStr( 0, 10, "LUN 24 MAGGIO 2020 20:30"); //esempio per configurare carattere su LCD
- u8g.setFont(u8g_font_7x14);
- u8g.drawStr( 0, 30, "POMPA FERMA");
- u8g.drawStr( 90, 30, "20:35");
- }
- void Data() //metodo per la visualizzazione della data su LCD
- {
- DateTime now=rtc.now();
- switch(now.dayOfTheWeek()){
- case 0: lcd.print("DOM");
- break;
- case 1: lcd.print("LUN");
- break;
- case 2: lcd.print("MAR");
- break;
- case 3: lcd.print("MER");
- break;
- case 4: lcd.print("GIO");
- break;
- case 5: lcd.print("VEN");
- break;
- case 6: lcd.print("SAB");
- break;}
- lcd.print(" ");
- if(now.day()<10)
- {lcd.print("0");}
- lcd.print(now.day(),DEC);
- lcd.print("/");
- if(now.month()<10)
- {lcd.print("0");}
- lcd.print(now.month(),DEC);
- lcd.print("/");
- lcd.print(now.year(),DEC);
- }
- void Orario() //metodo per la visualizzazione dell’ora su LCD
- {
- DateTime now=rtc.now();
- if(now.hour() <10)
- {lcd.print("0");}
- lcd.print(now.hour(),DEC);
- lcd.print(":");
- if(now.minute()<10)
- {lcd.print("0");}
- lcd.print(now.minute(),DEC);
- }
- void setup()
- {
- if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
- u8g.setColorIndex(255); // white
- }
- else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
- u8g.setColorIndex(3); // max intensity
- }
- else if ( u8g.getMode() == U8G_MODE_BW ) {
- u8g.setColorIndex(1); // pixel on
- }
- else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
- u8g.setHiColorByRGB(255,255,255);
- }
- rtc.begin();
- lcd.init();
- lcd.backlight();
- //RTC.sqw(0); //0 Led off - 1 Freq 1Hz - 2 Freq 4096kHz - 3 Freq 8192kHz - 4 Freq 32768kHz
- HC12.begin(38400);//modalità AT - per impostare il bluetooth in slave
- Serial.begin(9600); // inizializza la seriale a 9600 baud
- pinMode (AVVIO, INPUT_PULLUP);
- pinMode (LPV, INPUT_PULLUP);
- pinMode (LSV, INPUT_PULLUP);
- pinMode (LSP, INPUT_PULLUP);
- pinMode (RICICLO, INPUT_PULLUP);
- pinMode (POMPA,OUTPUT);
- pinMode (EVI,OUTPUT);
- pinMode (EVU,OUTPUT);
- if (! rtc.isrunning())
- {
- Serial.println("RTC is NOT running!");
- rtc.adjust(DateTime(2020, 4, 15, 21, 32, 0));// 15 Aprile 2020 h 21:32:00
- }
- if ( rtc.isrunning())
- {
- DateTime now = rtc.now();
- Ora = now.hour();
- Minuto = now.minute();
- }
- }
- void loop()
- {
- if (! baro.begin())
- {
- Serial.println("Couldnt find sensor");
- return;
- }
- pascals = baro.getPressure();
- altm = baro.getAltitude();
- temp2C = baro.getTemperature();
- u8g.firstPage();
- do
- {
- draw();
- }
- while (u8g.nextPage());
- avvio = !digitalRead(AVVIO); //legge interruttore d'avvio e l'associa alla variabile
- lpv = !digitalRead(LPV); //legge il sensore di livello pozzo e l'associa alla variabile
- lsv = digitalRead(LSV); //legge il sensore livello min serbatoio e l'associa alla variabile
- lsp = digitalRead(LSP); //legge il sensore livello max e l'associa alla variabile
- riciclo = !digitalRead(RICICLO); //legge il pulsante riciclo e l'associa alla variabile
- pompa = digitalRead(POMPA); //legge l'uscita 'pompa' e l'associa alla variabile
- evi = !digitalRead(EVI); //legge valvola 3vie ingresso pompa e l'associa alla variabile
- evu = !digitalRead(EVU); //legge valvola 3vie uscita pompa e l'associa alla variabile
- switch(STATO)
- {
- case 0: //pompa ferma
- analogWrite (POMPA,0);//
- digitalWrite (EVI,LOW);
- digitalWrite (EVU,LOW);
- if (avvio==1 && lpv==1 && lsp==0)
- STATO=1;
- if (riciclo==1 && lsv==1)
- {
- STATO=2;
- TimeStart=millis();
- }
- if (temperatura()<=tempminima && lsv==1)//&&pari()==0) //confronta la temperatura restituita dal metodo con la temperatura impostata ed esegue il ciclo ogni ora pari
- {
- STATO=2;
- TimeStart=millis();
- }
- if (consenso()==1 && lpv==1) // confronta il booleano restituito dal metodo orto per innaffiare all'ora stabilita dal pozzo
- STATO=3;
- if (consenso()==1 && lpv==0 && lsv==1) // confronta il booleano restituito dal metodo orto per innaffiare all'ora stabilita dal serbatoio
- STATO=4;
- else
- STATO=0;
- visualizza();
- break;
- case 1: //riempimento serbatoio
- analogWrite (POMPA,velmax);
- digitalWrite (EVI,LOW);
- digitalWrite (EVU,LOW);
- if (lsp==1 || avvio==0 || lpv==0)
- {
- STATO=0;
- }
- visualizza();
- break;
- case 2: //riciclo - antigelo
- analogWrite (POMPA,velmax);
- digitalWrite (EVI,HIGH);
- digitalWrite (EVU,LOW);
- if (millis()-TimeStart>3000)//5 min = 300000
- {
- STATO=0;
- }
- visualizza();
- break;
- case 3: //irrigazione da pozzo
- analogWrite (POMPA,velmin);
- digitalWrite (EVI,LOW);
- digitalWrite (EVU,HIGH);
- if (lpv==0)
- {
- STATO=0;
- }
- visualizza();
- break;
- case 4: //irrigazione da serbatoio
- analogWrite (POMPA,velmin);
- digitalWrite (EVI,HIGH);
- digitalWrite (EVU,HIGH);
- if (lsv==0)
- {
- STATO=0;
- }
- visualizza();
- break;
- }
- String label = "Var";
- const byte nValori = 8;
- float var[nValori] = {STATO, lpv, lsv, lsp, temperatura(), temp2C, altm, pascals};
- for (int i = 0; i < nValori; i++)
- {
- String stuff = "\n" + label + i + ": ";
- String toSend=stuff+String(var[i]);
- HC12.write(toSend.c_str());
- }
- delay(300);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement