Arduino e PHP

Salve a tutti!! avrei una domanda come posso passare una variabile php da arduino a una pagina php??
Se ho capito bene sullo script php devo mettere una variadile tipo

$pippo = ["pippo"]

su arduino devo scrivere

get /http://mio ip/file.php?pippo=1 HTTP/1.1

in questo modo nella variabile pippo dovrebbere prendere1 giusto?
Altra cosa che ancora non ho specificato, il mio programma su arduino è stato scritto per prendere dei valori da telnet quindi non è proprio html puro

grazie per l'aiuto

in php (e qui parlo da semi-esperto :smiley: ) per gestire le variabili in get si usa una variabile globale, che assume il valore di un array.

significa che la parte arduino è giusta (almeno credo, non sono bravo con eth shield) ma su php per richiamare la variabile non basta ["pippo"] ma devi usare $_GET["pippo"]
se invece vosse passata in post dovresti usare $_POST["pippo"]

ultima cosa, assicurati che sul server sia utilizzato php dalla versione 4 in poi, infatti nelle versioni prima le variabili globali erano diverse.

spero di essere stato chiaro :wink: in poche parole per quello che vuoi fare:

$pippo = $_GET['pippo'];

Grazie superlol. ora provo subito e ti faccio sapere. purtroppo in php scarseggio un pò!!!

scusa una cosa così al volo. ma nel caso volessi spedire una variabile (lo stato di un led che varia) al php e il php a seconda se il led è acceso o spento me lo scrive sulla pagina web, come dovrei fare?

ARDUIX:
scusa una cosa così al volo. ma nel caso volessi spedire una variabile (lo stato di un led che varia) al php e il php a seconda se il led è acceso o spento me lo scrive sulla pagina web, come dovrei fare?

<?php
$stato = $_GET['stato'];
if ($stato == "on"){
echo "Il led è acceso"; //stampa a schermo il led è acceso.
}else if ($stato == "off"){
echo "Il led è spento"; //stampa a schermo il led è spento.
}
?>

Semplicemente se lo script risiede nella pagina: check.php
tu dovrai passare questi parametri per comunicare allo script se il led è acceso o spento:
http://localhost/check.php?stato=on
oppure
http://localhost/check.php?stato=off

Rispettivamente quando viene passato il parametro on stamperà il led è acceso. Se viene passato alla variabile stato il valore off stamperà a schermo il led è spento

Il mio è soltanto un abbozzo di codice :wink: a seconda delle necessità puoi modificarlo o fargli fare qualcosa di + carino.

NB. da precisare che il php se non glielo comunichi non può sapere se un led è acceso o spento interrogando l'arduino.

Ciao ARDUIX, posta tutto il codice sia PHP che Wiring così riusciamo ad aiutarti meglio

[OT]
Nel codice che mi hai mandato per PM non essendo io tanto bravo in C non ho capito dove possa essere l'errore anche perchè non ho capito come sia al momento il codice PHP della pagina.
[/OT]

@FastChallenge
il codice è corretto, ma non può funzionare per come chiede ARDUIX.
ARDUIX infatti chiede:

ma nel caso volessi spedire una variabile (lo stato di un led che varia) al php e il php a seconda se il led è acceso o spento me lo scrive sulla pagina web, come dovrei fare?

ciò sarebbe possibile solo se php salvasse lo stato del led su file fisico.
INfatti il php è un linguaggio interpretato, e viene eseguito ogni qualvolta viene richiamato.
Questo significa che se Arduino in modalità client aprisse una connessione con il nostro server php, passando in GET il valore che dichiara che il led è acceso, in realtà l'unico fruitore della pagina web con la stampa a video corretta sarebbe .. Arduino stesso.
Chiunque altro non vedrebbe nulla che indichi lo stato del led.

Se, come detto sopra, lo script salvasse su file (o db) lo stato attuale del led, dopo la "chiamata" Arduino, allora il dato sarebbe fruibile da chiunque.
Quindi:

  • Arduino con una GET comunica al nostro server php lo stato del led, e lo script php salva su file o db questo stato
  • chiunque interroghi la pagina php (senza GET), ottiene dallo script (che va in questo caso a rileggersi il file o db) lo stato del led.

Questa è la easy way.

Potresti altrimenti farti una semplice pagina php che grazie ad ajax effettua una query asincrona ad Arduino, interrogandolo (via GET, POST o altro) realtime sullo stato del led.
Arduino da bravo (scherzo: dipende da come lo programmi) restituirebbe lo stato del led, e tu potresti così visualizzarne sulla tua paginetta lo stato reale...

Hai ragione pitusso. Infatti sotto al mio post ho scritto chiaramente un Nota Bene:

NB. da precisare che il php se non glielo comunichi non può sapere se un led è acceso o spento interrogando l'arduino.

