Go Down

Topic: Ausgang per Web schalten mit PHP (Read 14163 times) previous topic - next topic

Cetax

Apr 24, 2012, 01:41 pm Last Edit: May 08, 2012, 12:31 pm by Cetax Reason: 1
Hallo,
allerseits, ich versuche mich gerade daran, den Digitalen Pin3 per Webseite An bzw. Aus zuschalten.

Arduino Ethernet -->Webserver -->PHP-Seite mit Button AN und AUS

Mein Problem ist, mal wieder der Anfang, einen Sketch habe ich schon angefangen, aber ob er funktioniert weiß ich nicht, weil ich nicht weiß wie die PHP Seite aus sehen muss  :smiley-red:
Ich dachte da an GET oder so,aber mehr weiß ich auch nicht..
Mein Sketch bisher sieht so aus:
Code: [Select]
/*
 Webclient
 Es soll mittels einer PHP-Seite, die auf einem Webserver liegt,
 ein oder mehrere Ausgänge AN/AUS geschaltet werden.
*/

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

// Ethernet einrichten
byte mac[] = {  0x90, 0xA2, 0xDA, 0x00, 0xEE, 0xF3 }; // Mac-Adresse Arduino Ethernet
byte ip[] = {192,168,178,230}; // IP-Adresse Arduino Ethernet
byte gateway[] = {192,168,178,1}; // Gateway
byte subnet[] = {255,255,255,0};
IPAddress server(192,168,178,111); // IP-Adresse Server
char host[] = "192.168.178.111\n"; // Host Name oder IP-Adresse

EthernetClient client;  // Initialisierung der Ethernet client library

char url[]  = "/arduino/ausgang.php"; // Pfad zur PHP-Datei eingeben
char c;
int Pin3 = 3;

String readString = String(100);

boolean Pin3ON = false;

void setup()
{
 Serial.begin(9600);
 pinMode(Pin3, OUTPUT);
 Serial.println("verbinde...");
 Ethernet.begin(mac, ip, gateway, subnet);
}

void loop()
{
 if (client.connect(server, 8000)) // Serverport bei mir 8000 bei bedarf ändern
 {
   char c = client.read();
   Serial.print(c);
 }
 
 if (readString.length() < 100)
{
 readString = readString + c;
}
Serial.print(c);  //output chars to serial port
       if (c == '\n') {
if(readString.indexOf("3=einschalten") > -1) {
  digitalWrite(Pin3, HIGH);
   Serial.println("Pin 3 eingeschaltet!");
    Pin3ON = true;
}
if(readString.indexOf("3=ausschalten") > -1){
  digitalWrite(Pin3, LOW);
   Serial.println("Pin 3 ausgeschaltet!");
    Pin3ON = false;
}
}
//clearing string for next read
readString="";

client.stop();
client.flush();
}



Kann mir jemand Helfen ?
*greatz*

 CeTax

www dot blinkmann dot de

mkl0815

Ich würde mal sagen, falscher Ansatz. Wenn schon ein Webserver da ist, dann doch folgendermassen:

Browser <--> Webserver (PHP/HTML) <--> Arduino

Alternativ nur der Arduino als Webserver, aber wie da die Limits sind, haben wir ja schon gelernt :-)

Als erstes bastelst Du Dir mit PHP und HTML auf dem Webserver ein Webseite, mit der Du den Zustand z.B. einer LED abbildest und per Link oder Button den Zustand umschalten kannst. Das alles noch komplett ohne den Arduino.

Wenn das funktioniert, bringst Du Deinem PHP-Script bei, mit dem Arduino zu "reden". Dabei kannst Du auf den ganzen HTML-Kram verzichten und nur die wesentlichen Daten übertragen.
Du kannst z.B. mit PHP eine TCP-Verbindung zum Arduino aufbauen und schickst erstmal nur ein Zeichen
'S' -> (SET) setze wert
'R' -> (READ) lese wert

danach folgt z.b. die nummer des Pins als byte (z.b. 3 Wert, nicht das Zeichen '3')
beim Setzen des Wertes kommt noch ein drittes Byte, mit dem Wert.
Damit kannst Du aus mit 3 Bytes schon alle Pins setzen ('S',0x03,0x01)

Auf dem Arduino liest Du einfach Zeichenweise aus der Verbindung in ein Array
Code: [Select]


//Achtung super simpler Quickhack ohne Püfung der Eingabe oder ob Daten vorhanden sind
char input[3];

for(int i=0;i<3;i++) {
    input[i] = client.read();   
}

//pin setzen
if(input[0] == 'S') {
   digitalWrite(input[1],input[2]);
}
//pin lesen und an den Client schicken
if(input[0] == 'R') {
   client.print(digitalRead(input[1]));
}

Die Lösung ist zwar für den Anfang komplexer, als nur der Arduino zu nehmen, dafür aber deutlich flexibler. Der Browser muss nicht mit dem Arduino reden, sondern nur mit dem Webserver. Wie der Webserver dann mit dem Arduino redet, ist für den Nutzer am Browser aber egal. Und Du kannst Die Seite auf dem Webserver so bunt und schick machen, wie Du lustig bist. Es gibt keine Limitierungen wie beim Arduino-Webserver.

Cetax

Moin Moin,
ok, dann lege ich mal los (habe gerade irgendwie zwei sachen gleichzeitig, am machen...grrr)
Dane für deine schnelle Antwort und die Tips, setzte mich erstmal hin und zaubere eine PHP-Site.
Quote
Die Lösung ist zwar für den Anfang komplexer, als nur der Arduino zu nehmen, dafür aber deutlich flexibler.

Genau was ich brauche, Komplex aber super flexibel   :D
Versuche dann mal deine Tips und Ratschläge umzusetzten, so macht das richtig Spaß und man lernt...

Achso, hintergrund des ganzen ist, ich habe ein 8fach Relais von Sainsmart, womit ich meine Bewässerungsventile (24V) steuern möchte. UNd das ganze natürlich von ÜBERALL  :smiley-mr-green:

Coole, wäre dann natürlich noch eine Zeitspanne die man festlegen kann, wie lange ein Ventil geöffnet sein soll. Aber erstmal eins nach dem anderen....

Bin dann mal im dunklen kämmerlein.......  8)
*greatz*

 CeTax

www dot blinkmann dot de

Cetax

So da bin ich wieder...
Leider nicht so erfolgreich wie ich dachte  :(
Der Beispiel-Code der Webseite sieht jetzt so aus :
Code: [Select]
<html>
<head>
  <title>Ventile schalten</title>
</head>
<body>
<table border="1">
  <tbody>
    <tr>
      <td>V_1</td>
      <td>V_2</td>
    </tr>
    <tr>
      <td><form action="test1.php" method="post" target="_self">
          <select name="Zeit_V1[]">
    <option value="15">15 min</option>
    <option value="30">30 min</option>
    <option value="60">60 min</option>
    </select>
    <input type="submit" name="senden" maxlength="10" value="Starten">
  <input type="reset" name="stop" value="Stop" align="middle">
  </form>
     </td>
      <td><form action="test1.php" method="post">
          <select name="Zeit_V2[]">
  <option value="15">15 min</option>
  <option value="30">30 min</option>
  <option value="60">60 min</option>
  </select>
  <input type="submit" name="senden" maxlength="10" value="Starten">
  <input type="reset" name="stop" value="Stop" maxlength="10" align="middle">
  </form>
     </td>
    </tr>
    <tr>
      <td><?php
$auswahl1 
$_POST['Zeit_V1'];
for(
$i=0;$i<count($auswahl1);$i++)
{
 echo 
$auswahl1[$i] . '&nbsp;min wurden gestartet';
}
if (!
$auswahl1) {
echo 
"Ventil zu";
}
?>
</td>
      <td>
<?php
$auswahl2 
$_POST['Zeit_V2'];
for(
$i=0;$i<count($auswahl2);$i++)
{
 echo 
$auswahl2[$i] . '&nbsp;min wurden gestartet';
}
if (!
$auswahl2) {
echo 
"Ventil zu";
}
?>

</td>
    </tr>
  </tbody>
</table>
</body>
</html>

Aber weiter weiß ich jetzt auch nicht...
Ich steh-gerade-wie-ein-Ochs-vorm-Berg, wie soll ich weiter machen?  :smiley-red:
Quote
Du kannst z.B. mit PHP eine TCP-Verbindung zum Arduino aufbauen und schickst erstmal nur ein Zeichen
'S' -> (SET) setze wert
'R' -> (READ) lese wert

Ich versteh gerade nicht ganz wo ich das reinsetzten soll...
Bitte Mario, kannst du mir nochmal weiter Helfen...  :smiley-red:
*greatz*

 CeTax

www dot blinkmann dot de

mkl0815

Zum Senden an den Arduino kannst Du erstmal folgende einfache Funktion verwenden.
Code: [Select]

<?php
$arduino_ip
="192.168.111.5";
$arduino_port="8088";

function 
arduino_send($ip,$port,$command) {
    
$res fsockopen($ip,$port);
    if(
$res) {
        
fwrite($res,$command);
        return 
fread($res,1);
    } else {
        echo 
"Fehler, Kommando konnte nicht abgesetzt werden";
    }
}
?>


Aufgerufen wird die z.B. mit
Code: [Select]

arduino_send(192.168.111.5,8088,'S'.chr(9).chr(1));

Das erste ist die IP, dann der Port auf dem der Arduino lauscht. Danach der Kommando
S ist der Befehl zum "Setze Pin"
chr(9) schreibt das Byte 0x09 in den String, das ist die Pin -Nummer
chr(1) schreibt das Byte 0x01 in den String, das ist der Wert.

Den übermittelten Befehl musst Du dann auf dem Arduino auswerten wie bereits vorgeschlagen.

In Deinem PHP-Code werde ich aber noch nicht so recht schlau. Du hast zwei unabhängige Formulare gebaut, damit werden immer nur die Daten von einem Formular abgeschickt, jenachdem welchen Submit-Button Du anklickst.
Die Schleife
Code: [Select]

$auswahl1 = $_POST['Zeit_V1'];
for($i=0;$i<count($auswahl1);$i++)
{
echo $auswahl1[$i] . '&nbsp;min wurden gestartet';
}

verstehe ich aber nicht. Es kann immer nur ein Wert übermittelt werden, warum dann das Array und eine Schleife die immer nur einmal durchlaufen wird?
Wenn das später mehr als ein Ventil werden soll, dann bau den Code dafür auch erst später. Jetzt geht es ja erstmal nur um die Kommunikation Webserver <-> Arduino.

Immer schön an KIS denken: Keep It Simple!
Mario.

Cetax

Moin,
so nach stundenlangen rumprobieren und nicht verstehen, gebe ich auf  =(
Ich verstehe es irgendwie nicht. Also, ich habe jetzt mal alles was ich vorher gepostet habe, weggelassen nd ganz Neu angefangen. Mit einer PHP Seite, mit deinem Code:
Code: [Select]
<?php
$arduino_ip
="192.168.178.216";
$arduino_port="8088";

function 
arduino_send($ip,$port,$command) {
    
$res fsockopen($ip,$port);
    if(
$res) {
        
fwrite($res,$command);
        return 
fread($res,1);
    } else {
        echo 
"Fehler, Kommando konnte nicht abgesetzt werden";
    }
}
?>

Was mir auffällt, bei dem Befehl "$command" wird nirgends gesagt was der machen soll, oder verstehe ich das falsch ?
Ich würde folgende noch eintragen: $command = "'S'.chr(3).chr(1)";

Und was ich nicht verstehe, wie ich deinen Befehl-Vorschlag aufrufen soll ?
Quote
Aufgerufen wird die z.B. mit
Code: [Select]
arduino_send(192.168.178.216,8088,'S'.chr(3).chr(1));

Soll das als HTML-Link dienen? (<a href="arduino_send(192.168.178.216,8088,'S'.chr(3).chr(1));">LINK</a>)

Mein Sketch sieht so aus (vermutlich auch falsch  :smiley-red: ) :
Code: [Select]

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

// Ethernet einrichten
byte mac[] = {  0x90, 0xA2, 0xDA, 0x00, 0xEE, 0xF3 }; // Mac-Adresse Arduino Ethernet
byte ip[] = {192,168,178,216}; // IP-Adresse Arduino Ethernet
byte port[] = {8088};
EthernetClient client;  // Initialisierung der Ethernet client library

int Pin3 = 3;
char input[3];

void setup()
{
  Serial.begin(9600);
  pinMode(Pin3, OUTPUT);
  Serial.println("verbinde...");
  Ethernet.begin(mac, ip, port);
}

void loop()
{
for(int i=0;i<3;i++) {
    input[i] = client.read();   
}

//pin setzen
if(input[0] == 'S') {
   digitalWrite(input[1],input[2]);
}
//pin lesen und an den Client schicken
if(input[0] == 'R') {
   client.print(digitalRead(input[1]));
}
}


Ich habe das Gefühl, ich habe den Fadeb verloren...
Sorry, aber irgendwann merkt man halt, das man Anfänger ist   :smiley-sad-blue:
*greatz*

 CeTax

www dot blinkmann dot de

mkl0815

Ok, ich versuche es nocheinmal schrittweise zu erklären.
Versuche evtl. erstmal Dich von der "Gesamtvorstellung" zu lösen und vergiss erstmal den Arduino. Vielleicht wird es dann einfacher.

1) Du willst eine Webseite bauen, mit der Du einer oder mehrere Variablen einen Zustand vorgeben willst. Sagen wir z.B. mal, Du hast die Variablen $led1, $led2, $led3. Jede dieser Variablen kann den Zustand 1 oder 0 annehmen. Das ganze wird zunächst in einem HTML-Formular umgesetzt:
Code: [Select]

<form action="">
  <p>
    <input type="radio" name="led1" value="0" <?php if($led1==0) echo "checked" ?> >aus -  <input type="radio" name="led1" value="1" <?php if($led1==1) echo "checked" ?> >an<br>
    <input type="radio" name="led2" value="0" <?php if($led2==0) echo "checked" ?> >aus -  <input type="radio" name="led2" value="1" <?php if($led2==1) echo "checked" ?> >an<br>
    <input type="radio" name="led3" value="0" <?php if($led3==0) echo "checked" ?> >aus -  <input type="radio" name="led3" value="1" <?php if($led3==1) echo "checked" ?> >an<br>
  </p>
  <input type="submit" name="submit" value="Abschicken">
</form>

Der PHP-Code " <?php if($led1==0) echo "checked" ?>" sorgt dafür, das abhängig vom jeweiligen Wert der Variable der entsprechende Radio-Button ausgewählt ist.
Du musst nun noch den Code für das Auswerten des Formulars drum herum bauen. Versuch erstmal soweit zu kommen, das Du beim Abschicken des Formulars danach die entsprechenden Buttons wieder korrekt ausgwählt angezeigt bekommst. Sich die Webseite sozusagen den Zustand merkt. Das sollte nicht weiter schwierig sein.


2) Die definiert Funktion arduino_send($ip,$port,$command) verwendest Du wie jede andere Funktion in PHP. Zum Beispiel im Daten in eine Datei zu schreiben oder aus einer Datei zu lesen. Nur das hier die Daten nicht in einer Datei landen, sondern an den Arduino geschickt werden. Das Prinzip ist aber genau das Gleiche. Dein PHP-Script verwendet eine "Schnittstelle" mit Hilfe der Funktion um Daten an ein "Medium" zu senden. Ob das eine Datei ist, oder Dein Arduino ist dabei egal. Statt z.B. "led1=0;led2=1;led3=1" in eine Datei "/tmp/daten.txt" zu schreiben (fopen() ... fwrite() ... fclose()) verwendest Du nun die Funktion arduino_send() um den Zustand Deiner Variablen an den Arduino zu schicken. Der Vorgang, die Daten in ein Format zu bringen, das Dein Arduino lesen kann, nennt man "Codieren". Du definierst also ein Format, das dem Zweck entspricht, den Du erreichen willst. In Deinem Fall ist das Format "1. Zeichen definiert ob setzen oder lesen eines Pins (S oder R)", "2.Zeichen definiert welcher Pin betroffen ist", "3.Zeichen definiert den Wert der evtl. gesetzt werden soll.
Um Dir die Programmierung auf dem Arduino zu erleichtern, wenden IMMER 3 Bytes/Zeichen übertragen, auch wenn Du beim Lesen eigentlich kein 3. Zeichen brauchst. Dein Format das Du so definiert hast nennt man auch "Protokoll" (so wie HTTP für HyperText Transfer Protocol" steht. Es legt fest nach welchen Regeln die Daten übermittelt werden. Dein Aruino sendet dann immer genau ein Byte als Ergebnis zurück. Beim Lesen den Wert des Pins der für den Pin gerade gesetzt ist und beim Setzen den Wert der gesetzt wurde.
Die Funktion "arduino_send()" baust Du nun in dein funktionierendes!!! PHP-Script ein. Also erst, wenn Punkt 1 angearbeitet ist. Das ist wichtig, denn wenn etwas nicht funktioniert musst Du nicht erst prüfen ob das PHP-Script die Eingaben vom Browser korrekt verabreitet, sondern kannst den Fehler bereits auf die Änderungen bezüglich Daten senden einschränken.

3) Dein Arduino muss die Daten verarbeiten. Als Basis kannst Du den Chat-Server Sketch aus den Beispielen der IDE nehmen, der enthält bereits alles was Du brauchst um auf ankommende Verbindungen zu warten, Daten aus der Verbindung zu lesen und etwas an den Client (in dem Fall dann Dein PHP-Script auf dem Webserver, nicht der Browser der die Webseite aufruft) zu antworten.
Da das Protokoll sagt, das immer 3 Bytes gesendet werden, musst DU nur warten bis ein Client kommt (PHP-Script) und genau 3 Bytes aus der Verbindung lesen und diese verarbeiten. 1. Byte sollte "S" oder "R" sein. Das 2. Byte ist die Nummer des Pins und das 3. Byte der Wert. Wenn "S" dann setze das Pin mit der übermittelten Nummer auf den übermittelten Wert und schreibe diesen Wert auch zurück an den Client (wie im Protokoll definiert). Wenn "R", dann ignoriere den übermittelten Wert einfach und schicke an den Client den aktuellen Wert des Pins zurück. Danach beende die Verbindung mittles client.close(); Damit weiss dann auch Dein PHP-Script (Funktion arduino_send()) das die Übertragung abgeschlossen ist.

Das ist "eigentlich" schon alles. Wichig ist das schrittweise vorgehen. Erst wenn ein Schritt funktioniert, dann den nächsten angehen. Bei Schritt 2, reagiert Dein Arduino ja noch nicht wirklich. Daher macht es da z.B. Sinn statt des tatsächlichen Sendens in der Funktion nur mit "echo" auszugeben was gemacht werden würde. Somit kannst Du auf der Webseite prüfen, ob sich Dein Script so verhält wie Du es erwartest. Wenn das dann klappt, machst Du mit Schritt 3 weiter. Wenn Dein Sketch sich dann compilieren und auf den Arduino spielen läßt, dann kannst Du im PHP-Script tatsächlich Daten senden.

Ich hoffe dieser kleine "Roman" hat ein wenig zum besseren Verständnis beigetragen.
Mario.

Cetax

#7
Apr 27, 2012, 11:35 pm Last Edit: Apr 27, 2012, 11:59 pm by Cetax Reason: 1
Hallo Mario,
vielen Dank,
Alles gelöscht und vergessen, werde jetzt mal von vorn anfangen...
Aber ich scheitere schon bei der ersten Aufgabe...  =(
Ich glaube es ist schon zu spät und der Kopf zu voll   :smiley-red:
Oder ich bin einfach zu blöd, das zuverstehen.
Quote

Ok, ich versuche es nocheinmal schrittweise zu erklären.
Versuche evtl. erstmal Dich von der "Gesamtvorstellung" zu lösen und vergiss erstmal den Arduino. Vielleicht wird es dann einfacher.

1) Du willst eine Webseite bauen, mit der Du einer oder mehrere Variablen einen Zustand vorgeben willst. Sagen wir z.B. mal, Du hast die Variablen $led1, $led2, $led3. Jede dieser Variablen kann den Zustand 1 oder 0 annehmen. Das ganze wird zunächst in einem HTML-Formular umgesetzt:
Code:

<form action="">
 <p>
   <input type="radio" name="led1" value="0" <?php if($led1==0) echo "checked" ?> >aus -  <input type="radio" name="led1" value="1" <?php if($led1==1) echo "checked" ?> >an<br>
   <input type="radio" name="led2" value="0" <?php if($led2==0) echo "checked" ?> >aus -  <input type="radio" name="led2" value="1" <?php if($led2==1) echo "checked" ?> >an<br>
   <input type="radio" name="led3" value="0" <?php if($led3==0) echo "checked" ?> >aus -  <input type="radio" name="led3" value="1" <?php if($led3==1) echo "checked" ?> >an<br>
 </p>
 <input type="submit" name="submit" value="Abschicken">
</form>

Der PHP-Code " <?php if($led1==0) echo "checked" ?>" sorgt dafür, das abhängig vom jeweiligen Wert der Variable der entsprechende Radio-Button ausgewählt ist.
Du musst nun noch den Code für das Auswerten des Formulars drum herum bauen. Versuch erstmal soweit zu kommen, das Du beim Abschicken des Formulars danach die entsprechenden Buttons wieder korrekt ausgwählt angezeigt bekommst. Sich die Webseite sozusagen den Zustand merkt. Das sollte nicht weiter schwierig sein.

Verstehe ich nicht .. Wenn ich deinen Code in eine HTML-Seite einbaue und dann den submit button drücke, merk er sich doch den zustand, oder verstehe ich mal wieder Bahnhof ??
Ok, ich gehe jetzt mal schlafen und versuche morgen mal mit einem leeren/freien Kopf an die Sache ranzugehen...  :smiley-sleep:

Dir eine ruhige Nacht und nochmal vielen Dank...

*greatz*

 CeTax

www dot blinkmann dot de

mkl0815

Das Problem ist einfach. Wenn Du das Formular im Browser abschickst, dann werden die Werte übertragen, die Du im Formular eingegeben hast.
Also z.B. led1=0;led2=1 und led3=1, weil Du die entsprechenden Radio-Buttons  so angeklickt hast.
Dein PHP-Script kann also diese Daten auswerten.
Am Ende wird dann das Formular wieder ausgegeben. Wenn Du dabei nicht den eben übermittelten Zustand wieder setzt, wird im Browser das Formular wieder alle Radio-Buttons auf "aus" setzen.
Das siehst Du, wenn Du meinen Code einfach ausprobierst. D.h. der Nutzer der Webseite sieht nicht mehr, was er eigentlich vor dem Abschicken angeklickt hat.
Der folgende Code respektiert aber die Eingaben aus dem letzten Aufruf, die Webseite "merkt" sich also den Zustand zwischen den Aufrufen, indem das Script die Werte im Formular wieder mit den alten Daten vorbelegt.
Sowas nennt man auch "Monkey Script" (siehe http://www.php.de/wiki-php/index.php/Affenformular_%28Standardverfahren%29)
Der Vorteil dabei ist, das Du nur ein Script brauchst, weil es sich immer wieder selbst aufruft und Du sehr einfach prüfen kannst ob alle Daten korrekt übermittelt und verarbeitet werden.
Code: [Select]

<html>
<head>
</head>
<body><h1>Arduino - Monkey Script</h1>
<?php
if(isset($_GET['led1']))  $led1 $_GET['led1'];
if(isset(
$_GET['led2']))  $led2 $_GET['led2'];
if(isset(
$_GET['led3']))  $led3 $_GET['led3'];
?>

<form action="">  <p>
    LED 1 : <input type="radio" name="led1" value="0" <?php if($led1==0) echo "checked" ?> >aus -  <input type="radio" name="led1" value="1" <?php if($led1==1) echo "checked" ?> >an<br>
    LED 2 : <input type="radio" name="led2" value="0" <?php if($led2==0) echo "checked" ?> >aus -  <input type="radio" name="led2" value="1" <?php if($
led2==1) echo "checked" ?>
>an<br>
    LED 3 : <input type="radio" name="led3" value="0" <?php if($led3==0) echo "checked" ?> >aus -  <input type="radio" name="led3" value="1" <?php if($
led3==1) echo "checked" ?>
>an<br>
  </p>
  <input type="submit" name="submit" value="Abschicken">
</form>
</body>
</html>

Es dauert manchmal ein wenig bis man dahinter kommt, wie eine Webanwendung "tickt". Das Problem im Gegensatz zu einem "normalen" Programm ist, das Dein PHP-Script sich den alten Zustand zwischen 2 Aufrufen nicht direkt merken kann (außer man verwendet Sessions, aber das ist ein ganz anderes Thema). Außerdem können ja parallel hunderte Requests von unterschiedlichen Browsern auf das gleiche Script gehen, die auch miteinander nichts zu tun haben. HTTP ist ein "zustandsloses" Protokoll. Dein Script verarbeitet immer nur genau die Daten die im Formular drin stehen, mehr nicht.
Mario.

Cetax

#9
Apr 29, 2012, 09:01 pm Last Edit: Apr 30, 2012, 12:34 am by Cetax Reason: 1
Hallo,
ich glaube ich habe dich jetzt verstanden. Es wird jetzt nach dem klick auf den Abschick-Button, angezeigt was Ausgewählt wurde.
Hier der Code:
Code: [Select]
<html>
<head>
</head>
<body><h1>Arduino - Monkey Script</h1>
<?php
if(isset($_POST['led1']))  $led1 $_POST['led1'];
if(isset(
$_POST['led2']))  $led2 $_POST['led2'];
if(isset(
$_POST['led3']))  $led3 $_POST['led3'];
?>

<form method="POST" action="<?php echo $PHP_SELF ?>">
  <p>
    LED 1 : <input type="radio" name="led1" value="0" <?php if($led1==0) echo "checked" ?> >aus -  <input type="radio" name="led1" value="1" <?php if($led1==1) echo "checked" ?> >an<br>
    LED 2 : <input type="radio" name="led2" value="0" <?php if($led2==0) echo "checked" ?> >aus -  <input type="radio" name="led2" value="1" <?php if($led2==1) echo "checked" ?> >an<br>
    LED 3 : <input type="radio" name="led3" value="0" <?php if($led3==0) echo "checked" ?> >aus -  <input type="radio" name="led3" value="1" <?php if($led3==1) echo "checked" ?> >an<br>
  </p>
  <input type="submit" name="submit" value="Abschicken">
</form>
</body>
</html>

Wie gehts jetzt weiter ? Wie übermittel ich jetzt die Formular eingaben an den Arduino ?
Ich greife nochmal deinen Vorschlag auf und packe das in eine Datei Namens "senden.php":
Code: [Select]
<?php
$arduino_ip
="192.168.178.216";
$arduino_port="8088";

function 
arduino_send($ip,$port,$command) {
    
$res fsockopen($ip,$port);
    if(
$res) {
        
fwrite($res,$command);
        return 
fread($res,1);
    } else {
        echo 
"Fehler, Kommando konnte nicht abgesetzt werden";
    }
}
?>

Öffne ich den dann von deinem Monkey-Script aus ?
Code: [Select]
<form method="POST" action="senden.php">
Und/Aber wo kommet denn der Command Aufruf hin ?
Code: [Select]
arduino_send(192.168.178.216,8088,'S'.chr(3).chr(1));
Der ja sagt, schalte Ausgang 3 EIN.

Ich glaube ja , ich denke immer noch zu kompliziert.
Aber das Monkey-Script beispiel habe ich jetzt verstanden.
Manchmal sieht man den Wald vor lauter Bäumen nicht  :smiley-roll:
*greatz*

 CeTax

www dot blinkmann dot de

mkl0815

Guten Morgen,
es wird doch langsam :-). Du brauchst aber kein extra "senden.php". Du baust die Aufrufe direkt in das "Monkey-Script" ein. Die Stelle an der das passiert drängt sich auch geradezu auf, nämlich dort, wo Du die GET-Parameter auswertest. Genau an dieser Stelle hast Du ja alle Informationen, um die Ausgänge zu schalten. Ich habe das am Wochenende mal aufgebaut, es geht problemlos.
Mario.

Cetax

Nabend  ;)
das freut mich aber, das ich nicht ganz auf dem Holzweg bin...
Quote
Du baust die Aufrufe direkt in das "Monkey-Script" ein. Die Stelle an der das passiert drängt sich auch geradezu auf, nämlich dort, wo Du die GET-Parameter auswertest.

Also so :
Code: [Select]
<FORM action="arduino_send($ip, $port, $command)" method="GET">
<p>
LED 1 :
<input type="radio" name="led1" value="0" <?php if($led1==0) echo "checked" ?> >
aus -
<input type="radio" name="led1" value="1" <?php if($led1==1) echo "checked" ?> >
an
<br>
<INPUT type="submit" name="senden" value="senden">
</FORM>

Mein gesamt-Code sieht jetzt so aus, ungetestet, weil ja noch ohne Arduino:
Code: [Select]
<html>
<head>
</head>
<body><h1>Arduino - Testseite</h1>
<?php
if(isset($_POST['led1']))  $led1 $_POST['led1'];
if(isset(
$_POST['led2']))  $led2 $_POST['led2'];
if(isset(
$_POST['led3']))  $led3 $_POST['led3'];

$ip "192.168.178.216";
$port "80";
$led1 "'S'.chr(3).chr(1)";
$command "$led1";

function 
arduino_send($ip,$port,$command) {
    
$res fsockopen($ip,$port);
    if(
$res) {
        
fwrite($res,$command);
        return 
fread($res,1);
    } else {
        echo 
"Fehler, Kommando konnte nicht abgesetzt werden";
    }
}
?>

<FORM action="arduino_send($ip, $port, $command)" method="GET">
<p>
LED 1 :
<input type="radio" name="led1" value="0" <?php if($led1==0) echo "checked" ?> >
aus -
<input type="radio" name="led1" value="1" <?php if($led1==1) echo "checked" ?> >
an
<br>
LED 2 :
<input type="radio" name="led2" value="0" <?php if($led2==0) echo "checked" ?> >
aus - 
<input type="radio" name="led2" value="1" <?php if($led2==1) echo "checked" ?> >
an<br>
LED 3 :
<input type="radio" name="led3" value="0" <?php if($led3==0) echo "checked" ?> >
aus - 
<input type="radio" name="led3" value="1" <?php if($led3==1) echo "checked" ?> >
an<br>
<INPUT type="submit" name="senden" value="senden">
</FORM>
</body>
</html>


DANKE !!! Für deine Hilfe und Mühe  :)
*greatz*

 CeTax

www dot blinkmann dot de

mkl0815

Nein, leider nicht. Ich glaub so ganz verstanden hast Du es noch nicht.
Das "arduino_send()" ist eine Funktion, die Dein PHP-Script verwendet, um dem Arduino Befehle zu schicken. Also vom Webserver zum Arduino.
Da wo Du den Aufruf eingetragen hast, ist das doch HTML-Code, der vom Browser ausgeführt wird. Woher soll der Browser denn wissen, was er machen soll, wenn im "action" Parameter ein Aufruf einer PHP-Funktion steht? Das klappt ja sonst auch nicht. Der Browser "spricht" nur mit dem Webserver, also dem PHP-Script. Also GET-Parameter an eine URL schicken und HTML-Code zurück bekommen. Mehr macht der Browser nicht, der weiss noch nicht mal was vom Arduino.
Der Aufruf der arduino_send() Funktion gehört hier hin:
Code: [Select]

<?php
if(isset($_POST['led1']))  $led1 $_POST['led1'];
if(isset(
$_POST['led2']))  $led2 $_POST['led2'];
if(isset(
$_POST['led3']))  $led3 $_POST['led3'];
?>


In diesem Block verarbeitet das Script die vom Browser kommenden Informationen. Dort musst Du den Aufruf der Funktion unterbringen.
Mario.

Cetax

#13
May 01, 2012, 10:29 am Last Edit: May 01, 2012, 10:41 am by Cetax Reason: 1
Guten morgen,
oh...  :smiley-red:  Ok, ich habe es nochmal versucht, die Seite wird angezeigt und es sich auch der zustand gemerkt, zumindest sieht es so aus:
Code: [Select]
<html>
<head>
</head>
<body><h1>Arduino - Monkey Script</h1>
<?php
$ip
="192.168.178.216";
$port="8088";

function 
arduino_send($ip,$port,$command) {
    
$res fsockopen($ip,$port);
    if(
$res) {
        
fwrite($res,$command);
        return 
fread($res,1);
    } else {
        echo 
"Fehler, Kommando konnte nicht abgesetzt werden";
    }
}

if(isset(
$_POST["arduino_send($ip,$port,'S'.chr(1).chr(1));"])) // Senden
 
$led1 $_POST["arduino_send($ip,$port,'R'.chr(1).chr(1));"];  // Lesen
if(isset($_POST["arduino_send($ip,$port,'S'.chr(2).chr(1));"])) // Senden
 
$led2 $_POST["arduino_send($ip,$port,'R'.chr(2).chr(1));"];  // Lesen
if(isset($_POST["arduino_send($ip,$port,'S'.chr(3).chr(1));"])) // Senden
 
$led3 $_POST["arduino_send($ip,$port,'R'.chr(3).chr(1));"];  // Lesen
?>

<form method="POST" action="<?php echo $PHP_SELF ?>">
 <p>
   LED 1 : <input type="radio" name="led1" value="0" <?php if($led1==0) echo "checked" ?> >aus -  <input type="radio" name="led1" value="1" <?php if($led1==1) echo "checked" ?> >an<br>
   LED 2 : <input type="radio" name="led2" value="0" <?php if($led2==0) echo "checked" ?> >aus -  <input type="radio" name="led2" value="1" <?php if($led2==1) echo "checked" ?> >an<br>
   LED 3 : <input type="radio" name="led3" value="0" <?php if($led3==0) echo "checked" ?> >aus -  <input type="radio" name="led3" value="1" <?php if($led3==1) echo "checked" ?> >an<br>
 </p>
 <input type="submit" name="submit" value="Abschicken">
</form>
</body>
</html>

Ich habe die Zeilen mal untereinander geschrieben, damit ich das unterscheiden kann.
Also, ich versuche das mal zu verstehen
Code: [Select]

if(isset($_POST["arduino_send(192.168.178.216,8088,'S'.chr(1).chr(1));"])) // Senden

Mit dem ersten Aufruf, wird der gewünschte Zustand gesetzt...
Code: [Select]

$led1 = $_POST["arduino_send(192.168.178.216,8088,'R'.chr(1).chr(1));"];  // Lesen

Mit dem zweiten Aufruf, der gesetzte Zustand gelesen...
Und hiermit
Code: [Select]
<?php if($led1==0) echo "checked" ?>
wird gefragt, welche Zustand ist es 1 oder 0 und dann angezeigt.

Oder wieder verkehrt ?  :(
Manchmal frage ich mich, ob mir eine Gehirnzelle fehlt das ich das nicht verstehe oder
denke ich zu kompliziert ?  :~

EDIT:
Ich merke sehe gerade, das ich ja nur 1 senden kann, aber nicht 0
Ich steh gerade auf'n schlauch...
*greatz*

 CeTax

www dot blinkmann dot de

mkl0815

Code: [Select]

if(isset($_POST["arduino_send(192.168.178.216,8088,'S'.chr(1).chr(1));"])) // Senden

Ist leider komplett daneben.
$_POST[] ist zwar korrekt, weil Du die Daten ja im Formular per POST verschickst. Aber was soll der Aufruf der Funktion da drin?
Als "Key" verwendet das $_POST[] Array doch den Namen des Input-Feldes, das Du abfragen willst.
Also:
Code: [Select]

//prüfen ob für led1 Daten übermittelt wurden
if(isset($_POST['led1'])) {
    //übergebenen Wert speichern.
    $led1 = $_POST['led1'];
    //Wert an Arduino (Pin 9) senden
    arduino_send($arduino_ip,$arduino_port,"S".chr(9).chr($led1));
} else {
    //else-Zweig wird aufgerufen, wenn keine Daten per POST übermittelt wurden.

   //daher daten vom Arduino (Pin 9) lesen und in $led1 speichern
    $led1 = arduino_send($arduino_ip,$arduino_port,"R".chr(9).chr(0));
}

Wichtig ist, das Du mit den Werten arbeitest, die Du von Deinem Formular bekommst. Du hast nur statisch den Wert "1" übermittelt, das bringt dann natürlich nicht viel.
Hier nochmal mein vollständiger PHP-Code, der einzige Unterschied ist, das ich mit GET arbeite. Da sehen zwar die URLs nicht so schön aus, aber man sieht was übermittelt wird, das macht es einfacher Fehler zu finden.

Code: [Select]

<h1>Test</h1>
<?php

$arduino_ip
="192.168.0.29";
$arduino_port="23";

function 
arduino_send($ip,$port,$command) {
    
$res fsockopen($ip,$port);
    if(
$res) {
        
fwrite($res,$command);
        
$ret =fread($res,1);
        echo 
"arduino_send() returned = $ret <br>\n";
        return 
$ret;
    } else {
        echo 
"Fehler, Kommando konnte nicht abgesetzt werden";
    }
}

if(isset(
$_GET['led1'])) {
    
$led1 $_GET['led1'];
    
arduino_send($arduino_ip,$arduino_port,"S".chr(9).chr($led1));
} else {
    
$led1 arduino_send($arduino_ip,$arduino_port,"R".chr(9).chr(0));
}

if(isset(
$_GET['led2'])) {
    
$led2 $_GET['led2'];
    
arduino_send($arduino_ip,$arduino_port,"S".chr(4).chr($led2));
} else {
    
$led2 arduino_send($arduino_ip,$arduino_port,"R".chr(4).chr(0));
}

if(isset(
$_GET['led3'])) {
    
$led3 $_GET['led3'];
    
arduino_send($arduino_ip,$arduino_port,"S".chr(5).chr($led3));
} else {
    
$led3 arduino_send($arduino_ip,$arduino_port,"R".chr(5).chr(0));
}

?>

<form action="">
  <p>
    LED 1 : <input type="radio" name="led1" value="0" <?php if($led1==0) echo "checked" ?> >aus -  <input type="radio" name="led1" value="1" <?php if($led1==1) echo "checked" ?> >an<br>
    LED 2 : <input type="radio" name="led2" value="0" <?php if($led2==0) echo "checked" ?> >aus -  <input type="radio" name="led2" value="1" <?php if($led2==1) echo "checked" ?> >an<br>
    LED 3 : <input type="radio" name="led3" value="0" <?php if($led3==0) echo "checked" ?> >aus -  <input type="radio" name="led3" value="1" <?php if($led3==1) echo "checked" ?> >an<br>
  </p>
  <input type="submit" name="submit" value="Abschicken">
</form>

Ich verwendet die Pins 4,5 und 9 auf dem Arduino. Da ich einen Arduino-Ethernet verwende, der die interne LED statt auf Pin 13 auf Pin 9 hat, kann ich gleich optisch prüfen ob das Senden klappt.

Go Up