I wonder if there is a way to accomplish reading my serial port via PHP - that works :-)
In practising my Arduino skills, I developed a simple LED ON/OFF sketch. It works by entering on or off in the serial monitor.
Next step, I put together a webpage to act as an GUI interface to click a link and perform the on and off function above. This webbased GUI works via PHP. I am using the PHP SERIAL class to interact with the serial port my Arduino is using.
The issue is I need to find a way of getting feedback from the serial port. Using the Arduino IDE serial monitor, I can see my printed messages in response to each of my serial input and I need to retrieve the same feedback in my PHP code.
The PHP Serial class offers a readPort() function but I does not return my data.
UPDATE[2]:
ARDUINO:
const int greenPin = 2;
const int bluePin = 3;
const int redPin = 4;
int currentPin = 0; //current pin to be faded
int brightness = 0; //current brightness level
void setup(){
Serial.begin(9600);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(redPin, OUTPUT);
}
void loop(){
//if there's any serial data in the buffer, read a byte
if( Serial.available() > 0 ){
int inByte = Serial.read();
//respond only to the values 'r', 'g', 'b', or '0' through '9'
if(inByte == 'r')
currentPin = redPin;
if(inByte == 'g')
currentPin = greenPin;
if(inByte == 'b')
currentPin = bluePin;
if(inByte >= '0' && inByte <= '9'){
//map the incoming byte value to the range of the analogRead() command
brightness = map(inByte, '0', '9', 0, 255);
//set the current pin to the current brightness:
analogWrite(currentPin, brightness);
}
Serial.print("Current Pin : ");
Serial.println(currentPin);
Serial.print("Brightness : ");
Serial.println(brightness);
}//close serial check
}
PHP/HTML:
<?php
require("php_serial.class.php");
// include("php_serial.class.php");
// Let's start the class
$serial = new phpSerial();
// First we must specify the device. This works on both Linux and Windows (if
// your Linux serial device is /dev/ttyS0 for COM1, etc.)
$serial->deviceSet("/dev/ttyACM0");
// Set for 9600-8-N-1 (no flow control)
$serial->confBaudRate(9600); //Baud rate: 9600
$serial->confParity("none"); //Parity (this is the "N" in "8-N-1")
$serial->confCharacterLength(8); //Character length (this is the "8" in "8-N-1")
$serial->confStopBits(1); //Stop bits (this is the "1" in "8-N-1")
$serial->confFlowControl("none");
// Then we need to open it
$serial->deviceOpen();
// Read data
$read = $serial->readPort();
print "<pre>";
print_r($read);
print "</pre>";
// Print out the data
echo $read;
// print exec("echo 'r9g9b9' > /dev/ttyACM0");
print "RESPONSE(1): {$read}<br><br>";
// If you want to change the configuration, the device must be closed.
$serial->deviceClose();
?>
<?php
if( isset($_REQUEST['LED']) )
response();
?>
<form action='index.php' method='POST'>
<select id='led' name='LED'>
<option id='nil'>-</option>
<option id='red'>RED</option>
<option id='green'>GREEN</option>
<option id='blue'>BLUE</option>
<option id='all'>ALL</option>
</select>
<input type='submit' value='SET'>
</form>
<?php
print "Hi, Earthlings!";
function response(){
$CMDString = "";
$execute = false;
if( isset($_REQUEST['LED']) ){
switch ($_REQUEST['LED']) {
case 'RED':
$CMDString = 'r9';
$execute = true;
exec("echo 'r9g0b0' > /dev/ttyACM0");
print "<br>FOUND: {$_REQUEST['LED']}";
break;
case 'GREEN':
$CMDString = 'g9';
$execute = true;
print "<br>FOUND: {$_REQUEST['LED']}";
break;
case 'BLUE':
$CMDString = 'b9';
$execute = true;
print "<br>FOUND: {$_REQUEST['LED']}";
break;
case 'ALL':
$CMDString = 'r9g9b9';
$execute = true;
print "<br>FOUND: {$_REQUEST['LED']}";
break;
default:
print exec("echo 'r0g0b0' > /dev/ttyACM0");
$execute = false;
break;
}
if($execute){
print exec("echo '{$CMDString}' > /dev/ttyACM0");
print "<br><br>executing: {$CMDString}";
}
}
}
?>
I assume you work on linux.
First setup your serial port:
stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts
Then you can use good old fashion fread/fwrite
$fp =fopen("/dev/ttyACM0", "w+");
if( !$fp) {
echo "Error";die();
}
fwrite($fp, $_SERVER['argv'][1] . 0x00);
echo fread($fp, 10);
fclose($fp);
There is only one thing you have to remember. Arduino will restart on every connection. If you don't know that It will confuse you. For instance if you connect (fopen) and instantly send data Arduino will miss it because it's booting (which takes a sec or two). Experiment with sleep to give it some time. If you want to disable restarting use 10uF capacitor from GRD to RST.
Good luck
ps. you can troubleshoot with "screen"
screen /dev/ttyACM0 9600
Post about setting PHP with Arduino http://systemsarchitect.net/connecting-php-with-arduino-via-serial-port-on-linux/ and one more here http://systemsarchitect.net/arduino-and-php-serial-communication-with-a-protocol/.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With