(le scritte in verde permettono di attivare un link di contesto se vi si clikka sopra)        18 settembre 2022
Pagina ecologica no pubblicità no scherzetti no virus no messaggi subliminali


Questo progetto nasce per risolvere il frequente blocco della pompa che serve un'ottantina di orti comunali assegnati in gestione
al Centro Sociale Corbari di Faenza e in seconda battuta a quelli dell'associazione AUSER.
Nonostante le diverse sostituzione della pompa, specialmente nel periodo più caldo a giorni alterni un operatore deve intervenire
per eseguire il reset della pompa al fine di far ripartire il servizio.
Per il fornitore della pompa, storico artigiano faentino numero uno del settore, la pompa è regolare e adatta per lo scopo.
Il mero reset consiste nell'interrompere l'alimentazione alla pompa per una ventina di secondi, il tempo che si scarichino i
condensatori interni che garantiscono l'eliminazione delle microinterruzioni dell'ENEL.


Un secondo problema era quello di reperire un timer programmabile per la configurazione dei due orari di esercizio, mattino e
serale, in quanto quello in uso non dava grande affidamento per la corrente gestione e cercando su piazza un timer con una
portata superiore non è stato trovato, anzi è stato suggerito di rivolgersi ad un elettricista per un progetto specifico.
Mi sono proposto per automatizzare l'intervento dell'operatore e la sostituzione del timer ricevendo il mero costo dei materiali
circa trenta euro.
Utilizzando una scheda Arduino Uno, ho previsto di gestire gli orari di esercizio in blocchi di mezzora, e non sapendo se la pompa
si blocca in fase di avvio ho previsto che dopo 2 minuti dall'inizio di ogni blocco si interrompa l'alimentazione della stessa per un
minuto, realizzando un reale reset dell'elettronica della pompa.
In questo modo entro 30 minuti la pompa riparte in caso di precedente blocco e permette anche una pausa per rinfrescarsi.
Nella prima versione sperimentale si faceva affidamento al comando delay() per la gestione del timer ma si è visto che su 24 ore
la precisione lascia a desiderare e si sbaglia per diversi secondi e nei giorni diventano minuti, pertanto ho inserito nella versione
definitiva un orologio RTC e un display.
Dopo oltre un mese di sperimentazione, i blocchi della pompa sono cessati, e il progetto si può considerare risolutivo.
 

Lo schema elettrico del "Pompa_Orti" è il seguente:

 

Ora vediamo come si realizza il tutto.
Ho previsto una versione realizzabile con poche attrezzature, un paio di forbici, un saldatore e una pinzetta per piegare i fili.
Tutto il materiale è acquistabile in un negozio di elettronica o su
internet.
Elenco del materiale:
- scheda Arduino Uno o compatibile con cavetto USB;
- relè uno scambio 12 volt 40 Amp ohmico, 15 Amp induttivo con diodo di protezione incorporato;
-
display 16x2 con convertitore seriale I2C;
- alimentatore 9 volt per Arduino;
- modulo RTC DS1307;
- resistenza da 10k e 4.7k ohm 1/4 wat;
- transistor BC337;
- fili elettrici isolati da 0,6 mm meglio vari colori, tipo trecciola telefonica;
- connettori faston per relè da auto;
- filo elettrico sezione 2,5 mm;
- scatolina da elettricista di plastica per proteggere il tutto.

Ecco la parte elettrica assemblata

Il transistor che comanda il relè si trova, insieme alle due resistenze, sulla basetta fissata sul fondo della scatola, mentre l'orologio
RTC è fissato su una basetta di espansione che si aggancia alla scheda Arduino. A sua volta il display si collega alla schedina
con l'orologio.
Una volta chiuso il tutto nella scatola, il dispositivo di comando della pompa si presenta così:

