Irrigatore automatico

Buonasera a tutti, sono un novello anche io. sia nel forum che nella programmazione. Nemmeno a farlo a posta cercando e ricercando ho trovato qualcuno che vuole fare una cosa molto simile alla mia.
Ripeto di essere molto poco pratico. So qualcosa a livello hardware, ma di programmazione ben poco. mi piacerebbe fare pratica, e con questo intento ho acquistato un arduino uno e una ethernet shield w5100.
Il progetto che vorrei sviluppare è una centralina di irrigazione ad "n" zone, programmabile tramite web, e magari un giorno fargli fare qualche analisi con sensori sparsi per l'orto.
Ma principalmente per ora sto cercando di capire quali dovranno essere le varie fasi.
Ho copiato un codice nel web che chiede l'ora ad un server NTP ogni 10sec e la stampa su serial monitor. Ora vorrei invece stamparla in "html" per leggerla da remoto.
La gestione delle uscite che controlleranno le zone non mi preoccupa, ma il mondo del web un po mi spaventa perchè non ho idea da dove cominciare, quindi intato vi chiedo qualche consiglio su come approcciare: manuali, libri, siti, forum, programmi, linguaggi, qualunque consiglio è ben accetto.
Per quanto riguarda la libreria WEBBINO, l'ho scaricata ma nonostante gli esempi, non ho capito come utilizzarla.
Grazie a tutti in anticipo

Buongiorno e benvenuto, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Buongiorno e grazie per la risposta Guglielmo.
Mi sono appena presentato nel THREAD da te indicato, e nel leggere il regolamento ho trovato al punto 16 quei link da te suggeriti. Mi metto a leggere e vediamo se riesco a procedere. :slight_smile:

Davide

Ho separato il tuo thread da quello a cui ti eri collegato ... così hai il TUO thread relativo ai TUOI problemi e ne puoi discutere qui :slight_smile:

Relativamente a sistemi di irrigazione fatti con Arduino, qui sul forum "Italiano" se ne è parlato più volte ... con l'apposita "lente", in alto a destra, prova a fare delle ricerche .... relativamente a Webbino ... chiedi pure :smiley:

Guglielmo

Allora, credo di dover spiegare innanzitutto quello che sto cercando di fare. Al momento come dicevo, ho trovato uno sketch che interroga un server ntp ogni 10 secondi, ed elabora l'informazione ricevuta per ottenere ORA,MINUTI,SECONDI relativi al meridiano di greenwich, quindi due ore indietro, stampa il risultato ottenuto su monitor seriale e azzera una serie di buffer. questo è quello che ho capito, purtroppo non ho compreso ancora le singole righe, ma spero che smanettando farò luce su tutto.

Siccome sto approcciando per step per cercare di non demoralizzarmi, per ora mi accontenterei di modificare il codice per far stampare il risultato su una pagina web.

Non essendo pratico di HTML, ho preso una pagina con scritto "CIAO MONDO", e ho copiato il codice nel punto dove secondo me potesse funzionare, e la cosa assurda è che funziona!!! Cioè caricato lo sketch, collegato alla mia rete LAN, se digito 192.168.1.89 visualizzo quella pagina con scritto CIAO MONDO.

Nel cercare di capire come poter sostituire CIAO MONDO con l'ora, ho scoperto la libreria WEBBINO che credo faccia al caso mio. Ho letto in più post che è sufficente scrivere ad esempio #ORA# nel punto dove vuoi visualizzare l'ora, ma ovviamente non mi funziona.

Premesso che se volete posto il codice per intero, l'idea che mi sono fatto è la seguente:
il codice mi restituisce l'orario nel seguente modo:

