Show Posts
Pages: 1 ... 69 70 [71] 72 73 ... 95
1051  International / Deutsch / Re: Brauche Hilfe: Ausgang per Web schalten mit PHP on: May 01, 2012, 05:03:22 am
Code:
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:
//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:
<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.
1052  International / Deutsch / Re: Brauche Hilfe: Ausgang per Web schalten mit PHP on: May 01, 2012, 12:39:14 am
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:
<?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.
1053  International / Deutsch / Re: Anfänger Projekt - Dimmen von LEDs mit Arduino on: April 30, 2012, 12:59:39 pm
@Uwe:
Von dieser begrenzung innerhalb eines Ports ist mir nichts bekannt. Die Begrenzungen sind 40mA pro  Pin die durch die Ausgangstransistoren des ATmega fließen und 200 mA Gesamtstrom der über die Masse/Spannungsversorgungspinns fließt. Da git es keine Begrenzung innerhalb des Ports.
Ich bin auch nur über den Playground darüber gestolpert: http://arduino.cc/playground/Main/ArduinoPinCurrentLimitations Habe aber noch nicht im Datenblatt des ATMega geschaut ob das korrekt ist.

Daß man den Gesamtstrom begrenzt, wenn man bei PWM nicht 100% durchsteuert ist ein Trugschluß. Da PWM nur die Ein- zu Aus-Zeit-Verhältnis ändert, heißt das nicht, daß nicht alle Ausgänge gleichzeitig HIGH sein können und somit die LEDS den vollen Gesamtstrom ziehen.
Damit hast Du natürlich recht, zumal es sehr wahrscheinlich ist, das sogar alle LEDs gleichzeitig angesteuert werden, da der PWM-Takt ja für alle gleich ist.
Mario.
1054  International / Deutsch / Re: Anfänger Projekt - Dimmen von LEDs mit Arduino on: April 30, 2012, 08:35:54 am
Ich glaube dieser PWM Trieber wäre übertrieben. Bei 5 Dollar pro Stück bist Du 65 Dollar los. Es würde sicher reichen, wenn Du die LEDs über einfache Transistoren schaltest. Das PWM-Signal generiert ja schon Dein Arduino.
http://www.sqlskills.com/blogs/paulselec/post/Arduino-figuring-out-transistors-and-associated-resistors.aspx kannst Du als Vorlage nehmen.
Die Transistoren gibt's für ca. 5Cent pro Stück bei rechelt und Co. und die Widerstände kosten auch nicht die Welt. So bekommst Du für 5 Euro vermutlich alle Teile für Dein Projekt, inkl. der LEDs :-)
1055  International / Deutsch / Re: Anfänger Projekt - Dimmen von LEDs mit Arduino on: April 30, 2012, 08:03:07 am
Auf die Schnelle habe ich folgendes gefunden: http://arduino.cc/playground/Main/ArduinoPinCurrentLimitations. Genaue Details finden sich vermutlich nur im Datenblatt des Atmel Controllers.
Ein einzelner Ausgang kann bis zu 40mA treiben, das ist richtig. Aber Du kannst nicht auf allen gleichzeitig 40mA abziehen, da die Gesamtlast aller Ausgänge ja komplett durch den Controller fliesst.
Wie gesagt, bei low current LEDs sollte es keine Probleme geben, da Du bei 5mA bei allen 13 LEDs gerade mal auf 65 mA kommst, das schafft der Mega locker.
Mario.
1056  International / Deutsch / Re: Anfänger Projekt - Dimmen von LEDs mit Arduino on: April 30, 2012, 06:28:03 am
Hallo Alexander,

ja Links sind erlaubt. Die Auswahl scheint auch erstmal schlüssig zu sein und Reichelt als Quelle ist auch nicht das schlechteste. Du solltest aber bei 13 LEDs bedenken, das auch der Arduino Mega nur einen begrenzten Gesamtstrom hat, der fliessen darf. Bei 13 LEDs * 20 mA (bei max. HElligkeit) hast Du schon 260 mA und das könnte bereits knapp werden. Die einzelnen Ausgänge des Arduino sind in Ports zu je 8 Pins zusammengefasst, diese Ports wiederum vertragen auch nur einen begrenzten Strom. Hier würden sich ggf. Low current LEDs anbieten, die mit maximal 5mA laufen und die dann kein Problem mehr darstellen sollten. Alternativ kannst Du auch die "normalen" LEDs mit deutlich weniger Strom betreiben, die sind dann halt nur nicht ganz so hell. Wenn Deine Anwendung nie alle LEDs auf einmal mit voller Helligkeit betreibt, ist das wohl auch nicht so tragisch, aber ich persönlich wäre da lieber vorsichtig.
Mario.
1057  International / Deutsch / Re: Brauche Hilfe: Ausgang per Web schalten mit PHP on: April 29, 2012, 10:44:28 pm
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.
1058  International / Deutsch / Re: Brauche Hilfe: Ausgang per Web schalten mit PHP on: April 28, 2012, 12:33:36 am
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:
<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.
1059  International / Deutsch / Re: Brauche Hilfe: Ausgang per Web schalten mit PHP on: April 27, 2012, 04:09:47 pm
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.


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.
1060  International / Deutsch / Re: TLC5947 on: April 27, 2012, 08:46:52 am
Sowas hier: http://www.razorconcepts.net/tlc5947.html?
Das war der erste Google-Treffer ...
1061  International / Deutsch / Re: Brauche Hilfe: Ausgang per Web schalten mit PHP on: April 27, 2012, 07:12:46 am
Zum Senden an den Arduino kannst Du erstmal folgende einfache Funktion verwenden.
Code:
<?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:
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:
$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.
1062  International / Deutsch / Re: Gpsdaten auf Sd karte loggen on: April 27, 2012, 06:17:51 am
Sieht so aus, als würde Dein Arduino resets bekommen / ausführen, denn dann wird jedesmal wieder die setup() aufgerufen.
Wie schnell hintereinander kommen denn die Ausgaben?
1063  International / Deutsch / Re: Licht auf bestimmte Musik !!! on: April 26, 2012, 09:33:54 am
Im Code, den Du im Vixen-Forum gefunden hast, geht es ja eigentlich um die Ausgabe auf PWM-Pins. Dort wird ja auch analogWrite() verwendet und es macht Sinn, ein komplettes Byte zu schreiben.
Da Du digitale Pins verwendest, solltest Du ein HIGH oder LOW mittelst digitalWrite() schreiben. Wie gesagt, das digitalWrite() nimmt Dir die Arbeit ab, daher ist das OK. Um es übersichtlicher zu machen, kannst Du auch ein
Code:
if(incomingByte[i] != 0) {
    digitalWrite(pin,HIGH);
} else {
    digitalWrite(pin,LOW);
}
verwenden. Aber wie gesagt, das hat keinen Einfluss auf das Ergebnis, da digitalWrite() im Prinzip das Gleiche macht.
Jetzt wäre es gut zu wissen, ob Vixen tatsächlich immer korrekterweise Nullen und "nicht Nullen" schickt, wenn ein Channel geändert wird.
Mario.
1064  International / Deutsch / Re: Licht auf bestimmte Musik !!! on: April 26, 2012, 08:23:45 am
Quote
Wo werden denn da bitteschön bytes zu den pins gesendet ?
Genau da:
Code:
digitalWrite(Channel4, incomingByte[3]);
Dazu hatte ich aber auch schon was geschrieben. Das ist kein schöner Stil, funktioniert aber, da alles was nicht 0 ist asl HIGH gewertet wird.
1065  International / Deutsch / Re: Licht auf bestimmte Musik !!! on: April 24, 2012, 01:35:04 pm
Der Code für die Schleife ist ja immer noch falsch und zwar in beiden Programmen.

Code:
//diese schleife zählt von 0 bis 7, also 8 nicht 7 Werte!!!
for (int i=0; i<8; i++) {
      // read each byte
      incomingByte[i] = Serial.read();
    }

//diese schleife zählt von 0 bis 5, also 6 nicht 5 Werte!!!
for (int i=0; i<6; i++) {
      // read each byte
      incomingByte[i] = Serial.read();
    }
Entweder hast Du einen zusätzlichen Channel definiert, der mit ausgegeben wird, dann passt das evtl. oder es funktionieren beide Programme nicht richtig.
Mario.
Pages: 1 ... 69 70 [71] 72 73 ... 95