Passiamo ora ad iniziare a configurare la parte Software.
Premessa indispensabile è aver testato e verificato il perfetto funzionamento della piattaforma del sistema di sviluppo IDE con
una scheda Arduino Uno.

Ora colleghiamo la scheda Arduino al PC tramite un cavetto USB con attacco da stampante.
Prima di caricare il programma su Arduino, dobbiamo aver installato il sistema di sviluppo IDE, e le librerie indispensabili per la
gestione dell'orologio e del display.
Per prima cosa andate su Strumenti->Gestione librerie, come spiegato in sistema di sviluppo IDE, e caricate/verificate che sia
presente la libreria
Adafruit_BusIO-master indispensabile per gestire le comunicazioni I2C, diversamente installatela.
Ora caricate la libreria RTClib-master e LiquidCrystal_I2C con lo stesso sistema descritto in precedenza, oppure potete scaricare
le librerie in formato compresso, per poi dezipparle in una directory del vostro pc e poi copiarle sotto la directory librerie del programma Arduino, ricordandovi che saranno operative solo dopo la riapertura del programma Arduino.
Potete scaricare le librerie da questi link: Adafruit_BusIO-master, RTClib-master, LiquidCrystal_I2C.

Ora  carichiamo sulla scheda Arduino il software per il "Pompa Orti"  che potete scaricare da questo link.

/* Sistema di gestione Pompa per irrigazione orti Comunali
Evita il blocco della pompa sbloccandola dopo 30 minuti
evita il surriscaldamento della pompa imponendo una pausa di 1 minuti ogni 30 minuti
La gestione viene fatta con blocchi di 30 minuti impostabili con variabili
carica prima libreria Adafruit_BusIO-master poi RTClib
Date and time functions using a DS1307 RTC connected via I2C and Wire lib
09 agosto 2022 ore 12.30 by Gian Domenico Marchi
    esempi di estrazione dati da RTC
    DateTime now = rtc.now();
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();

    Serial.print(" since midnight 1/1/1970 = ");
    Serial.print(now.unixtime());
    Serial.print("s = ");
    Serial.print(now.unixtime() / 86400L);
    Serial.println("d");

    // calculate a date which is 7 days, 12 hours, 30 minutes, and 6 seconds into the future
    DateTime future (now + TimeSpan(7,12,30,6));

    Serial.print(" now + 7d + 12h + 30m + 6s: ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();

/* Comment this out to disable prints and save space */
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
char visualizza;
float h; // ore espresse con decimali 30 minuti=50
float mih=6.00;  // inizio mattina
float mfh=9.50; // fine mattina prosegue x 30 minuti
float pih=17.00; // inizio sera
float pfh=20.50; // fine sera prosegue x 30 minuti
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
  // put your setup code here, to run once:
pinMode(10, OUTPUT);
pinMode(13, OUTPUT);
Serial.begin(9600); //Apro la comunicazione seriale
#ifndef ESP8266
  while (!Serial); // wait for serial port to connect. Needed for native USB
#endif
lcd.begin(); //Init with pin default ESP8266 or ARDUINO
  lcd.backlight(); //accende la retroilluminazione
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    while (1) delay(10);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running, let's set the time!");
    // When time needs to be set on a new device, or after a power loss, the
    // following line sets the RTC to the date & time this sketch was compiled
     rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }

  // When time needs to be re-set on a previously configured device, the
  // following line sets the RTC to the date & time this sketch was compiled
   //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  // This line sets the RTC with an explicit date & time, for example to set
  // January 21, 2014 at 3am you would call:
  // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}