Appunto il php non può interrogare l'arduino. Come hai proposto la soluzione sarebbe quella di far creare ogni tot secondi da arduino un file che indichi lo stato del LED. Però credo sia un enorme spreco di risorse. Non sarebbe a questo punto più facile usare python? fare in modo che quando viene richiamata la pagina php, si aziona lo script python che riesce a comunicare in seriale con Arduino e controllare lo stato del LED?

PS. solo ipotesi, sono nuovo dello scenario arduino :slight_smile:

Come hai proposto la soluzione sarebbe quella di far creare ogni tot secondi da arduino un file che indichi lo stato del LED

no, non mi son spiegato.

Arduino comunica alla pagina php lo stato del led, usando una chiamata GET ad ogni variazione di stato (cioè: "ho acceso il led" / "ho spento il led"), e lo script PHP va a scrivere su file o db questa informazione in modo che sia fruibile senza ulteriori chiamate ad Arduino.

L'altra ipotesi è fare in modo che, ad interrogazione della pagina php da parte di utente, in maniera asincrona avvenga la query ad Arduino.
In questo caso è possibile che si rischi di sovraccaricare Arduin di richieste (per es: ad ogni refresh o in caso di più utenti contemporanei), ma il dato sarebbe "fresco".

Con queste soluzioni, però, Arduino è in rete con il suo Ethernet Shield.
In caso di Python (idem con Processing, Java, VB, etc), invece, ci vorrebbe la connessione seriale.
Sempre che non effettuino la chiamata GET / POST, ma in tal caso nulla cambierebbe per Arduino.

EDIT

Hai ragione pitusso. Infatti sotto al mio post ho scritto chiaramente un Nota Bene:

NB. da precisare che il php se non glielo comunichi non può sapere se un led è acceso o spento interrogando l'arduino.

scusa non mi era molto chiaro quel NB.
Come detto sopra, però, php può sapere in che stato è i led nel caso in cui lo vada a chiedere direttamente ad Arduino :stuck_out_tongue:

Ahhh ho capito perfettamente adesso... grazie.

Rimane sempre Arduino a pilotare la situazione. Ogni volta che cambia di stato il led. Lo comunica ad uno script in php che se lo "annota" in un file.. o meglio ancora in un DB mysql. Poi quando si richiama lo script php, preleva l'annotazione la dove l'aveva salvata.

Rimane sempre Arduino a pilotare la situazione. Ogni volta che cambia di stato il led. Lo comunica ad uno script in php che se lo "annota" in un file.. o meglio ancora in un DB mysql

certo, questo è una delle strade.
Che permette anche di mantenere uno storico, se ti salvi insieme all'informazione LED on/off un timestamp.

Rimangono comunque valide le altre alternative:

  • chiamata a file php con relativa chiamata asincrona ad Arduino per query sullo stato del led;
  • (questa è una evergreen) paginetta html scritta direttamente da Arduino (in questo caso non serve altro...);

Intanto grazie per le risposte l'unica perplessità ,premetto che non ho ancora provato con arduino, ma se i comandi ho fatti in modo che arduino li prenda tramite telnet come faccio a mandare un get che è un comando html
Scusate se è una domanda banale ma prima di perdere ore preferisco domandare
grazie

ARDUIX,

i comandi ho fatti in modo che arduino li prenda tramite telnet

non capisco, il thread si chiama "Arduino e PHP"...

Spiega per cortesia in modo verboso cosa hai tu (Arduino, Ethernet shield, ... altro)
e cosa vuoi fare, poichè le tue parole son state:

come posso passare una variabile php da arduino a una pagina php??

telnet usa il TCP, l'HTTP(non l'HTML) è un derivato del TCP, quindi puoi usare telnet se conosci i comandi HTTP
per inviare una richiesta get via telnet basta che scrivi

get /file.php?pippo=1 HTTP/1.1
(a capo 2 volte)

l'HTML è solo un modo per scrivere le pagine, l'HTTP è il protocollo per comunicare queste pagine (quello che ti interessa), altre info: Hypertext Transfer Protocol - Wikipedia

Hai ragione il mio progetto è questo:
su arduino ho fatto un programma in modo che con telnet mi accenda e mi spenga tre led tramite b c d
tramite pagina php ho fatto tre pulsanti html che mi fanno una connessione con php e mandano il valore b per accendere il primo led c per il secondo d per il terzo e fin quì tutto ok
con il millis su arduino ho temporizzato i led in modo che dopo 5 sec mi si spengano e fin quì tutto ok
il problemone è che non riesco a vedere se il led si è veramente acceso e per questo il codice che mi è stato meso in calce va benissimo ma visto che il codice arduino è stato scritto per il telnet no so se il get mi funziona, e sto cercando di risparmiare ore se mi sapete dire questa cosa tutto qui
grazie

grazie lesto
get /http://ipmioserver/file.php?pippo=1 HTTP/1.1
(a capo 2 volte)

perchè a capo due volte????

non ho ancora ban capito come comunichi con arduino.
caso 1: la pagina php crea una connessione TCP (con i socket) all'arduino: in questo caso la connessione è a due vie e il php e arduino possono comunicarsi quello che vogliono

caso 2: la pagina html contiene un form che invia la richiesta ad arduino.
arduino riceverà una richiesta simile:

GET /file.php?pippo=1 HTTP/1.1 
Connection: Keep-Alive
User-Agent: Mozilla/5.0 (compatible; Konqueror/3.2; Linux) (KHTML, like Gecko)
Accept: text/html, image/jpeg, image/png, text/*, image/*, */*
Accept-Encoding: x-gzip, x-deflate, gzip, deflate, identity
Accept-Charset: iso-8859-1, utf-8;q=0.5, *;q=0.5 
Accept-Language: en

a questo punto con arduino devi leggere le parte che ti interessa (/file.php?pippo=1), eseguire i comandi corrispondenti, e rispondere con una pagina HTML che contiene i risultati dei tuoi comandi.

per fare qualche test, puoi collegarti via telnet a qualche sito (tipo google) e provare ad inviare una richiesta get.

per esempio, ci colleghiamo a wikipedia (ehm per errore mi son collegato a wikipedia.it che NON è il sito di wikipedia, ma un sito che poi ti rimbalza al vero sito di wikipedia, che è it.wikipedia.org):

telnet www.wikipedia.it 80
Trying 217.12.160.169...
Connected to www.wikipedia.it.
Escape character is '^]'.

inviamo la richiesta di una pagina (questa sarà simile alla richiesta che l'arduino avrà in input)

GET /wiki/Pagina_principale HTTP/1.1 
Connection: Keep-Alive
User-Agent: Mozilla/5.0 (compatible; Konqueror/3.2; Linux) (KHTML, like Gecko)
Accept: text/html, image/jpeg, image/png, text/*, image/*, */*
Accept-Encoding: x-gzip, x-deflate, gzip, deflate, identity
Accept-Charset: iso-8859-1, utf-8;q=0.5, *;q=0.5 
Accept-Language: en
Host: it.wikipedia.org

ed ecco la risposta, quello che l'arduino dovrà scrivere come output (ovviamente modificato)

HTTP/1.1 200 OK
Date: Sat, 12 Feb 2011 14:17:33 GMT
Server: Apache/2.2.9 (Debian) mod_ssl/2.2.9 OpenSSL/0.9.8g mod_perl/2.0.4 Perl/v5.10.0
Last-Modified: Thu, 08 Apr 2010 17:28:40 GMT
ETag: "340499-43f-483bd02732200"
Accept-Ranges: bytes
Content-Length: 1087
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html

<html>
<body bgcolor="#ffffff">
<center>
<a href="http://yepa.com">
<img src="http://yepa.com/yepa/images/yepa.gif"></a>
<h1>Domain suspended</h1>
Service for this domain has been suspended for billing reasons.



Please contact <a href="mailto:billing@yepa.com">billing@yepa.com</a>.






<script type="text/javascript"><!--
google_ad_client = "pub-8279910352339639";
google_ad_slot = "2269210679";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>

</center>
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-1425951-2");
pageTracker._setDomainName("none");
pageTracker._setAllowLinker(true);
pageTracker._trackPageview();
} catch(err) {}</script>
</body>
</html>

edit: si va due volte a capo perchè il protocollo HTTP dice che bisogna fare così :slight_smile:

ciao lesto io il collegamento tra php e arduino lo faccio come mi ha consigliato Guglio in questo post http://arduino.cc/forum/index.php/topic,50962.0.html volevo aggiungere il codice php postato in precedenza e tutto bovrebbe funzionare ma non è così devo fare altre prove ora no so piu se dipende da apache php o arduino mi serve un po di tempo
scusate se mi ripeto ma non riesco a capire cosa vuol dire due volte a capo dopo il get ,devo premere due volte invio dopo HTTP/1.1???
ma ad arduino per quanto ho capito non interessano gli spazzi sicuramnte ho capito male
oppure devo mettere/r/n/r l'ho letto in alcuni post precedenti ma non capisco dcome li devo usare ho fatto svariate prove ma non va

ciao e grazie

okok, stai usando il primo metodo, ti stai collegando via TCP con un socket, quindi è esattamente come se si collegasse via telnet.
Quindi i comandi te li inventi tu, la storia del 2 volte a capo ti sarebbe servita se arduino doveva leggere le richieste dal browser.
cosa non funziona?
prova a riscrivere il codice di tuo pugno solo per accendere il led via PHP con lo spegnimento via millis(), se non funziona postalo.
Per testarlo usa telnet, così per ora evitiamo problemi legati al codice php

mi funziona la parte telnet non mi funziona la parte php che mi deve dire se il led è acceso o no ma penso che il php non mi prenda il comando get
Ho provato a mandare una variabile da uld di firefox e ugualmente non mi funziona mi sa che qualcosa sul server linux non funziona
A parte questo quando riuscirò a far funzionare lo script se volessi che il risultato off o on mi facesse cambiare il colore ad un pulzante basterebbe che dopo echo mettessi il pulsante colorato in html senza href o altro giusto?