[RISOLTO] Accesso alla pagina web su Eth Shield e blocco Arduino

Ciao a tutti,
vi leggo sempre spesso con interesse e trasporto tanto da tuffarmi ogni tanto in qualche progettino homemade :slight_smile:

Sto realizzando una mini growbox per coltivazione idroponica, il progetto è composto da:

Arduino UNO
DHT22 sonda temp e hum camera
DS18B20 sonda temp liquido
MCP23017 + scheda 8 rele' (pompa aria, liquido, ventilazione, luce)
DS1307 Rtc
Ethernet Shield

Tutto discretamente bene, sto ancora sistemando le visualizzazioni da browser ma incappo in un problema.
Devo tentare più volte di accedere alla pagina web, insomma non sempre sembra essere pronto lo shield, quasi come se non "capitassi" in quel punto di codice dove ho if(client).
E temo oltretutto che rimanendo nel while della stampa su browser, tutti i calcoli nel loop relativi alle tempistiche da rispettare, non vengano considerati, saltandomi accensioni o intervalli prestabiliti.

Non sono affatto un esperto di coding e suppongo ci sia qualcosa che non funziona a dovere oltre che a cicli confusionari.. se posso vi posto il codice del programma, ringrazio anticipatamente per qualsiasi suggerimento utile :slight_smile:
(p.s. temo che anche la gestione dell'ora abbia qualcosa che non quadra, probabilmente sono un po' incasinato tra le librerie rtc e time, l'idea era quella di sincronizzare l'RTC con arduino una volta al giorno secondo l'alarm inserito)

Ciao e grazie

idro.ino (8.9 KB)

In tutti il print, sia Serial.print che Client.print, inserisci la funzione F(), risparmi memoria RAM.
Devi inglobare il testo statico nella funzione F().

Serial.print("Esempio di testo statico");

a così:

Serial.print(F("Esempio di testo statico"));

e funziona anche con il println.
Non funziona con le variabili.

ok grazie, eseguo quanto prima.
Ai fini del problema di accesso alla pagina suppongo che non sia risolutivo questo passaggio, corretto?

Grazie

nessun altro suggerimento? heelp! :slight_smile:

E' difficile dirti il problema è li, apparentemente la parte webserver sembra contenga il minimo indispensabile per funzionare del resto e uguale allo sketch di esempio dell'IDE.

quando dici

incappo in un problema.
Devo tentare più volte di accedere alla pagina web, insomma non sempre sembra essere pronto lo shield, quasi come se non "capitassi" in quel punto di codice dove ho if(client).

che significa?

il browser aspetta un po' e poi carica correttamente?
il browser va in timeout?
devi aggiornare il browser più volte per rinnovare la richiesta e poi funziona?
ti visualizza a volte caratteri strani e scritte ripetute?
arduino si inchioda e devi resettare?
Stai usando il pin 4, hai per caso una SD inserita e non utilizzata?

Bisogna anche vedere tutte quelli lib che hai messo se arduino ce la fa a gestire in tempi brevi.

Hai dimenticato di inizializzare anche il gateway e la subnet per lo shield ethernet.

cambia questo

byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 199); 
EthernetServer server(666);

in questo

byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 199); 
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
EthernetServer server(666);

e nel setup cambia questo

 Ethernet.begin(mac, ip);

in questo

Ethernet.begin(mac, ip, gateway, subnet);

può non essere la soluzione ma sicuramente è più corretto fare così

Il valore del Gateway però può non essere corretto, io ora l'ho messo presumendolo dall'ip che hai assegnato ad arduino ma magari non è quello, è l'ip del tuo router quindi scoprilo e mettilo al posto del mio in caso fosse diverso :slight_smile:

Revengeic3:

Ethernet.begin(mac, ip, gateway, subnet);

Errato.

Quello corretto è

Ethernet.begin(mac, ip, gateway, gateway, subnet);

oppure se hai il DNS

Ethernet.begin(mac, ip, dns, gateway, subnet);

--> Ethernet - Arduino Reference

pablos:
E' difficile dirti il problema è li, apparentemente la parte webserver sembra contenga il minimo indispensabile per funzionare del resto e uguale allo sketch di esempio dell'IDE.

quando dici
che significa?

il browser aspetta un po' e poi carica correttamente?
il browser va in timeout?
devi aggiornare il browser più volte per rinnovare la richiesta e poi funziona?
ti visualizza a volte caratteri strani e scritte ripetute?
arduino si inchioda e devi resettare?
Stai usando il pin 4, hai per caso una SD inserita e non utilizzata?

Bisogna anche vedere tutte quelli lib che hai messo se arduino ce la fa a gestire in tempi brevi.

Si il webserver contiene proprio il minimo indispensabile, in breve digito l'ip su browser e se funziona entra istantaneamente altrimenti va in timeout e sul serial monitor vedo che non comprare la risposta di arduino alla richiesta html.
Se durante l'attesa del timeout pero' continuo a premere il refresh del browser ecco che prima o poi entra e sul serial monitor compare la risposta di arduino alla richiesta, quasi come se nel momento in cui io faccio richiesta dal web non "sono nel pezzo di codice che riporta if (client). Inizialmente pensavo fosse un problema dello shield ma questa situazione non si presenta se carico uno sketch semplice di esempio che nel loop ha solo la routine per la connessione html.

Il pin 4 é libero.. volevo inizialmente usare la SD per fare datalogging ma ho decisamente sforato con le memorie disponibili e ho ripiegato su un live di questo tipo, solo consultazione quando necessario.

Modifico subito i parametri eth grazie mille e nel frattempo allego un paio di immagini :slight_smile:
mi scuso per la rudimentalità ma sono ancora in fase di test

prova ad aumentare il delay(1) a delay(1000)

nuovo aggiornamento.
Ho modificato il codice con gli indirizzi eth corretti, per il settaggio del dns la digitura sembra essere questa:

IPAddress dnServer(192,168,1,254);

Tutto pare funzionare correttmente, cosa ho fatto? Beh sono passato dall'IDE 1.0.5 all'1.6.5 e aggiornando un bel po' di librerie. Ora la risposta del client e' istantanea e ogni passaggio dalla routine dello shield termina con una disconnessione e il mio codice continua a fluire; ho impostato tempi di attivazione delle ventole e pompe molto brevi per fare dei test e non ne sbaglia una anche se sono su browser.

Ma con mio enorme dispiacere, collego la lampada e cado nel baratro in cui ero finito tempo fa (per cui avevo eliminato il display lcd parallelo).
All'attivazione della lampada, Arduino inizia a fare cio' che vuole, senza senso, senza cadenza regolare, esegue le istruzioni che vuole e spesso rimane inchiodato in una funzione tipo questa:

  if (fanState == 1) {    // ventola,se timer attivo flag=1 accensione con umidità superiore al 70% o temp > 40 gradi 
    Serial.println("accensione ventola");
    Serial.print(hour(t), DEC);
    Serial.print(':');
    Serial.print(minute(t), DEC);
    Serial.print(':');
    Serial.println(second(t), DEC);
    
    mcp.digitalWrite(fan,HIGH);
    fanJobSec = 5; //tempo di lavoro in secondi 
    fanSeconds = (second(t)+fanJobSec%60);
    fanMinute = (minute(t)+(fanJobSec/60));
    if (fanSeconds > 60){
      fanSeconds = fanSeconds - 60;
      fanMinute ++;
    }
    if (fanMinute > 60) {
      fanMinute = fanMinute - 60;
    }
    fanState = 2;
  }

dove dovrebbe passarci una volta sola, ripetendola di continuo.

