Impianto di irrigazione

Da raspibo.
Jump to navigation Jump to search

Un lusso per tutti quelli che hanno un giardino o magari qualche vaso in terrazza è l'impianto di irrigazione che permette di risparmiare tempo, acqua e soprattutto evitare di dimenticarsi di annaffiare le piante.

Ci sono sicuramente tanti sistemi più o meno creativi, ma ho voluto approfittare del nuovo modulo wifi che sto sperimentando per dedicarmi a fare qualcosa di semplice e possibilmente funzionale.

A fime stagione riporterò eventuali segnalazioni di problemi riscontrati durante il periodo esivo.

Progetto di massima

Due elettrovalvole perchè il giardino è diviso idealmente in due zone, diciamo nord e sud anche perchè richiedono due quantità di acqua diverse.

Utilizzare valvole a 24 Vcc, una tensione non proprio comune tra i miei recuperi, ma qualcosa si trova sempre, per questo basta un trasformatore, per l'occasione ne ho trovato uno da circuito stampato perciò ho dissaldato tutti i componenti inutili.

Trasformatore

Due relays uno per il primario del trasformatore ed uno da usare sul secondario per selezionare la valvola da attivare.

Un alimentatore a 5V per alimentare il modulo di comando (che va a 3.3V quindi userò anche uno stabilizzatore dedicato) ed i relè.

Un modulo [ESP8266 ESP8266] ed una rete wifi, magari una rete comunitaria come ad esempio Ninux (questo punto lo vedremo più avanti) o un apparato per una connessione punto punto es: un altro modulo ESP8266 o una chiavetta wifi.

Le valvole andranno posizionate all'esterno mentre la parte sotto tensione va ben protetta.

Codice per il modulo ESP8266

Questo codice è un collage di un pò di cose trovate in giro, e lette sulla documentazione del firmware nodemcu.

Lo scopo è quello di agganganciare il modulo wifi alla rete ninux come client con un ip fisso. Il modulo crea un server web minimale a cui ci si può collegare con pc o telefono o uno script (la soluzione che adotterò io).

Non vorrei però allagare il giardino qualora cadesse la connessione wifi per qualsiasi motivo (magari un restart del modulo per una sovratensione, problemi sulla rete wifi ecc...).

Quindi sfruttando un timer ciclico ogni 60 secondi se non è stato ribadito il comando di on il modulo in automatico spegne l'alimentazione delle elettrovalvole.

Avrei potuto usare il timer semplicemete per disattivare le valvole dopo alcuni minuti di irrigazione, ma prevedo già richieste di modifica sul tempo di apertura e parto già con due zone che richiedono quantità di acqua diverse perciò voglio rendere tutto più flessibile.

Ne ho approfittato per aggiungere qualche istruzione non proprio necessaria, ma che fornisce qualche dato in più e che potrò riutilizzare in futuro

for n,s in pairs(file.list()) do print(n.." size: "..s) end           -- Lista dei files presenti in memoria
print("Vcc="..(node.readvdd33()/1000).."V")                           -- Display della tensione di alimentazione del modulo
wifi.setmode(wifi.STATION)                                            -- Setup wifi in modalità client
wifi.sta.config("NinuxBO","")                                         -- Connessione alla rete Ninux, il parametro lasciato vuoto corrisponde alla password
cfg = {ip="10.51.0.24",netmask="255.255.0.0",gateway="10.51.0.1"}     -- Definizione dei parametri di rete, per dhcp wifi.sta.getip() senza dichirazione dei parametri
wifi.sta.setip(cfg)                                                   -- Settaggio dei parametri di connessione
wifi.sta.autoconnect(1)                                               -- Setup di autoconnessione, non so se sia necessario
led1 = 3                                                              -- I due GPIO porati sul connettore corrispondono ai pin 3 e 4
led2 = 4
ora=tmr.now();                                                        -- Mi segno l'ora di startup (uptime)
gpio.mode(led1, gpio.OUTPUT)                                          -- Setup dei pin in output
gpio.mode(led2, gpio.OUTPUT)

tmr.alarm(0, 10000, 1, function()                                     -- Setup del timer 0 ogni 10000msecondi si ripete (1) quando il timer scatta viene eseguita la funzione di seguito
if ( tmr.now() >  ora + 60000000 )then                                -- Se sono passati 60 secondi dall'ultimo comando via web entrambi i GPIO vengono settati a zero
     gpio.write(led1, gpio.LOW);                                      -- questo serve per evitare che le valvole rimangano aperte se la connettività wifi viene cade
     gpio.write(led2, gpio.LOW);
     print "Timeout -  OFF all relays"                                -- Messaggio di avviso su connessione seriale quando scatta il timer
end
wifi_status=wifi.sta.status()                                         -- Controllo lo stato della connessione wifi e in base al valore stampo su seriale le info
if (wifi_status==0) then
     print "STATION_IDLE: OK"
elseif (wifi_status==1) then
     print "STATION_CONNECTING...."
elseif (wifi_status==2) then
     print "STATION_WRONG_PASSWORD: KO"
elseif (wifi_status==3) then
     print "STATION_NO_AP_FOUND: KO"
elseif (wifi_status==4) then
     print "STATION_CONNECT_FAIL: KO"
elseif (wifi_status==5) then
     print "STATION_GOT_IP: OK"
end
end)
     
srv=net.createServer(net.TCP)                                         -- Creo un server TCP
srv:listen(80,function(conn)                                          -- Metto in ascolto il server sulla porta 80 (web)
    conn:on("receive", function(client,request)                       -- Attendo richiesta dati da un client web
        local buf = "";
        local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
        if(method == nil)then
            _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
        end
        local _GET = {}
        if (vars ~= nil)then
            for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
                _GET[k] = v
            end
        end
        buf = buf.."<h1> Irrigazione </h1>";                          -- Invio al client una semplice pagina web con due pulsanti per accendere o spegnere le elettrovalvole
        buf = buf.."<p>Zona1 <a href=\"?pin=ON1\"><button>ON</button></a> <a href=\"?pin=OFF1\"><button>OFF</button></a></p>";
        buf = buf.."<p>Zona2 <a href=\"?pin=ON2\"><button>ON</button></a> <a href=\"?pin=OFF2\"><button>OFF</button></a></p>";
        local _on,_off = "",""
        if(_GET.pin == "ON1")then                                     -- Gestione dei request inviati dal client quando vengono premuti i pulsanti sulla pagina web
             gpio.write(led1, gpio.HIGH);
             ora=tmr.now();
             print(ora);
        elseif(_GET.pin == "OFF1")then
             gpio.write(led1, gpio.LOW);
        elseif(_GET.pin == "ON2")then
             gpio.write(led2, gpio.HIGH);
             ora=tmr.now();
             print(ora);
        elseif(_GET.pin == "OFF2")then
             gpio.write(led2, gpio.LOW);
        end
        client:send(buf);                                             -- Invio al client della variabile buf che contiene la pagina web
        client:close();
        collectgarbage();
    end)
end)
 


Webserver su ESP8266