(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: