Go Down

Topic: Arduino e PHP (Read 7 times) previous topic - next topic

Guglio

No dunque stiamo calmi, se lui fa mandare un meta refresh nell' output dell' arduino che viene poi letto dal php il php non ricarica la pagina visto che questo non segue l'html.

Devo ancora leggere bene il PM che mi hai mandato, comunque ora hai detto che riesci a fargli mostrare led=on e led=off in base allo stato dei led, ora cosa dovrebbe fare il php quando sa com'è messo il led?
ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

ARDUIX

io riesco a mandare 1 e 0 al php ma manualmente non seguendo lo stato del led. e il php mi scrive a video led accesso e led spento. io dovrei vedere come è il led e a seconda di come è scrivere a video acceso e spento.

Guglio

Ehehe allora devi farti rispondere da lesto perchè in C non sono molto ferrato   :smiley-mr-green:
ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

ARDUIX

non ti preoccupare mi hai dato una mano enorme!! colgo l'occasione per romperti un altro pò. ho notato che tramite &risposta ecc... leggo tutto quello che manda l'arduino al php. ma avrei bisogno di leggere due valori distinti provenienti dall' arduino ovvero uno per un led e uno per l'altro. mi spiego meglio devo avere scritto a video led 1 accesso led 2 acceso.. devo usare un altro pezzo di codice tipo quello di &risposta o c'è un altro metodo?

lesto

no, devi togliere il ?
e comunque è inutile farlo scrivere ad arduino il meta, fallo scrivere direttamente da PHP
il punto è che ora ricarichi la pagina senza richiedere nessun comando, quindi php non dovrebbe fare nulla. Invece devi dirgli di connettersi lo stesso ad arduino, e chiedergli quali led sono accessi. arduino risponde, e php manda la risposta al browser
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ARDUIX

#65
Feb 15, 2011, 02:37 pm Last Edit: Feb 15, 2011, 03:27 pm by ARDUIX Reason: 1
Non ti offendere lesto ma non ho capito bene. per il refresh del php ok.
Ma per il resto non so minimamente come muovermi
Code: [Select]


Luce cucina: <a href="?a=b">Accendi</a> | <a href="?a=k">Spegni</a><br/>
Luce Garage: <a href="?a=c">Accendi</a> | <a href="?a=l">Spegni</a><br/>
Luce camera: <a href="?a=d">Accendi</a> | <a href="?a=m">Spegni</a><br/>



<?
header('Location: 5;URL=http://192.168.1.64/gestione42.php');// refresh


$ip ="192.168.1.228";
$porta = "80";
$comando = $_GET['a'];
$comandi = array("b", "c", "d", "k", "l", "m");// Per essere sicuro che vadano all' arduino solo comandi da te approvati..
if ($comando!="" && in_array($comando, $comandi)){
$fp = fsockopen($ip, $porta, $errno, $errstr, 30);
if (!$fp) {
   echo "$errstr ($errno)<br />\n";
} else {
   $out = $comando;
   $out .= "\r\n\r\n";
   fwrite($fp, $out);
   $risposta="";
   while (!feof($fp)) {
    $risposta.= fgets($fp, 128);
    //print($risposta);
    if ($risposta == "1"){

    echo "Il led e' acceso"; //stampa a schermo il led è acceso.

    }else if ($risposta == "0"){

    echo "Il led e' spento"; //stampa a schermo il led è spento.

    }
}


dr4gone

#66
Feb 15, 2011, 03:49 pm Last Edit: Feb 15, 2011, 03:58 pm by dr4gone Reason: 1
scusami se ti rispondo solo ora...
L'idea di base l'ho presa qui http://www.ioscripto.it/arduino-accendere-led-via-web/ .
Poi ho semplificato e modificato un po la cosa e ti ho scritto velocemente il codice essenziale per fare in modo di vedere lo stato del led.

P.S. Grazie a Pitusso per i suggerimenti fondamentali  ;)

Comunque essenzialmente si tratta di giocare un po con dei booleani.
associ lo stato al valore di un booleano. Se flag=true allora il led è acceso, se flag=false il led è spento.

Poi per stampare lo stato usi un client.println per stampare il codice html che vuoi...

Spero di essere stato chiaro.
Buon divertimento.

P.s. se carichi questo sketch di base su arduino, puoi vedere velocemente come  funziona
Code: [Select]

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Indirizzo MAC
byte ip[] = { 192, 168, 1, 2 }; // ip in lan
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
Server server(80); //porta server

String readString; //string
boolean flag1 = false; //Inizializzo lo stato del led

void setup(){
Ethernet.begin(mac, ip, subnet);
pinMode(2, OUTPUT);
Serial.begin(9600);
}

void loop(){
Client client = server.available();
if (client) {
 boolean currentLineIsBlank = true;
 while (client.connected()) {
   if (client.available()) {
     char c = client.read();
       readString.concat(c);
     if (c == '\n' && currentLineIsBlank) {
        Serial.print(readString);
        if(readString.indexOf("Led=2") > 0) {
         digitalWrite(2, HIGH); // Accendi Led
         flag1 = true;
}
         if(readString.indexOf("Led=02") > 0) {
         digitalWrite(2, LOW); // Spegni Led
         flag1 = false;
}
// INIZIO DICHIARAZIONE PAGINA HTML
       client.println("HTTP/1.1 200 OK");
       client.println("Content-Type: text/html");
       client.println();
       client.println("Led");
       client.println("<span>STATO: </span>");
if (flag1) {
             client.println("<span style='color:green'>ON</span>");
           }
           else
           {
             client.println("<span style='color:red'>OFF</span>");
         }
         //comando ON OFF
             client.println("<a href='/?Led=2'>ON</a> |<a href='/?Led=02'>OFF</a>");
client.println("</body></html>");

       //Resetto "String" per la prossima lettura
       readString="";
       //Fermo il client
       client.stop();

       }
   }
 }
}
}

ARDUIX

ti ringrazio dr4gone, però pensavo che avessi fatto tramite php e che magari mi potessi aiutare a riguardo. Grazie mille ugualmente!

Guglio

#68
Feb 15, 2011, 07:38 pm Last Edit: Feb 15, 2011, 07:39 pm by Guglio Reason: 1
Uhm ma se vuoi sapere via php in che stato è il LED aggiungi nel tuo codice dell' arduino
Code: [Select]

   if (rcv == 'd') {
client.print(digitalRead(primo pin));
client.print(",");
client.print(digitalRead(secondo pin));
client.print(",");
client.print(digitalRead(terzo pin));
       }



E così il codice PHP

Code: [Select]

Luce cucina: <a href="?a=b">Accendi</a> | <a href="?a=k">Spegni</a><br/>
Luce Garage: <a href="?a=c">Accendi</a> | <a href="?a=l">Spegni</a><br/>
Luce camera: <a href="?a=d">Accendi</a> | <a href="?a=m">Spegni</a><br/>
<?php
$ip 
="192.168.1.228";
$porta "80";
$comando $_GET['a'];
$comandi = array("b""c""d""k""l""m");// Per essere sicuro che vadano all' arduino solo comandi da te approvati..
if ($comando!="" && in_array($comando$comandi)){
$fp fsockopen($ip$porta$errno$errstr30);
if (!
$fp) {
    echo 
"$errstr ($errno)<br />\n";
} else {
    
$out $comando;
    
$out .= "\r\n\r\n";//Questa riga penso non serva a nulla ma se non guasta lasciala
    
fwrite($fp$out);
    
$risposta="";
    while (!
feof($fp)) {
     
$risposta.= fgets($fp128);
     if (
$risposta == "1"){
     echo 
"Il led e' acceso"//stampa a schermo il led è acceso.
     
}else if ($risposta == "0"){
     echo 
"Il led e' spento"//stampa a schermo il led è spento.
     
}else{
$stato = @explode(",",$risposta);
print(
"Ecco lo stato dei LED: $stato[0]  $stato[1]  $stato[2]");
}
 }
?>

ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

ARDUIX

ciao sto continuando con le mie prove e mi sono accorto che con lo script con il comando fsockope fino a quando non mi si chiude la connessione php non mi restituisce il risultato girovagando su google ho trovato pfsockopen che nelle specifiche dice che restituisce il risultato dello script senza chiudere la connessione quindi se ho capito bene tale comando mi dovrebbe permettere di ricevere tutte le variabili che arduino manda o sbaglio???
questo mi permetterebbe di vedere scritto appena manda la prima variabile il led è acceso  non chiudendo la connessione dopo 5 sec mando la  seconda con client print e php me lo elabora scrivendo il led è spento
se tutto questo è giusto non riesco a trovare un esempio su come inserire questo comando nello script mi potete dare una mano

ciao e grazie

lesto

#70
Feb 16, 2011, 12:26 am Last Edit: Feb 16, 2011, 12:28 am by lesto Reason: 1
secondo me basta sostituire la print con println

edit: come non detto prinltn funziona se usi fread, la funzione di lettura che stai usando tu va avanti fino a EOF (end of file), in questo caso l'evento EOF avviene quando arduino chiude la connessione.

leggiti qualche guida sul tcp, se no ogni minima catzata non riesci ad andare avanti :)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ARDUIX

Ok mi sai dare un link dove leggere un po di queste cose in manierea leggibile e comprensibile per me :smiley-red:???
Tutte le sere mi sembra di essere ad un passo dalla soluzione la mattina dopo mi rendo conto che la soluzione è ancora lontana ma non mi scoraggio ho deciso che questo progetto lo porto a fine ci dovessi mettere un anno intero ]:D

lesto

parti da quì e poi approfondisci: http://it.wikipedia.org/wiki/Transmission_Control_Protocol
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Guglio

Ma non serve sapere come funziona il TCP (io non lo so) e non ho mai avuto problemi a dialogare con server o altro hardware via php o con l'ide.
il ciclo while con il fread non a caso è messo dopo che la socket viene chiusa proprio perchè altrimenti non riusciresti a leggere il risultato.
A te che te ne frega di sapere in "diretta" cosa manda l'arduino?
Tu ricevi lo status dei led e di conseguenza agisci, se c'è bisogno di dire qualcos'altro all'arduino richiami fsockopen, non ti fanno mica la multa se la chiami due volte

Edit, puoi usare la funzione sleep() per far star fermo il php per tot secondi dopo di che riaprire una socket con l'arduino per chiedergli come sono messi i led.
ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

lesto

la fread risce a leggere in "tempo reale", è la while con l'fget che non riesce.
eppoi mi dici che te frega del tempo reale? metti che arduino e php devono comunicare più cose è molto importante, è i motivo per cui è nato il TCP!

non usare sleep in php, gli script hanno un time-out(di solito 30 secondi) dopo di che lo script viene killato
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up