Advertisement
georex

Irrigazione orto2

Jun 6th, 2020
2,269
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**********************************************************
  2.  * Sistema automatico
  3.  * Irrigazione orto
  4.  * Da pozzo o serbatoi accumulo
  5.  * Usando fonti rinnovabili off-grid
  6.  * RTC - MPL315A2 - Arduino
  7.  * Data creazione 14 Aprile 2020
  8.  * Ultima modifica 6 Giugno 2020
  9.  * autore: Daniele Carrieri
  10.  * mail:   dancarri@tiscali.it
  11. /**********************************************************/
  12. #include <LiquidCrystal_I2C.h>
  13. LiquidCrystal_I2C lcd(0x27,20,4);
  14. #include <RTClib.h>             //libreria modulo Real Time Clock
  15. #include <SoftwareSerial.h>     //libreria per creare porte seriali aggiuntive
  16. #include <Wire.h>               //libreria I2C
  17. #include <Adafruit_MPL3115A2.h> //libreria modulo Altimetro, Barometro, Temperatura
  18. #include "U8glib.h"             //libreria display grafico LCD 128x32
  19. U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: en=18,rw=16,di=17 A4,A2,A3
  20. #define SensTemp A0 //sensore di temperatura
  21. #define RICICLO 3   //pulsante riciclo/antigelo serbatoio
  22. #define AVVIO 4     //interruttore on/off avvio
  23. #define LPV 5       //sensore Livello Pozzo Vuoto  
  24. #define LSP 6       //sensore Livello Serbatoio Pieno
  25. #define LSV 7       //sensore Livello Sebatoio Vuoto
  26. #define POMPA 9     //pompa acqua
  27. #define EVI  10     //valvola solenoide 3 vie ingresso pompa
  28. #define EVU 11      //valvola solenoide 3 vie uscita pompa
  29. byte STATO=0;
  30. bool avvio;
  31. bool lpv=0;
  32. bool lsv;
  33. bool lsp;
  34. bool riciclo;
  35. int pompa;
  36. int velmin=64;  //impostazione velocità minima pompa
  37. int velmax=255; //impostazione velocità massima pompa
  38. bool evi;
  39. bool evu;
  40. unsigned long TimeStart;
  41. float tempminima=2; //impostazione temperatura di solidificazione
  42. float pascals;
  43. float altm;
  44. float temp2C;
  45. const int RX=12;
  46. const int TX=13;
  47. SoftwareSerial HC12 (RX,TX);
  48. RTC_DS1307 rtc;
  49. DateTime now = rtc.now();
  50. int Ora = now.hour();
  51. int Minuto = now.minute();
  52. Adafruit_MPL3115A2 baro = Adafruit_MPL3115A2();
  53.  
  54. bool pari() //metodo che restituisce un valore booleano, 0 se ora pari, 1 se ora dispari (per ciclo antingelo ogni 2 ore)
  55. {
  56.   bool oraPari=0;
  57.   int resto;
  58.   resto=Ora%2;
  59.   if (resto==0)
  60.     oraPari=0;
  61.   else
  62.     oraPari=1;
  63.   return oraPari;
  64. }
  65.  
  66. bool consenso()  //metodo che restituisce un valore booleano, per dare consenso ad innaffiare all'ora impostata
  67. {
  68.   bool orto=0;
  69.   int innaffio[]={20,30,21,30};// formato ora_avvio,minuti_avvio,ora_arresto,minuti_arresto
  70.   if (innaffio[0]<=Ora && innaffio[2]>=Ora &&innaffio[1]<=Minuto && innaffio[3]>=Minuto)
  71.     orto=1;
  72.   else
  73.     orto=0;
  74.   return orto;
  75. }
  76.  
  77. float temperatura()  //metodo che restituisce la temperatura rilevata
  78. {
  79.   int valore=analogRead(SensTemp);
  80.   float tempC=valore * 0.48875;
  81.   return tempC;  
  82. }
  83.  
  84. void visualizza()  // metodo per visualizzare gli stati e I/O su seriale
  85. {
  86.   Serial.print("Stato  :     ");
  87.   if(STATO==0)
  88.     Serial.println("pompa ferma");
  89.   else if(STATO==1)
  90.     Serial.println("riempimento serbatoio");
  91.   else if(STATO==2)
  92.     Serial.println("riciclo/antigelo");
  93.   else if(STATO==3)
  94.     Serial.println("irrigazione da pozzo");
  95.   else if(STATO==4)
  96.     Serial.println("irrigazione da serbatoio");
  97.   Serial.print("Avvio  :     "); Serial.println(avvio);
  98.   Serial.print("Pozzo  :     "); Serial.println(lpv);
  99.   Serial.print("Liv min:     "); Serial.println(lsv);
  100.   Serial.print("Liv max:     "); Serial.println(lsp);
  101.   Serial.print("Riciclo:     "); Serial.println(riciclo);  
  102.   Serial.print("Pompa  :     "); Serial.println(pompa);  
  103.   Serial.print("3Vie In:     "); Serial.println(evi);  
  104.   Serial.print("3Vie Us:     "); Serial.println(evu);
  105.   Serial.print("Temp:        "); Serial.print(temperatura()); Serial.println("°C");
  106.   Serial.print("Temp2:       "); Serial.print(temp2C); Serial.println("°C");
  107.   Serial.print("Altimetro:   "); Serial.print(altm); Serial.println("metri");
  108.   Serial.print("hPa:         "); Serial.println(pascals*100);
  109.   /* La pagina indica la pressione in ectoPascal (hPa), equivalente a 0,001 bar.
  110.    * In atmosfesa tipo (ISA), la pressione al livello del mare è 1013,25 hPa
  111.    * con un gradiente barico verticale 1hPa/27ft, descrescente con la quota
  112.    * in questo modo possiamo determinare quando c'è alta o bassa pressione
  113.    * Usare http://www.onlineconversion.com/pressure.htm per altre unità
  114.   */
  115.   Serial.println();
  116. }
  117.  
  118. void draw()
  119. {
  120.   u8g.setFont(u8g_font_5x7);
  121.   u8g.drawStr( 0, 10, "LUN 24 MAGGIO 2020  20:30"); //esempio per configurare carattere su LCD
  122.   u8g.setFont(u8g_font_7x14);
  123.   u8g.drawStr( 0, 30, "POMPA FERMA");
  124.   u8g.drawStr( 90, 30, "20:35");
  125. }
  126.  
  127. void Data() //metodo per la visualizzazione della data su LCD
  128. {
  129.  DateTime now=rtc.now();
  130.  switch(now.dayOfTheWeek()){
  131.  case 0: lcd.print("DOM");
  132.  break;
  133.  case 1: lcd.print("LUN");
  134.  break;
  135.  case 2: lcd.print("MAR");
  136.  break;
  137.  case 3: lcd.print("MER");
  138.  break;
  139.  case 4: lcd.print("GIO");                          
  140.  break;
  141.  case 5: lcd.print("VEN");
  142.  break;
  143.  case 6: lcd.print("SAB");
  144.  break;}
  145.  lcd.print(" ");
  146.  if(now.day()<10)
  147.  {lcd.print("0");}
  148.  lcd.print(now.day(),DEC);
  149.  lcd.print("/");
  150.  if(now.month()<10)
  151.  {lcd.print("0");}
  152.  lcd.print(now.month(),DEC);
  153.  lcd.print("/");
  154.  lcd.print(now.year(),DEC);
  155.  }
  156.  
  157. void Orario() //metodo per la visualizzazione dell’ora su LCD
  158. {
  159.  DateTime now=rtc.now();
  160.  if(now.hour() <10)
  161.  {lcd.print("0");}
  162.  lcd.print(now.hour(),DEC);  
  163.  lcd.print(":");
  164.  if(now.minute()<10)
  165.  {lcd.print("0");}
  166.  lcd.print(now.minute(),DEC);
  167.  }
  168.  
  169. void setup()
  170. {
  171.    if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
  172.     u8g.setColorIndex(255);     // white
  173.   }
  174.   else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
  175.     u8g.setColorIndex(3);         // max intensity
  176.   }
  177.   else if ( u8g.getMode() == U8G_MODE_BW ) {
  178.     u8g.setColorIndex(1);         // pixel on
  179.   }
  180.   else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
  181.     u8g.setHiColorByRGB(255,255,255);
  182.   }
  183.   rtc.begin();
  184.   lcd.init();
  185.   lcd.backlight();
  186.   //RTC.sqw(0);        //0 Led off - 1 Freq 1Hz - 2 Freq 4096kHz - 3 Freq 8192kHz - 4 Freq 32768kHz
  187.   HC12.begin(38400);//modalità AT - per impostare il bluetooth in slave
  188.   Serial.begin(9600);  // inizializza la seriale a 9600 baud
  189.   pinMode (AVVIO, INPUT_PULLUP);
  190.   pinMode (LPV, INPUT_PULLUP);
  191.   pinMode (LSV, INPUT_PULLUP);
  192.   pinMode (LSP, INPUT_PULLUP);
  193.   pinMode (RICICLO, INPUT_PULLUP);
  194.   pinMode (POMPA,OUTPUT);
  195.   pinMode (EVI,OUTPUT);
  196.   pinMode (EVU,OUTPUT);
  197.   if (! rtc.isrunning())
  198.    {
  199.     Serial.println("RTC is NOT running!");
  200.     rtc.adjust(DateTime(2020, 4, 15, 21, 32, 0));// 15 Aprile 2020 h 21:32:00
  201.    }
  202.   if ( rtc.isrunning())
  203.   {
  204.     DateTime now = rtc.now();
  205.     Ora = now.hour();
  206.     Minuto = now.minute();
  207.   }
  208. }
  209.  
  210. void loop()
  211. {
  212.   if (! baro.begin())
  213.   {
  214.     Serial.println("Couldnt find sensor");
  215.     return;
  216.   }
  217.   pascals = baro.getPressure();
  218.   altm = baro.getAltitude();
  219.   temp2C = baro.getTemperature();
  220.   u8g.firstPage();  
  221.   do
  222.   {
  223.     draw();
  224.   }
  225.   while (u8g.nextPage());
  226.   avvio = !digitalRead(AVVIO); //legge interruttore d'avvio e l'associa alla variabile
  227.   lpv = !digitalRead(LPV); //legge il sensore di livello pozzo e l'associa alla variabile
  228.   lsv = digitalRead(LSV); //legge il sensore livello min serbatoio e l'associa alla variabile
  229.   lsp = digitalRead(LSP); //legge il sensore livello max e l'associa alla variabile
  230.   riciclo = !digitalRead(RICICLO);  //legge il pulsante riciclo e l'associa alla variabile
  231.   pompa = digitalRead(POMPA); //legge l'uscita 'pompa' e l'associa alla variabile
  232.   evi = !digitalRead(EVI); //legge valvola 3vie ingresso pompa e l'associa alla variabile
  233.   evu = !digitalRead(EVU); //legge valvola 3vie uscita pompa e l'associa alla variabile
  234.   switch(STATO)
  235.   {      
  236.     case 0:  //pompa ferma
  237.     analogWrite (POMPA,0);//
  238.     digitalWrite (EVI,LOW);
  239.     digitalWrite (EVU,LOW);
  240.     if (avvio==1 && lpv==1 && lsp==0)
  241.       STATO=1;
  242.     if (riciclo==1 && lsv==1)
  243.     {
  244.       STATO=2;
  245.       TimeStart=millis();
  246.     }    
  247.     if (temperatura()<=tempminima && lsv==1)//&&pari()==0) //confronta la temperatura restituita dal metodo con la temperatura impostata ed esegue il ciclo ogni ora pari
  248.     {
  249.       STATO=2;
  250.       TimeStart=millis();
  251.     }
  252.     if (consenso()==1 && lpv==1)  // confronta il booleano restituito dal metodo orto per innaffiare all'ora stabilita dal pozzo
  253.       STATO=3;  
  254.     if (consenso()==1 && lpv==0 && lsv==1) // confronta il booleano restituito dal metodo orto per innaffiare all'ora stabilita dal serbatoio
  255.       STATO=4;
  256.     else
  257.       STATO=0;
  258.     visualizza();
  259.     break;
  260.    
  261.     case 1:  //riempimento serbatoio
  262.     analogWrite (POMPA,velmax);
  263.     digitalWrite (EVI,LOW);
  264.     digitalWrite (EVU,LOW);
  265.     if (lsp==1 || avvio==0 || lpv==0)
  266.     {
  267.       STATO=0;
  268.     }
  269.     visualizza();
  270.     break;
  271.    
  272.     case 2: //riciclo - antigelo
  273.     analogWrite (POMPA,velmax);
  274.     digitalWrite (EVI,HIGH);
  275.     digitalWrite (EVU,LOW);      
  276.     if (millis()-TimeStart>3000)//5 min = 300000
  277.     {
  278.       STATO=0;
  279.     }
  280.     visualizza();
  281.     break;  
  282.  
  283.     case 3:  //irrigazione da pozzo
  284.     analogWrite (POMPA,velmin);
  285.     digitalWrite (EVI,LOW);
  286.     digitalWrite (EVU,HIGH);
  287.     if (lpv==0)
  288.     {
  289.       STATO=0;
  290.     }
  291.     visualizza();    
  292.     break;
  293.  
  294.     case 4:  //irrigazione da serbatoio
  295.     analogWrite (POMPA,velmin);
  296.     digitalWrite (EVI,HIGH);
  297.     digitalWrite (EVU,HIGH);
  298.     if (lsv==0)
  299.     {
  300.       STATO=0;
  301.     }
  302.     visualizza();
  303.     break;    
  304.   }
  305.   String label = "Var";
  306.   const byte nValori = 8;
  307.   float var[nValori] = {STATO, lpv, lsv, lsp, temperatura(), temp2C, altm, pascals};
  308.   for (int i = 0; i < nValori; i++)
  309.   {
  310.     String stuff = "\n" + label + i + ": ";
  311.     String toSend=stuff+String(var[i]);
  312.     HC12.write(toSend.c_str());
  313.   }  
  314.   delay(300);
  315. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement