For a couple of days now I have been looking for a PHP class that would help me send data to my Arduino board. So far the only class everybody points to is this one, but I haven’t been able to get it to work with Windows!
My Fix: PHP, JQuery and Visual C++
Instead of just using PHP I have decided to split the job between Visual C++ and PHP ( and I’ve added JQuery while we are at it. Visual C++ is a great framework witch which you can easily program serial port communication, all I have to do with PHP is send data to my C++ program.
What Our Program Will Do
I want to make a set of buttons and using HTML with which I can control my Arduino’s pin 13 light.
How The Program Will Work
I will have three files for this project, the HTML, PHP and C++ programs. My PHP and C++ will have the same name, but they don’t have to if you don’t want.
Whenever someone clicks on one of the buttons in my HTML page I will send a value, using JQuery, to my PHP script. The PHP script will send that value to my C++ program which will send it to my Arduino. The C++ program will send some data back to PHP and JQuery to display it in HTML.
I plugin my Arduino board at random USB ports, so I will also have a text field with which I can change ports, this way I won’t have to compile my C++ program every time I decide to plug in the board at a different port.
The values I will be sending are "on" if the user clicks and "off" if the user clicks , I will also be sending the port name which is in my text field.
My C++ will send the value "1" to the Arduino if the value sent to it was "on", it will send "0" if the value was "off"
My HTML Page: The User Interface
I will need two buttons, each with their respective values, a textfield and a div for my C++ response.
The HTML
<p> <div id="response"> </div> </p> <p> <label>PORT</label> <input type="text" id="com" size="5" /> </p> <p> <button value="on">On</button><button value="off">Off</button> </p>
The JQuery
My JQuery is also very simple. If you don’t know what am doing here check out my JQuery tutorial on this subject.
JQuery AJAX Tutorial.
<!-- include JQuery-->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<!-- JQuery script-->
<script type="text/javascript">
$(document).ready(function(){
var port;
var value;
$("button").click(function(){
value=$(this).val();
port=$("#com").val();
$("#response").hide(1000);
$.post('arduino.php',{message:value,port:port},function(response){
$("#response").html(response).show(1000);
});
});
});
</script>
My PHP Script: The Messanger
Please call this file arduino.php as this is the name we gave it in JQuery.
// line jquery code
...$.post('arduino.php',{...
My C++ Arduino program will be called arduino.exe and the data I will be sending to its main function is the port name and message (either 0 or 1 ) in this order. The C++ response will be stored in the variable $output, as an array of each line and the status in the variable $returnStatus.
I use the status variable to debug my programs but it’s optional.
If you are unfamiliar with how C++’s main function can take parameters check out my tutorial on this subject.
How To Use C++ and PHP Together
PHP Code:
$message=$_POST['message'];
$port=$_POST['port'];
exec("arduino.exe {$port} {$message}",$output,$returnStatus);
foreach($output as $line)
{
echo '<p>';
echo $line;
echo '</p>';
}
echo "Return Status: {$returnStatus}";
My C++ Code: The Interpreter
I will be using the serial port class. This class I very easy to use and I talked about it in detail in my previous post. I also show how to use Visual C++.
How To: Control Your Arduino With PHP
I think the code is self explanatory and well commented so here it is.
#include "stdafx.h"
using namespace System;
using namespace System::IO::Ports;
int main(array<System::String ^> ^args)
{
Console::WriteLine("Visual C++ Program Output:");
if(args->Length==2)
{
String^ message=args[1]; // get message ( 0 or 1 )
String^ port=args[0]; // get port name
// arduino settings
SerialPort^ arduino;
arduino = gcnew SerialPort(); // make arduino object
arduino->PortName =port; // set port name
arduino->BaudRate = 9600; // set baud rate
arduino->ReadTimeout = 500; // set read time out
arduino->WriteTimeout = 500; // set write time out
// open port
try
{
arduino->Open(); // open port
//check that user typed one of the options
if(String::Compare(message,"on")==0) // if sent value was "on"
arduino->Write("1"); // send 1 to arduino
else if(String::Compare(message,"off")==0)
arduino->Write("0"); // send 0 to arduino
else
Console::WriteLine(message+" was not an option");
// close port to arduino
arduino->Close();
}
catch (IO::IOException^ e )
{
Console::WriteLine(e->GetType()->Name+": Port is not ready");
return 2;
}
catch (ArgumentException^ e)
{
Console::WriteLine(e->GetType()->Name+": incorrect port name syntax, must start with COM/com");
return 3;
}
}
else
{
Console::WriteLine("Error: arduino.exe needs at least two parameters.");
return 1;
}
return 0;
}
My Arduino Code: The Receiver
My Arduino code is also very simple, notice that am comparing values received not as integers but as characters.
int ledPin = 13;
int state=0;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0)
{
state = Serial.read();
switch(state)
{
case '1':
digitalWrite(ledPin,HIGH);
break;
case '0':
digitalWrite(ledPin,LOW);
break;
default:
break;
}
}
}
That’s it for this post, leave your questions or comments below.