Serial.print("The UTC time is ");       // UTC is the time at Greenwich 
                                            // Meridian (GMT)
    Serial.print((epoch  % 86400L) / 3600); // print the hour 
                                            // (86400 equals secs per day)
    Serial.print(':');
    if ( ((epoch % 3600) / 60) < 10 ) {
      // In the first 10 minutes of each hour, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.print((epoch  % 3600) / 60); // print the minute 
                                        // (3600 equals secs per minute)
    Serial.print(':');
    if ( (epoch % 60) < 10 ) {
      // In the first 10 seconds of each minute, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.println(epoch % 60); // print the second
  }
  // wait ten seconds before asking for the time again
  delay(10000);

quindi immagino dovrei creare dei TAG, quindi definirli da qualche parte, che significhino per arduino:
ORE=((epoch % 86400L) / 3600)
MINUTI=((epoch % 3600) / 60)
SECONDI=(epoch % 60)

Grazie a tutti, e buonaserata!

davide991:
... Nel cercare di capire come poter sostituire CIAO MONDO con l'ora, ho scoperto la libreria WEBBINO che credo faccia al caso mio. Ho letto in più post che è sufficente scrivere ad esempio #ORA# nel punto dove vuoi visualizzare l'ora, ma ovviamente non mi funziona.

... non ti funziona perché è un po' più complesso di così ... guarda l'esempio "ReplacementTags". Nella sua cartella "webroot" trovi come deve essere fatta la pagina web (html) che poi, con il programmino python "html2h.py", deve essere convertita nel .h che viene incluso (html.h).

Guglielmo

Buongiorno. Quel poco che sono riuscito a capire è che il file html non è scritto nello sketch di arduino ma viene incluso con il file html.h.

So che forse una preparazione maggiore mi permetterebbe di comprendere facilmente, ma ti chiedo se ti è possibile di essere un po piu chiaro...

-quello che devo fare è scrivere una pagina ".html" utilizzando i #TAG# e poi con l'ausilio di Python convertirla in ".h" e richiamarla nel codice arduino con INCLUDE HTML.H?

-dove trovo questo programma html2h.py di cui parli e come funziona (praticamente)?

Grazie Guglielmo
ti auguro una buona domenica

Facendo riferimento all'esempio "ReplacementTags", guarda BENE come è fatta la pagina index.html che trovi nella cartella "webroot" (così capisci come si mettono i TAG) ed il relativo programma ReplacementTags.ino che li usa. Crea una tua piccola pagina index.html e mettila, da sola, in una cartella. Nella cartella di "webbino" trovi una cartella che si chiama "tools" ... in tale cartella trovi il programma html2h.py che è quello che legge il tuo file index.html e genera in uscita il file html.h ... lo lanci da linea comando (devi avere ovviamente Python installato sulla tua macchina) passandogli il percorso di dove si trova il tuo index.html (che, ripeto, deve stare da solo in una cartella) e lui ti genera il file in uscita.

Per il momento NON cambiare nome alla pagina (ovvero lascia index.html) e parti da ReplacementTags.ino per modificare SOLO le parti che riguardano i tuoi TAGs (e le loro relative funzioni) senza toccare tutto il resto ... piano piano capirai a cosa servono le varie sezioni e quindi dove poter mettere le mani e dove no.

Ricorda che la libreria Webbino ha un file di configurazione che va modificato, a seconda del proprio hardware e delle proprie esigenze ... il file si trova dentro la cartella di webbino, nella cartella "src" e si chiama "webbino_config.h".

Ti sempbrerà tutto molto complicato, ma, del resto, quella libreria fa veramente parecchie cose e ti nasconde ben altre complessità ... bisogna studiare un bel po' :wink:

Guglielmo

Fantastico Guglielmo!
Ti sono molto grato per l'assistenza che mi stai dando!
Nei prossimi giorni cercherò di approfondire questa parte!

Saluti

Davide :slight_smile:

Buonasera,
alla fine ho allontanato (almeno per ora) l'idea di utilizzare la libreria Webbino, sono riuscito comunque ad ottenere qualche risultato anche senza.
Preferisco fare un po di pratica prima di addentrarmi in script Python, che non fanno parte delle mie conoscenze, dovrei passare piu tempo sul forum che sull'IDE.... :slight_smile:
Sto utilizzando la libreria RTClib.h di adafruit, per far stampare su una pagina html la data e l'ora.
Sto inoltre cercando di comandare un rele' per accendere una luce quando l'orario è compreso tra un min e un max nel seguente (sbagliato) modo:

 if ((minutes)>=17 && (minutes)<=18){
            digitalWrite (7,LOW);}
            else
            digitalWrite (7,HIGH);

voi sapete come ragiona questa libreria? Ho pensato che forse non è un valora decimale quello che gli faccio comparare....

Grazie mille

Se stampi su monitor seriale la variabile minutes vedi il valore corretto?

no.....minutes l'ho provata perchè stava nel file KEYWORD.txt della libreria.

per stampare i minuti sul monitor seriale correttamente uso:

Serial.print(now.minute(), DEC);

Risolto, grazie! cosi funziona....

if (now.minute()>=5 && now.minute()<=6) digitalWrite (7,LOW);
            else
            digitalWrite (7,HIGH);

voi sapete come ragiona questa libreria? Ho pensato che forse non è un valora decimale quello che gli faccio comparare....

Funziona come tutte le altre librerie arduino, è scritta in C++ ed è perfettamente orientata ad oggetti.

DateTime now = rtc.now();

now prima di = è variabile istanza di classe (o tipo di dato) DateTime.
"variabile istanza di tipo" è sinonimo di "oggetto"
Mentre:

RTC_DS3231 rtc;

rtc è variabile istanza di classe RTC_DS3231, quindi rtc.now() è una chiamata a metodo now().
Mentre:

now.minute()

è chiamata a metodo minute() sull'ogetto di nome now.
Il punto è operatore di accesso per riferimento;
I metodi sono funzioni membro le quali possono o meno restituire un valore, minute() restituisce un intero senza segno.
Una variabile di tipo interno senza segno deve prima essere dichiarata e opzionalmente inizializzata, es:

byte laMiaVariabileMinuti;   // dichiarazione se globale fuori da ogni funzione

// uso della variabile dentro le funzioni (es. setup o loop
laMiaVariabileMinuti = now.minute();  // chiamata a funzione minute(). Restituisce un valore nel range 0÷59

// per stampare il valore di laMiaVariabileMinuti
Serial.println(laMiaVariabileMinuti, DEC);

Ora sai che Serial è variabile oggetto predefinito e println() è una funzione.
Per finire si dice anche che le funzioni prendono argomento e infatti laMiaVariabile e DEC sono argomenti.
Dopo questo breve corso introduttivo non pretendere di capire tutto, ma prendi spunto per studiare il linguaggio C++.
Ciao.

Buonasera.
Grazie @MAUROTEC, ci ho messo un po per capire quello che mi avevi scritto. L'ho dovuto rileggere piu e piu volte :slight_smile:

Avrei una nuova richiesta di aiuto.
Sto inserendo dei form nella pagina HTML, metodo GET, ma non riesco ad ottenere come risposta una stringa contenente i valori inseriti nelle caselle di testo.

 client.print("<form name=""IMPOSTA TEMPERATURA""      action=""http://192.168.1.177"" method=""GET"" div align=""LEFT"">");
      client.print("</div>");
      client.print("

");
      client.print("<input type=""text"" size=""11"" maxlength=""2"" value=""Temperatura"">");
      client.print("<input type=""text"" size=""7"" maxlength=""2"" value=""Luce_ON"">");
      client.print("<input type=""text"" size=""7"" maxlength=""2"" value=""Luce_OFF"">");
      client.print("<input type=""submit"" align=""absmiddle"" value=""SALVA_MODIFICHE"">"

Ho cercato sul web, ma non mi sembra di vedere grandi problemi.

#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#include "RTClib.h"
#include <DHT.h>
#include <DHT_U.h>

#define DHTPIN 2
#define DHTTYPE DHT11

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

byte ip[] = { 192,168,1, 177 };

EthernetServer server(80);


RTC_DS3231 rtc;

DHT dht(DHTPIN, DHTTYPE);

char daysOfTheWeek[7][12] = {"Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato"};

void setup () {
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  
  Serial.begin(9600);

  delay(3000); 
  
  Ethernet.begin(mac, ip);

  server.begin();
  
  dht.begin();
  
  


    if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
    }

    if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

    }
}

void loop () {
           
    float h = dht.readHumidity();
    float t = dht.readTemperature();
     
    DateTime now = rtc.now();
    
    Serial.print(now.day(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.year(), 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();

     

      if (isnan(t) || isnan(h)) {
      Serial.println("Failed to read from DHT");
      } else {
      Serial.print("Umidità: "); 
      Serial.print(h); 
      Serial.print(" %");
      Serial.print("Temperatura: "); 
      Serial.print(t);
      Serial.print(" *C");
      Serial.println();
      delay(1000);      

            if ((t)<=22){
            digitalWrite(6,LOW);}
            else 
            digitalWrite(6,HIGH);
           

            if (now.minute()>=5 && now.minute()<=6) digitalWrite (7,LOW);
            else
            digitalWrite (7,HIGH);
            






                  
    EthernetClient client = server.available();

      if (client) {

      boolean currentLineIsBlank = true;

      while (client.connected()) {

      if (client.available()) {

      char c = client.read();

      //if (c == "n" && currentLineIsBlank) {
 
      client.print("<HTML>");  
      client.print("<head>");
      client.print("<meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"" />");
      client.print("<title>CONTROLLO REMOTO</title>");
      client.print("
");
      client.print("</head>");
      client.print("<body bgcolor=""#c4f08f"">");
      client.print("<center>");
      client.print(now.day(),DEC);
      client.print("/");
      client.print(now.month(),DEC);
      client.print("/");
      client.print(now.year(),DEC);
      client.print("</center>");
      client.print("
");
      client.print(now.hour(),DEC);
      client.print(":");
      client.print((now.minute(),DEC));
      client.print(":");
      client.print((now.second(),DEC));
      client.print("
");
      client.print("UMIDITA':");
      client.print(h);
      client.print("
");
      client.print("TEMPERATURA:");
      client.print(t);
      client.print("

");
      client.print("<form name=""IMPOSTA TEMPERATURA""      action=""http://192.168.1.177"" method=""GET"" div align=""LEFT"">");
      client.print("</div>");
      client.print("

");
      client.print("<input type=""text"" size=""11"" maxlength=""2"" value=""Temperatura"">");
      client.print("<input type=""text"" size=""7"" maxlength=""2"" value=""Luce_ON"">");
      client.print("<input type=""text"" size=""7"" maxlength=""2"" value=""Luce_OFF"">");
      client.print("<input type=""submit"" align=""absmiddle"" value=""SALVA_MODIFICHE"">");
    
      client.print("</form>");
      client.print("</body>");
      client.print("</HTML>");
    
      Serial.println(c);
      
    
      delay(1000);
      client.stop();
      

          //}
        }
      }
    }
  }
}

questo è il codice completo.

Grazie in anticipo e BUONASERATA

Buonasera, forse ieri non mi sono spiegato molto bene, ci riprovo.
Come potete vedere dal codice nel post precedente, ho inserito nella pagina HTML un form con metodo GET, e un pulsante che mi invia all'IP di arduino le informazioni inserite appunto nel FORM.
Ho dichiarato precedentemente la funzione client.read() e l'ho stampata su monitor seriale, vi allego quella porzione di codice che ho modificato:

char c = client.read();
      msg += c;
      Serial.println(msg);

Ma la risposta che ottengo è la seguente:

GET / HTTP/1.1
Accept: text/html, application/xhtml+xml, image/jxr, /
Referer: http://192.168.1.177/
Accept-Language: it-IT,it;q=0.5
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: 192.168.1.177
Connection: Keep-Alive

Io ho inserito nel form 3 caselle di testo, nelle quali poter inserire dei valori numerici a due cifre, ma nella risposta non vedo nulla che fa riferimento a quelle caselle di testo.
Chi sa dirmi cosa è che mi sfugge??
GRAZIE

Scusate se insisto, ma non c'è nessuno che vuole darmi un consiglio? Almeno per capire se il problema sta nell'HTML oppure nel codice arduino.
Al momento sto cercando semplicemente di stampare su monitor seriale la risposta del client web,e ho la pretesa di ottenere qualcosa del tipo http://192.168.1.177/?FILE_INSERITI_NELLE_CASELLE_DI_TESTO
Ma quello che invece ottengo è:
GET / HTTP/1.1
Accept: text/html, application/xhtml+xml, image/jxr, /
Referer: http://192.168.1.177/
Accept-Language: it-IT,it;q=0.5
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: 192.168.1.177
Connection: Keep-Alive

Da quello che vedo su internet, la parte HTML dovrebbe funzionare quindi immagino sia qualche istruzione omessa o messa al posto sbagliato

Ho visto anche un esempio in cui si riesce a gestire dei led rgb attraverso form HTML metodo GET, ma non riesco ad interpretare ancora ogni riga del codice, per questo sto chiedendo nel forum.

Grazie a tutti e buonaserata

davide991:
Scusate se insisto, ma non c'è nessuno che vuole darmi un consiglio? Almeno per capire se il problema sta nell'HTML oppure nel codice arduino.

>davide991: ti rammento che, da regolamento, è permesso sollecitare risposte (fare "up") solo dopo almeno 48 ore dall'ultimo post. La prossima volta, post di sollecito, verranno eliminati.

Guglielmo

L'HTML della tua form è sbagliato, manca la proprietà "name" degli input box.
Come fa il metodo GET ad associare i dati che tu inserisci se non sa come si chiamano gli oggetti?

Anche l'indirizzo che passi come action non è corretto.
Devi inserire solo la pagina senza indirizzo dell'host che quindi nel tuo caso è la root "/"

Infine un paio di suggerimenti:

  • usa gli input type più adeguati al tipo di dati da inserire invece di usare solo il generico text;
  • usa lo stiling css per "abbellire" gli elementi html invece di passare le proprietà per ciascuno di essi

Ad esempio in questo modo https://codepen.io/cotestatnt/pen/gOMoZMr

Buonasera.
Innanzitutto chiedo scusa se ho violato il regolamento, non ricordavo assolutamente questa regola. Ci farò attenzione, promesso!

Ti ringrazio @cotestatnt, effettivamente è stato sufficente aggiungere la proprietà name... :slight_smile: :slight_smile:
per quanto riguarda l'abbellimento in css, me lo devo studiare perchè non l'ho mai usato, quindi pensavo di farlo funzionare come primo passo, e poi di migliorarlo sia da un punto di vista funzionale che estetico, però apprezzo molto il tuo consiglio, come anche quello di utilizzare gli input type piu adeguati.....non sono un programmatore esperto, e l'HTML lo sto cercando di imparare in questo momento....non ne ero a conoscenza che ci fossero così tanti input type.