Hallo zusammen,
ich bin relativer Anfänger und würde gerne einen Arduino in einem lokalen Netzwerk ohne ETH-Shield o.ä. steuern. Dieser ist via USB mit dem Rechner verbunden. Im Prinzip stelle ich mir das folgendermaßen vor:
Browser (PHP-Skript) --> Webserver (XAMPP) --> Com-Port (Windows-Rechner) --> Arduino UNO
Ich habe auch schon eine Klasse gefunden, die ich in mein PHP-Skript einbinden kann, die diese Funktionalität grundlegend bereitstellt (php_serial.class.php von GITHUB)
Hier mal der Arduino-Code:
int ledPin12 = 12; // the pin that the red LED is attached to
char incomingByte; // a variable to read incoming serial data into
void setup() {
Serial.begin(9600); // initialize serial communication
pinMode(ledPin12, OUTPUT); // initialize the red LED pin as an output
}
void loop() {
// see if there's incoming serial data:
if (Serial.available() > 0) {
incomingByte = Serial.read(); // read the oldest byte in the serial buffer
//Preform the code to switch on or off the leds
if (incomingByte == '9') {
digitalWrite(ledPin12, HIGH); //If the serial data is 2 turn green LED on
//Serial.println("9");
}
if (incomingByte == '3') {
digitalWrite(ledPin12, LOW); //If the serial data is 3 turn green LED off
//Serial.println("3");
}
}
}
und hier der PHP-Code:
<?php //declare(strict_types=1); // strict requirement
//Load the serial port class
require("php_serial.class.php");
//Initialize the class
$serial = new phpSerial();
$serial->phpSerial();
// Variablen deklarieren
$value_on = '9'; // hier anscheinend egal ob '' oder ""
$value_off = "3"; //
// Serielle Schnittstelle öffnen
$serial->deviceSet("COM5");
$serial->confBaudRate(9600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->confFlowControl("none");
$serial->deviceOpen();
sleep(1);
$serial->sendMessage($value_on);
sleep(1);
$serial->sendMessage($value_off);
sleep(1);
$serial->sendMessage($value_on);
sleep(1);
$serial->sendMessage($value_off);
sleep(1);
//We're done, so close the serial port again
$serial->deviceClose();
?>
Das funktioniert zwar so wie es hier steht, aber ich habe einige komisch Phänomene festgestellt die ich mir nicht erklären kann:
wenn ich im PHP-Skript bspw. $value_on = '1'; nutze, geht die LED nicht an (Im Arduino-Code natürlich auch auf den anderen Parameter geändert: if (incomingByte == '1')).
Bei der Kombination aus '3' = LED ein und '4' für LED aus geht die LED zwar an aber nicht mehr aus.
Die Parameter 'A' für LED ein und 'B' für LED aus funktionieren z.B. auch korrekt. Also gibt es aktuell Zeichen die ich als Befehl benutzen kann und welche bei denen es nicht funktioniert. Ich habe schon versucht mit strikten Datentypen im PHP zu arbeiten aber das hatte bei mir zumindest auch keinen unterschied bewirkt. Vielleicht habe ich auch was falsch gemacht, das will ich gar nicht ausschließen.
Hat von Euch jemand eine Idee oder kennt einen schöneren Weg wie z.B. auch flexibler darauf reagiert werden kann bzw. die Befehle auch komplexer gestaltet werden können?
Ich habe auch schon einen älteren Forumsbeitrag gefunden der etwas ähnliches abbildet aber der ist a) leider schon geschlossen und b) wird dort mit einem ETH-Shield (IP-Adressen usw. )gearbeitet. Ich würde es ja gerne direkt am COM-Port betreiben.
Ich hoffe auf Eure Hilfe und Eure Ideen woran das liegen kann.
Viele Grüße
Lukas