Go Down

Topic: Arduino e Server Web esterno (Read 2671 times) previous topic - next topic

samana

Ciao a tutti, sono entrato da poco in questo bellissimo perchè vorrei realizzare un impianto di domotica a livello personale. Vi spiego quello che sto facendo e vi chiedo un consiglio in merito, cercando di essere breve.
Il mio progetto prevede l'uso di Arduino con Ethernet Shield, un web server gestito da un pc sulla stessa rete con server PHP per gestire l'interfaccia web e un DB MySQL per registrare i vari stati degli interruttori (ed altro).

Ho già realizzato il tutto in maniera molto semplice, vi spiego il funzionamento e il mio problema.

Se pigio un pulsante fisico si accende un led e subito dopo invio i dati a una pagina PHP che provvede ad aggiornarmi il DB, contemporaneamente nella pagina web il codice AJAX provvede ad aggiornare lo stato del LED. Viceversa se premo il pulsante da WEB si aggiorna lo stato del led nel DB e nel loop di arduino controllo ogni 300ms i valori nel DB e se sono cambiati provvedo ad accendere o spegnere il LED.

Il mio problema è che se il server web va giù (simulato semplicemente spegnendo il server PHP o staccando il cavo di rete dall'ES) arduino mi rimane bloccato sulla connect (precisamente sul Serial Monitor rimane qui Serial.println("connected");) e non accende il led, neanche se premo il pulsante fisico.
Vi posto dei pezzi di codice:

Nel loop ho questo:

void loop(){
 
  if (digitalRead(BUTTON)==1) {
          AccendiDaPulsante();
    }

String pageValue = connectAndRead();

if ((pageValue == "0") or (statoled == "0")) {
      Serial.println("LOW");
      digitalWrite(LED, LOW);
  }
  else if ((pageValue == "1") or (statoled == "1"))
  {
      digitalWrite(LED, HIGH);
      Serial.println("HIGH");
  }
  delay(200);
}


String connectAndRead(){ 
  if (client.connect(server, 80)) {
    Serial.println("connected");
    client.print("GET ");
    client.println(location);
    client.println();
    return readPage();
  }else{
    return "connection failed read";
  }
}

Nella readPage non faccio altro che assegnare 0 o 1 e valorizzare pageValue.

Dove Sbaglio? E' giusto secondo voi il sistema che sto utilizzando?

grazie dell'aiuto
Simone


astroz78

E' lo stesso sistema con cui abbiamo sviluppato il nostro impianto di domotica...e ci siamo già imbattuti su questo problema.

Il problema deriva dal fatto che nel metodo connect della classe EthernetClient c'è un loop di x secondi (mi pare 10) per tentare e ritentare la connessione. Finché il metodo connect non risponde e si ritorna al chiamante, gli altri "servizi" non possono elaborare e quindi non si possono campionare gli stati dei pulsanti ed eseguire le azioni ad esso collegate.

Non c'è soluzione a meno che non cambi il funzionamento della libreria EthernetClient.

Noi abbiamo risolto in altro modo: abbiamo reso la connessione passiva...cioè Arduino non si connette di sua sponte al server, ma lo fa quando il server stesso gli manda un comando per chiedergli di connettersi. Chiaramente questo comando viaggia in senso opposto: arduino fa da server e il server da client. Quando il server chiede ad Arduino di connettersi, esso esisterà di sicuro sulla rete. Quando sparisce dalla rete, la connessione cade e non viene automaticamente ripristinata dal nodo, lasciandolo libero di seguire gli altri servizi.
OpenDomotica ...la domotica con Arduino - www.opendomotica.it

samana

Ok grazie, a dire il vero avevo anche pensato di suddividere i compiti a due Arduino differenti, e collegarli tra loro via seriale, ma i costi sarebbero aumentati. Proverò questa strada. Grazie ancora


Ok grazie, a dire il vero avevo anche pensato di suddividere i compiti a due Arduino differenti, e collegarli tra loro via seriale, ma i costi sarebbero aumentati. Proverò questa strada. Grazie ancora


Ciao Simone,

Sei riuscito alla fine a risolvere il problema?
http://www.ciproconsulting.it

samana

Si si, come ha detto astroz78 funziona, solo che ora devo riscrivere tutto il codice perchè non va piu' bene quello che avevo fatto... :)

Rinpe

Ciao a tutti, approfitto di questo topic per chiedere delle delucidazioni riguardo il webserver e il webclient su arduino perchè mi sa che ho una mega confusione in testa.  :P
Anche il mio obiettivo è quello di utilizzare arduino e ethernet shield per un progetto domotico per accensione luci, tappasrelle, temperature, sensori pioggia ecc nella casa. Ho fatto alcuni sketch di prove accendendo led ecc e interagendo con il browser.
La mia domanda o meglio la confusione che ho ancora in testa è questa:
supponiamo che io ho l'ip del mio arduino 192.168.1.100; quando nello sketch scrivo client.print (...) teoricamente vado a crearmi una pagina web che ha come indirizzo quello di arduino quindi sto creando un webserver, corretto? (speriamo). Ora se io volessi crearmi una pagina esterna all'arduino (o cmq un sito), crearmi quindi un qualcosa con dei programmi tipo dreamweaver o altri web editor e mettere questo sito su un tablet o pc o quant'altro, che tipo di indirizzo ip avrebbe? chi diventerebbe il server e chi il client con arduino?
Pensavo che si potesse scrivere un sito esterno con un web editor e poi nello sketch di arduino scrivere solo alcuni client.print(...) che scrivessero su quella pagina o sito ma non saprei l'indirizzo  e non saprei se si può fare così.
Comunque avete capito che ho un casino in testa su questa cosa e finchè non ce l'ho chiara è difficile che possa continuare a ragionare con la mia testa...Qualcuno sarebbe così gentile in poche parole (semplici) dirmi come funziona sta cosa oppure qual'è il modo giusto sul quale possa continuare a ragionare?
Grazie mille
Ciao

pablos

#6
Nov 17, 2012, 10:58 pm Last Edit: Nov 17, 2012, 11:37 pm by pablos Reason: 1
Visto che vuoi una cosa semplice

Il server è silenzioso, non parla mai se non gli fai delle domande (richieste), quindi il server ti invia quello che gli chiedi.
Chi è che fa le domande? Il client!

Tu col tuo pc a casa quando fai una ricerca su google sei un client, chiedi al server di mandarti il risultato preciso di una ricerca.

Quindi se arduino è un webserver, esso risponderà solo quando ti colleghi e quando gli fai delle domande sullo stato delle sue porte con un client. E' logico che devi conoscere l'IP di arduino

Se arduino deve invece mandare dei dati ogni tot minuti ad un server esso sarà un client. Al server non interessa sapere l'IP di arduino

Quando tu dici
Quote
Ora se io volessi crearmi una pagina esterna all'arduino (o cmq un sito), crearmi quindi un qualcosa con dei programmi tipo dreamweaver o altri web editor e mettere questo sito su un tablet o pc o quant'altro, che tipo di indirizzo ip avrebbe? chi diventerebbe il server e chi il client con arduino?

Qui bisogna vedere cosa intendi per creare un sito, un sito si costruisce su un server comprando uno spazio web e un dominio con tanto di mail dedicate, php 5.x o superiore, mysql ecc. (anche a casa tua se hai un ip statico e una macchina sempre accesa)
In questo caso sarà arduino a mandare ogni tanto i dati all'indirizzo www.miosito.it/dati.php .... sul server ci sarà un programma php (fatto da te) che è in attesa di ricevere i dati, sempre in questo caso l'ip del server è relativo saperlo visto che ha un link per raggiungerlo e al server non interessa sapere l'ip di arduino. Quando tu vorrai sapere come sta arduino dovrai andare su www.miosito.it/pagina.html che visualizzerà i dati raccolti e archiviati dal php

Se invece vuoi realizzare una pagina html nel tuo pc (che non è un sito) con es. dei tasti, questi dovranno fare delle GET all'indirizzo ip di arduino, in questo caso arduino è sempre un server. Il creare la paginetta sul tuo pc renderà le cose più difficili se vuoi visualizzare gli stati con un tablet fuori casa.

Se vuoi complicarti ancora di più la vita arduino può avere entrambe le funzioni, ogni tanto il programma può alternare facendo un po' da server e un po' da client.


Quote
quando nello sketch scrivo client.print (...) teoricamente vado a crearmi una pagina web

quando scrivi client.print stai rispondendo alla richiesta del client e arduino come server gli invia il contenuto di quello che vuole sapere o meglio di quello che vuoi fargli sapere scrivendolo nello sketch
client.print=stampa sul client (...)

Questo è in sintesi come funziona il sistema, poi come ti ho già scitto in altre occasioni ci sono molti modi di sviluppare un dialogo tra macchine su rete e molti sistemi di programmazione che dipendono dalla difficolta, potenza di quello che si vuol fare, ognuno è affezionato al suo metodo come un medico è specializzato su una piccola parte del corpo umano, non può sapere tutto, spesso si deve consultare con altri specialisti.

ciao

no comment

Rinpe

Grazie Pablos, mi è un po' più chiara la situazione ora...anche se devo assimilare ancora tantissime nozioni per capire più in dettaglio altre cose.
Ciao

pablos

Visto che vuoi fare un piccolo webserver che possa essere visualizzato da pc o tablet con aggiornamento automatico ti consiglio di dare un occhiata alla libreria tinywebserver, è un po' complicata se hai poche nozioni, ma tocca molti argomenti che possono interessarti a titolo di studio, server, client, pagine html, css, autorefresh, javascript, json, GET, POST, uso di SD su arduino ecc
no comment

Rinpe

Grazie pablos ci darò sicuramente un'occhiata. Sai per caso se ci sono degli esempi simili (e semplici :P) di quel che vorrei fare in modo da poter fare il "reverse engineering" e capire al meglio il tutto?
Grazie ancora
Ciao

Rinpe

Ciao...ho provato a girare un po' nel forum e ho trovato questo topic:

http://arduino.cc/forum/index.php/topic,54797.15.html

Volevo infatti provare a partire da qui per poter vedere passo passo come funziona la cosa. Ho visto che Gianni C. ha modificato la libreria WebServerSD. L'ho caricata come libreria come descritto nel topic e ho provato a lanciare lo sketch demo ma ahimè arrivano ancora prima gli errori senza neppure modificare una virgola.
Qualcuno sarebbe così gentile da dirmi cosa sta succedendo?
Allego il malloppo con sketch, libreria e errori che mi fuoriescono.

Grazie
Ciao

Go Up