Sgancio il rele' finder dallo zoccolo, pilotato con 12vcc provenienti dal rele' dalla parte "logica" e tutto funziona correttamente.
Porto la fase direttamente sul comune del rele' finder e tutto funziona regolarmente.
Affido la lampada al rele' e addirittura quando parte la luce parte anche la ventilazione che dovrebbe rispettare un timer.
Ho collegato una rete RC in parallelo al carico dapprima e per test in parallelo al contatto, lieve miglioramento ma l'instabilita' e' tangibile.

Ho un serio problema che non so minimamente come risolvere ora, poco poco tangibile ahime'

IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
e il DNS

sono parametri inutili è un webserver non un webclient.

anche attendere 1 secondo per chiudere il server è uno spreco di tempo, al massimo puoi portarlo a 5-10 ms al massimo, ma non servirà a nulla, il problema ce l'hai sull'apertura del server.

Io ti consiglio di fare un passo alla volta partendo da un semplice webserver e aggiungere una lib alla volta col suo sensore e il suo pezzo di codice, fino a quando non noti questo rallentamento.

Aggiungi un led lampeggiante con 200ms di flash on e 200ms off e metti il codice BlinkWithoutDelay (che non usa delay() ), ha lo scopo di indicare visivamente il RUN del programma, ti aiuta a vedere nelle azioni che fai dove rallenta di più.

questi relè come li piloti? con un driver 2003A?
l'alimentazione 12vcc è la stessa di arduino?

addirittura quando parte la luce parte anche la ventilazione che dovrebbe rispettare un timer.

i pin output di comando hanno una R di pull-up o pull-down

Se scatta solo il relè senza carico da problemi?
se ci mentti una lampada normale (a carico resistivo) invece di una risparmio energetico che ha componenti reattivi, lo fa ancora?

Arduino e' alimentato a 12Vdc, con il regolatore interno alimento le varie periferiche (rtc ed mcp23017), la scheda rele' cinese, le ventole e le bobine dei finder posti dall'altro lato (foto sopra).
La scheda cinese e' pilotata da un mcp23017 e mi serve per controllare in continua le bobine dei rele' finder posti dall'altro lato. avevo optato per questa soluzione quando, con il display parallelo avevo tragici blocchi del sistema e anche per affidare i carichi a dei rele' un po' piu seri e soprattutto sostituibili.

dall'altro lato dell'armadio ho quindi una barra din con i finder, l'ultimo piu' a destra e' quello della ventola, ed e' proprio quello vicino al rele' della lampada.
Non ho resistenza di pull up o down in uscita al mcp23017.
Ricordo di aver testato con la resistenza di una stufa da 2kW e non avevo alcun problema (questo durante i test per il display)

Buongiorno a tutti!
Ho editato come "risolto" perche' finalmente ho trovato la soluzione.

Per quanto riguarda ethernet shield, alleggerire il codice con print(F(.. è stato d'aiuto per la memoria disponibile, ma la chiave di tutto è stato il passaggio da IDE 1.0.5 a 1.6.5 con conseguente update delle librerie. Errore mio non averlo fatto prima.

Invece il problema del blocco dell'UNO, con impossibilità di reset e sbiellamento generale era dovuto a piu' fattori, me ne sono accorto sezionando nuovamente tutto l'impianto.
In primis avevo alimentato l'UNO a 12V e alimentato le periferiche a 5V attraverso il regolatore onboard, testando l'impianto a banco mi sono reso conto che anche solo l'attivazione di 1 rele' sulla schedina accessoria genera una dissipazione di potenza del regolatore stesso non indifferente, tanto da causare il blocco totale e un ticchettio di rele' random di continuo. Alimentando a 5V l'UNO tutto fila liscio, nessun blocco, nessun surriscaldamento.
Passo successivo, come da voi indicato e' l'impiego di un ULN2003A tra MCP23017 e scheda rele'. Ora l'MCP e' in grado di pilotare la scheda rele' con precisione e soprattutto con la corrente richiesta, che anche se poca, non era in grado di supportare.

Ora tutto funziona a dovere!!!!

Grazie a chi ha saputo indirizzarmi verso la soluzione :wink: