Ethernet shield - php server - interazione

Salve a tutti, ho da fare un progetto di domotica. Ho alcune domande a cui non riesco a trovare delle risposte e ho deciso di scrivere qua forse qualcuno ha trovato già risposte alle stesse mie domande.
Comunque ho un arduino uno, ethernet shield, server php (xampp)

voglio fare in modo che da una pagina php mando una richiesta al ethernet server di arduino ed essa mi risponda con un valore, ok, non so se mi sono spiegato, faccio un esempio: su una pagina php voglio vedere la temperatura (che ho sul piedino A0 del mio arduino) ma lo voglio fare nel seguente modo: quando apro una pagina php per esempio temperatura.php questa mi legga il valore del piedino A0 e lo mostri a video. Io ho pensato un modo per farlo ma non ci riesco, forse perché non è proprio quello giusto, allora quando si carica la pagina temperatura.php mandi un “get” al arduino vede la richiesta è manda un get alla pagina termostato.php che mostra il valore ricevuto da arduino.

Spero che mi sono fatto spiegare, se qualcuno mi potrebbe dare una mano sarei molto grato. :frowning:

Ciao, che comandi usi dal php per inviare la richiesta? Sei sicuro che Arduino sia correttamente pronto a ricevere richieste? E poi scusa le domande..... Stai usando un server free o a pagamento? Tra i 2 nel traffico in uscita e in entrata al server fa una grande differenza Ciao

Ciao, sto usando dei semplici get. Le richiest arrivano al arduino perché li visualizzo anche con il serial monitor ma non sono sicuro che i risultati arrivano al php, ma penso che il problema sia nel fatto che leggi semplicemente il get mettendolo in una variabile $dato poi cerco di visualizzarlo con echo ma adesso voglio provare a memorizzarli in un database

Sto usando xampp, sul locale

Ciao, per recuperare i dati su Arduino e visualizzarli sul browser usando una pagina php, hai 2 modi: - fai la chiamata ad Arduino, che ti restituisce il valore richiesto; salvi questo dato su file/db; puoi quindi aprire la pagina php che ti serve per visualizzare il dato, la quale ti mostrerà il dato salvato su file/db. Il problema di questo metodo è che è brigoso, e richiede che tu apra un'altra pagina per visualizzare il dato. - utilizzi ajax (via jquery o simili), e all'apertura della pagina php, effettui la GET in background, andando poi a compilare un campo predefinito con il valore restituito dalla GET. Vedi qui: http://api.jquery.com/jQuery.get/

Hai pensato poi all'alternativa, ovvero invece di utilizzare la pagina php su LAMP server, di gestire una pagina html direttamente su Arduino?

grazie mille per la tua risposta, il primo modo l’ho intuito anch’io ma non credevo che sia una cosa giusta poi grazie di avermi suggerito anche l’ajax

si, ho pensato anche a quello ma volevo fare qualcosa di più speciale senza andare a scrivere ogni
nel sorgente di arduino e in più con il php posso manipolare i dati più facilmente

Grazie ancora per la tua risposta

Anche il cURL in php ti fa la richiesta direttamente, header da vedere non me lo ricordo bene un tempo li usavo, ti ho chiesto se era free o a pagamento perchè nei server gratuiti i comandi header e curl vengono deliberatamente bloccati.

ciao

Io uso il primo metodo descritto ho 2 stazioni: 1- ogni 600 secondi arduino lancia un get verso il mio webserver e nell'url inserisce i dati da loggare, la pagina che chiama è in php e fa il parsing degli argomenti loggando poi nel sistema di logging (uso linux e syslog-ng) 2- ad orari prefissati viene lanciato uno script da crontab sul mi server. parte un wget verso ardino che risponde con i dati contenuti nella pagina (non html, ma txt). il file generato dal wget viene analizzato e i dati vengono loggati (il parsing lo faccio con python) Quando poi dall'interno di casa mia chiamo il mio sito con i dati, degli altri script in python (chiamati da php) analizzano i log e riportando solo parti interessanti o generano grafici (con openflashchart)

ciao teo

sarebbe bello vedere anche il cUrl

allora io ho da fare un piccolo progetto perché l'ho scelto proprio come tesina per la maturità, quindi voglio fare un piccolo modellino di una casa dove mettere dei sensori di temperatura, ldr... un paio di led per l'illuminazione e magari se riesco a mettere anche qualche servo per delle porte o qualcosa del genere

con questo progetto riesco a mettere insieme elettronica informatica sistemi e anche statistica quindi mi pare ottimo, se avrò tempo ho in mente di fare anche un'applicazione per iPhone oppure mi limito a un piccolo sito scritto in php

è bello come idea ma mi sembra che quello con jQuery sia migliore nel mio caso boh.. vediamo se riesco a fare qualcosa

è bello come idea ma mi sembra che quello con jQuery sia migliore nel mio caso boh.. vediamo se riesco a fare qualcosa

..se poi passi di qua: http://jquerymobile.com/ :P

la differenza sostanziale tra i due metodi è che jQuery è eseguito lato browser, cURL lato server (dal motore php)
ogni approccio ha pro e contro a seconda dei casi…

voglio fare in modo che da una pagina php mando una richiesta al ethernet server di arduino ed essa mi risponda con un valore

Il php in realtà visto così sarebbe un client e arduino un webserver, quindi tanto vale che si crea una pagina html e jquery. Se invece è arduino il primo a inviare i dati allora ha senso il file php in ascolto su server. Dico bene o dico giusto? correggetemi se sbaglio

ciao

Intendi html e jQuery da arduino o sempre da un altro server? Ma io vorrei anche memorizzare dei dati per poi fare dei grafici

Certo che puoi fare i grafici raccogliendo i dati.

Dipende dalle tue necessità e quantità di dati - Puoi fare arduino webserver con sd card che registra i dati (quindi indipendente), interrogarlo ogni x tempo scaricandoli da remoto e rappresentarli poi su un grafico

-Fare arduino client che spedisce costantemente i dati a un server con php in ascolto, se li memorizza su mysql database e rappresentarli su grafico

dipende un po' da cosa ti viene meglio, certo se 2 gb non ti bastano o la rappresentazione grafica deve essere fatta in tempo reale la prima soluzione è da scartare

dipende un po' da cosa ti viene meglio, certo se 2 gb non ti bastano o la rappresentazione grafica deve essere fatta in tempo reale la prima soluzione è da scartare

non è detto :) http://www.highcharts.com/demo/dynamic-update

Cmq se devi gestie e storicizzare dati, e tu puoi appoggiare a server LAMP, la soluzione già proposta e migliore é: - Arduino con client regolarmente effettua una GET su tuo server, passando i dati da salvare; - lato server, avrai uno script php che riceve la GET da Arduino, e salva su DB/File i valori - lato server, avrai un'altro script (o lo stesso) che ti fa visualizzare i dati fin'ora salvati..

Si è parlato di qualcosa di analogo poco tempo fa: http://arduino.cc/forum/index.php/topic,89530.msg680344.html#msg680344 (da qui in poi)

Si, infatti ho detto che la prima è da scartare .... "fare arduino webserver con sd card"

grazie a tutti, adesso mi sono messo a fare delle prove con jQuery

ho scritto questo codice provaj.html

<!DOCTYPE html>
<html>
<head>
 <script src="jquery-1.7.1.js"></script>
 <script>
   function invia() {
     // invio, richiedo dati		
     $.get( 'http://192.168.1.177', { data: 'pinD3' }, 
             function( answer ) {
               $( "#result" ).html( answer );
             }
           );
   };
 </script>
</head>
<body>
 <input id="prova" onclick="invia()" type="button" value="Invia"/>
 <div id="result"></div>
</body>
</html>

funziona tutto bene mi accende il led del pin digitale 3 ma non riesco a mandare il messaggio indietro da arduino
nello sketch di arduino cosa dovrei mettere? un semplice client.println(“messaggio”) o qualcos’altro?

ciao, posta anche il codice Arduino.

Cmq sì, dovresti gestire una risposta da parte di Arduino (a seguito della conferma di ricezione - il 200 OK), con content-type text/plain

il codice di arduino è molto semplice ma non mi mostra il messaggio

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0x90, 0xa2, 0xda, 0x0d, 0x05, 0x18 };
IPAddress ip(192,168,1,177);

EthernetServer server(80);

void setup(){
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.println("ready");
}

void loop(){
  EthernetClient client = server.available();
  if (client) {
  while (client.connected()) {
  if (client.available()) {
  
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("messaggio");
  
  if( client.find("pinD3") ) { // search for 'GET'
  
  Serial.print("Digital pin ");
  pinMode(3, OUTPUT);
  digitalWrite(3, HIGH);
  }
  // give the web browser time to receive the data
  delay(1);
  client.stop();
  }
  }
}}

Si devi mettere un client.print ciao

Si devi mettere un client.print ciao

…mi sa meglio un
client.println() :stuck_out_tongue:
dopo il println del tuo messaggio.