void loop() {
  DateTime now = rtc.now();
  Serial.print(now.hour());
  Serial.print(':');
  Serial.println(now.minute());
  lcd.setCursor(0, 0);
  lcd.print("                "); // pulisce prima riga
  lcd.setCursor(0, 0);
  if(now.minute() < 10) {
    lcd.print(String(now.hour()) + ":0" + String(now.minute()) );
  }
  else
  {
  lcd.print(String(now.hour()) + ":" + String(now.minute()) );
  }
  delay (1000);
  if(now.minute()==3 || now.minute()==33 ) // se minuti = 3 o 33 fai pausa pompa
    {
    digitalWrite(10, HIGH); // spegne pompa
    digitalWrite(13, HIGH);
    lcd.setCursor(0, 1);
    lcd.print("                "); // pulisce seconda riga
    lcd.setCursor(0, 1);
    lcd.print("POMPA SPENTA");
    delay(61000); // per 61 secondi    
    }
    h=(now.hour());
    if(now.minute()>29)
    {
    h= h+0.50;
    }
    if (h==24.00)
      {
      h=0;
      }
    Serial.println(h);
  
  if(h>=mih && h<=mfh || h>=pih && h<=pfh ) // and + or + and
    {
    digitalWrite(10, LOW); // riattiva pompa
    digitalWrite(13, LOW);
    lcd.setCursor(0, 1);
    lcd.print("                "); // pulisce seconda riga
    lcd.setCursor(0, 1);
    lcd.print("POMPA ACCESA");
    }
    else // pompa spenta
    {
    digitalWrite(10, HIGH); // spegne pompa
    digitalWrite(13, HIGH);
    lcd.setCursor(0, 1);
    lcd.print("                "); // pulisce seconda riga
    lcd.setCursor(0, 1);
    lcd.print("POMPA SPENTA");
    }
 
  delay(3000);
}

Commenti al programma:
- si usa la variabile
h che contiene l'orario tra 0 e 24 con i minuti espressi in decimali, 30 minuti sono 0.50
- per stabilire gli orari di funzionamento della pompa nel mattino e nella sera si usano le seguenti variabili:
 mih=6.00;  // inizio mattina
 
mfh=9.50; // fine mattina prosegue x 30 minuti
 
pih=17.00; // inizio sera
 
pfh=20.50; // fine sera prosegue x 30 minuti
- Il relè, normalmente col contatto chiuso (pompa alimentata) è pilotato dall'uscita 10 di Arduino, quando si deve fermare la
  pompa l'uscita del 10 diventa alta e tramite un transistor il relè viene eccitato, questa scelta permette in caso di guasto di
  far erogare sempre l'acqua agli orti (l'uscita 13 che eccita il led sulla scheda, viene comandata come quella del 10 per finalità
  diagnostiche
- al primo caricamento del software l'orologio verrà impostato automaticamente con l'orario di sistema del PC. se volete
  reimpostare l'orario dovete forzare il programma ad eseguire la seguente riga di comando:
 
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
- il programma prevede di ripetere i controlli sullo stato che deve avere la pompa ogni 4 secondi e invia i dati dell'orario e dello
  stato della pompa sia verso il pc se connesso alla seriale e al display
- dopo l'acquisizione dell'orario tramite il modulo RTC, con batteria che in caso di mancanza della 220 non perde l'orario, si
  verifica se si è al minuto 3 o 33 nel qual caso la pompa viene fermata per il reset e il raffreddamento per 61 secondi
- si verifica se i minuti sono maggiori di 29 nel qual caso si imposta l'orario con una maggiorazione di 0,50
- si verifica se le ore sono uguali a 24 nel qual caso si imposta l'orario a 0
- il cuore della verifica sul funzionamento della pompa è la riga:
 
if(h>=mih && h<=mfh || h>=pih && h<=pfh ) // and + or + and che se vera attiva la pompa diversamente la spegne
 


 

Con questa immagine della zona di controllo della Pompa (dove si vede la grande cisterna esterna, che viene riempita due
volte al giorno, poi la zona della cisterna sotterranea da dove pesca la pompa) e una fila di orti, non mi resta che augurarvi buona
sperimentazione e se avete qualche problema nella realizzazione e gestione sono disponibile a darvi una mano.

 

Per contatti: