Inviare e ricevere dati da\a arduino tamite pagina php

Ciao a tutti è da un po che leggo il forum ma è la prima volta che scrivo.
Come da oggetto vorrei sviluppare un progetto che prevede la comunicazione tra arduino (ethernet shield) ed un server apache (php).
Ho guardato un po in giro ma non ho trovato esattamente ciò che cercavo.

Faccio un esempio più pratico

arduino gestisce tre LED e tre pulsanti , tramite pagina web voglio inviare un comando che mi permetta di accendere o spegnere uno o più LED , in oltre se viene premuto un pulsante arduino deve accendere il led corrispondente e segnalare alla pagina web tale cambiamento

ho un po di esperienza in php infatti le varie pagine aggiornano un db con lo stato dei led solo che non sono ferrato in c per programmare l'arduino

grazie in anticipo

allora ci sono 2 possibilità. o ti basi sul TCP, e usi i socket in PHP (che però molti server web gratuiti bloccano), in questo caso negli esempi nell'arduiono IDE guarda TelnetClinet (anche se in realtà la parte client la farà il server web e l'ardino sarà il server telnet)

altrimenti puoi inviare ad arduino delle richieste get, anzi usarlo proprio come server web (ma niente PHP), in questo caso guarda l'esempio serverWeb (o serverHttp)

grazie della risposta !
continuando a cercare ho trovato ciò che cercavo qui http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1292593338/15

quello va bene se è l'arduino che fa da client, ovveri invia i dati al web server, ma non al contrario

Ciao,

esistono molti modi per fare sviluppare l'applicazione che hai in mente.
La logica generale di funzionamento puo',ad esempio, essere articolata in vari modi:

a) standalone -> l'arduino svolge tutti i compiti, ossia agisce da server web e implementa tutte le funzionalita' di interazione coi client (browser Internet o di altro tipo).

b) soluzione mista con webserver centrale "tradizionale" (Apache + PHP + MySQL, ...), con cui interagiscono i vari client (browser internet o di altro tipo), e Arduino che interagisce solo col webserver centrale scambiando i dati sullo stato dei sensori e per agire sui vari dispositivi di output (realis, led, ...).

Lo scambio di dati puo' avvenire in questo secondo caso in modalita' pull o push (o mista), ossia il webserver centrale richiede periodicamente i dati, oppure e' l'Arduino che inizia il processo "chiamando" il server centrale.

Un esempio di questa struttura lo hai con Patchube (http://www.pachube.com), vedi esempi:
http://community.pachube.com/tutorials#arduino
http://www.australianrobotics.com.au/news/web-data-logging-with-pachube-round-2

Patchube utilizza varie modalita' per lo scambio di dati in formato XML, CSV, JSON, ... utilizzando come protocollo di trasmissione HTTP.

Lo scambio di dati nella soluzione b puo' utilizzare l'HTTP (GET, POST, PUT, ...), per cui trovi vari esempi in rete. l'XML e' un formato un po' troppo pesante per l'Arduino, per cui non te lo consiglio.

La soluzione b ti permette di avere un maggior controllo sull'interazione degli utenti con l'Arduino, infatti puoi realizzare implementare con PHP le logiche di accesso e di controllo delle richieste che preferisci, immaganizzare i dati, ecc..

Ciao,
Marco.

Grazie delle info appena sviluppato qualcosa di concreto posto i risultati

al momento riesco tramite browser inviare dati ad arduino (accendere spegnere LED).

ora vorrei che alla pressione di in pulsante collegato ad arduino (pin 2), faccia partire uno script php sul web server apache . Al momento ho scritto questo codice ma purtroppo non va .... qualcuno mi sa indicare dove sbaglio?

grazie

if (client.connect()) {
Serial.println("Connected!");

client.print("GET /http://192.168.0.199:8080/cambiastato2.php HTTP/1.0");

Serial.println("datoinviato");
Serial.println ( "disconnecting." ) ;
client.stop();

l'ip lo devi usare quando inizializzi il client e dopo devi usare l'indirizzo senza ip. inoltre mi sa che ti serve un println (con il ritorno a capo) perchè venga inviato il comando.

byte server[] = { 192,168,0,199 };
Client client(server, 80);

void setup()
{
   if (client.connect()) {
      Serial.println("Connected!");
      client.print("GET /cambiastato2.php HTTP/1.0");
      client.println();
   }
}

purtroppo non va ancora ... come posso monitorare cosa esce da arduino?

fai un programmino che ascolta la una porta sul tuo pc, e mostra a video tutti i dati che riceve.

  1. attenzione che nel codice di loolo si collega alla porta 80 e non alla 8080

  2. il doppio a capo è obbligatorio

  3. if (client.connect()) {
    Serial.println("Connected!");
    ...
    client.stop();
    quindi in teoria funziona una volta sola (a quanto pare, poi senza avere il resto del codice...)
    Sicuro di essere connesso (e quindi entrare nell'IF?)

ah scusa io ho scritto
Client client(server, 80);
ma nel tuo caso sarebbe
Client client(server, 8080);

ma digitando l'indirizzo nella barra degli indirizzi ti funziona correttamente?

@lollotek per la porta avevo inserito quella corretta e digitando negli indirizzi lo script funziona tranquillamente ... ho come l'impressione che non punti al path giusto lo script in questione è su un server apache installato sul mio pc ....

@lesto sono cero che entra nell if perchè mi scrive connesso sul serial monitor e tale comando è dopo l' IF ...

al momento il codice è questo ... ma continua a non funzionare

if (digitalRead(2) == HIGH) { 
Client client(server1 , 8080);
Serial.println();
Serial.println("Initiates connection…");
Serial.println("Connecting…");
delay(1000); 


if (client.connect()) {
      Serial.println("Connected!");
      client.print("GET /cambiastato2.php HTTP/1.0");
      client.println();
      client.println();
      client.stop();
   }

prova ad aggiungere un a capo alla richiesta della pagina:
client.print("GET /cambiastato2.php HTTP/1.0\n"); invece che
client.print("GET /cambiastato2.php HTTP/1.0");

ma come fai a capire o meno se va? hai debbuggato sparando i dati sulla seriale?

devi mettere un delay prima del cliest.stop(), altrimenti la connessione viene chiusa prima che la pagina sia servita, e di conseguenza non vengono sprecate risorse per creare la pagina ed eseguire gli script.

è perfetto!!!

funziona \n è stata la soluzione, posto il codice nel caso dovesse servire ad altri utenti

Grazie mille!

Client client(server1 , 8080);
Serial.println();
Serial.println("Initiates connection…");
Serial.println("Connecting…");
delay(500); 
if (client.connect()) {
     if (statoluceingresso == 0){
        digitalWrite(9, HIGH);
        statoluceingresso = 1;
        } else {
        digitalWrite(9, LOW);
        statoluceingresso = 0;
        }
      Serial.println("Connected!");
      client.print("GET /cambiastato2.php?stato=");
      client.print(statoluceingresso);
      client.print("HTTP/1.0 \n");
      client.println();
      client.stop();

Salve a tutti, scusate se mi presento direttamente in un post di risposta.
complimenti per il forum.
ho ordinato il mio arduino uno e sono in attesa che arrivi presto,
ho ripreso questo post perchè credo che gestire un led da internet sia un pò il "sogno" di tutti almeno per chi inizia.
allora se è possibile usando questo codice scritto in questa discussione si può fcare una guida con commenti e spiegazioni per arrivare a gestire un led ?
se nn va bene come idea cancellate pure la mia risp....come nn detto
grazie a tutti

Utilizzo Intel Galielo e a me fallisce sempre la connessione! Perché?
Ecco il mio codice:

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


byte mac[] = { 0x98, 0x4F, 0xEE, 0x00, 0x55, 0xCD };
byte ip[] = { 160, 78, 27, 210 };
byte server[] = { 64, 233, 187, 99 }; // Google

EthernetClient client;

void setup()
{
  Ethernet.begin(mac, ip);
  Serial.begin(9600);

  delay(1000);

  Serial.println("connecting...");

  if (client.connect(server, 80)) {
    Serial.println("connected");
    client.println("GET /search?q=arduino HTTP/1.0");
    client.println();
  } else {
    Serial.println("connection failed");
  }
}

void loop()
{
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    for(;;)
      ;
  }
}

Ho provato a fare il procedimento inverso, cioè ad inviare dati ad una pagina in rete, ma allo stesso modo la connessione fallisce!
Qualcuno riesce ad aiutarmi?

byte ip[] = { 160, 78, 27, 210 };

sicuro di ciò?

se provo a fare un ping mi risponde....
è l'ip del microprocessore

sìsì, è solo che è un ip particolare, pensavo magari lo avessi messo a caso.

client.println("GET /search?q=arduino HTTP/1.0");

dopo aggiungi anche l'header HOST

client.println("Host: www.google.com");

e poi ci va un DOPPIO a capo (quì non sono sicurissimo)

client.println();
client.println();