Differenze tra le versioni di "Impianto di irrigazione"

Da raspibo.
Jump to navigation Jump to search
 
(3 versioni intermedie di 2 utenti non mostrate)
Riga 6: Riga 6:
  
 
=== Progetto di massima ===
 
=== Progetto di massima ===
 +
 +
 +
{| cellpadding="20" cellspacing="0" border="1"
 +
|[[File:Irrigazione schema.png|500px|thumb|left|Schema elettrico di massima]]
 +
|[[File:Trasformatore.jpg|200px|thumb|right|Trasformatore]]
 +
|[[File:Irrigazione web.png|300px|thumb|right|Webserver su ESP8266]]
 +
|}
 +
  
 
Due elettrovalvole perchè il giardino è diviso idealmente in due zone, diciamo nord e sud anche perchè richiedono due quantità di acqua diverse.
 
Due elettrovalvole perchè il giardino è diviso idealmente in due zone, diciamo nord e sud anche perchè richiedono due quantità di acqua diverse.
Riga 11: Riga 19:
 
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.  
 
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.  
  
[[File:Trasformatore.jpg|200px|thumb|right|Trasformatore]]
 
  
 
Due relays uno per il primario del trasformatore ed uno da usare sul secondario per selezionare la valvola da attivare.
 
Due relays uno per il primario del trasformatore ed uno da usare sul secondario per selezionare la valvola da attivare.
Riga 21: Riga 28:
 
Le valvole andranno posizionate all'esterno mentre la parte sotto tensione va ben protetta.
 
Le valvole andranno posizionate all'esterno mentre la parte sotto tensione va ben protetta.
  
[[File:Irrigazione schema.png|500px|thumb|left|Schema elettrico di massima]]
+
 
  
 
----
 
----
Riga 27: Riga 34:
  
 
=== Codice per il modulo ESP8266 ===
 
=== Codice per il modulo ESP8266 ===
 +
 +
Archivio codice: [https://github.com/raspibo/ESP8266 Raspibo/ESP8266]
  
 
Questo codice è un collage di un pò di cose trovate in giro, e lette sulla documentazione del firmware nodemcu.
 
Questo codice è un collage di un pò di cose trovate in giro, e lette sulla documentazione del firmware nodemcu.
Riga 40: Riga 49:
 
Ne ho approfittato per aggiungere qualche istruzione non proprio necessaria, ma che fornisce qualche dato in più e che potrò riutilizzare in futuro
 
Ne ho approfittato per aggiungere qualche istruzione non proprio necessaria, ma che fornisce qualche dato in più e che potrò riutilizzare in futuro
  
  <nowiki>
+
  <pre style="overflow:auto">
 +
 
 
for n,s in pairs(file.list()) do print(n.." size: "..s) end          -- Lista dei files presenti in memoria
 
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
+
print("Vcc="..(node.readvdd33()/1000).."V")
 
wifi.setmode(wifi.STATION)                                            -- Setup wifi in modalità client
 
wifi.setmode(wifi.STATION)                                            -- Setup wifi in modalità client
 
wifi.sta.config("NinuxBO","")                                        -- Connessione alla rete Ninux, il parametro lasciato vuoto corrisponde alla password
 
wifi.sta.config("NinuxBO","")                                        -- Connessione alla rete Ninux, il parametro lasciato vuoto corrisponde alla password
Riga 53: Riga 63:
 
gpio.mode(led1, gpio.OUTPUT)                                          -- Setup dei pin in output
 
gpio.mode(led1, gpio.OUTPUT)                                          -- Setup dei pin in output
 
gpio.mode(led2, gpio.OUTPUT)
 
gpio.mode(led2, gpio.OUTPUT)
 +
gpio.write(led1, gpio.LOW)
 +
gpio.write(led2, gpio.LOW)
  
 
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
 
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
Riga 58: Riga 70:
 
     gpio.write(led1, gpio.LOW);                                      -- questo serve per evitare che le valvole rimangano aperte se la connettività wifi viene cade
 
     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);
 
     gpio.write(led2, gpio.LOW);
     print "Timeout -  OFF all relays"                                -- Messaggio di avviso su connessione seriale quando scatta il timer
+
     print "Timeout -  OFF all relays."                                -- Messaggio di avviso su connessione seriale quando scatta il timer      
 
end
 
end
 
wifi_status=wifi.sta.status()                                        -- Controllo lo stato della connessione wifi e in base al valore stampo su seriale le info
 
wifi_status=wifi.sta.status()                                        -- Controllo lo stato della connessione wifi e in base al valore stampo su seriale le info
Riga 97: Riga 109:
 
             gpio.write(led1, gpio.HIGH);
 
             gpio.write(led1, gpio.HIGH);
 
             ora=tmr.now();
 
             ora=tmr.now();
            print(ora);
 
 
         elseif(_GET.pin == "OFF1")then
 
         elseif(_GET.pin == "OFF1")then
 
             gpio.write(led1, gpio.LOW);
 
             gpio.write(led1, gpio.LOW);
Riga 112: Riga 123:
 
     end)
 
     end)
 
end)
 
end)
</nowiki>
 
  
  
[[File:Irrigazione web.png|300px|thumb|right|Webserver su ESP8266]]
+
</pre>
 +
 
 +
=== Realizzazione ===
 +
 
 +
 
 +
{| cellpadding="20" cellspacing="0" border="1"
 +
|[[File:IMG 20150329 160953.jpg|300px|thumb|left|Montaggio in scatola stagna]]
 +
|[[File:IMG 20150330 180135.jpg|300px|thumb|right|Protezione della zona a tensione maggiore]]
 +
|[[File:IMG_20150406_085932.jpg|300px|thumb|right|Elettrovalvole e assemblaggio idraulico]]
 +
|[[File:IMG 20150406 085946.jpg|300px|thumb|right|Assemblaggio finale]]
 +
 
 +
|}
 +
 
 +
=== Archvio documentazione ===
 +
 
 +
[https://github.com/raspibo/ESP8266/tree/master/scripts/irrigazione Qui]
 +
 
 +
 
 +
[[Category:Progetti]]

Versione attuale delle 12:45, 14 dic 2015

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

Schema elettrico di massima
Trasformatore
Webserver su ESP8266


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.


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

Archivio codice: Raspibo/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")
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)
gpio.write(led1, gpio.LOW)
gpio.write(led2, gpio.LOW)

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();
        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)


 

Realizzazione

Montaggio in scatola stagna
Protezione della zona a tensione maggiore
Elettrovalvole e assemblaggio idraulico
Assemblaggio finale

Archvio documentazione

Qui