Управляем Arduino из PHP

В данном примере показана возможность взаимодействия php и  Arduino. Тест проводится на Ubuntu 14.04, установлен веб сервер Apachе 2, php 5.5. В тесте опробована включение и выключение цифрового выхода, а так же опрос состояния выхода при помощи php.

test.php

<meta charset="utf-8">
<table align='center' width="200" border='0' cellspacing='0' cellpadding='5'>

<form action="" method="post">
<td><button type="submit" name="on">Включить</button></td>
<td><button type="submit" name="off">Выключить</button><td>
</form>
<tr><td colspan="2"><center>
<?php
/* В терминале перед запуском скрипта выполните команду:
sudo chown www-data:www-data /dev/ttyUSB0                        
*/
$dev = "/dev/ttyUSB0";
exec("stty -F $dev 9600 raw -echo");
$f = fopen($dev,"w+");// открываем порт
if (!$f) die ("Ошибка!!! Порт не открылся!");

sleep(2);
// Отправка в порт
if (isset($_POST["on"])){fwrite($f,chr(49));echo"ON";}
if (isset($_POST["off"])){fwrite($f,chr(48));echo"OFF";}

sleep(2);
// чтение порта
while (fread($f, 1) != chr(0xA)){} // ждем ответа
$a = fgets($f);
echo "<br>Выход 13: ". $a;
  
fclose($f); // закрываем порт

?>

скетч

void setup(){
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}
char Byte;

void loop(){
  if( Serial.available() > 0 ){
    Byte = Serial.read(); 
    if(Byte == '1'){
      digitalWrite(13,HIGH);
    }
    if(Byte == '0'){
      digitalWrite(13,LOW);
    }
  }
  Serial.println(digitalRead(13));// Отправляем каждые 1000 мс
   delay(1000);
}

Через порт при помощи php скрипта отправляются данные типа  char, соответственно chr(49) = 1, а chr(48) = 0, что соответствует коду символа в таблице кодировки символов ASCII. Перед отправкой данных происходит открытие порта, отправляются данные и порт закрывается. При этом на плате Arduino загорается или гаснет, в зависимости от команды светодиод подключенный к пину 13. Если это делается удаленно, то желательно получить обратную связь, нужно убедится в правильности работы Arduino, поэтому перед закрытием порта php скрипт ожидает ответ от Arduino. В скетче видно, что происходит запрос состояния пина 13 и отправка значения один раз в секунду в порт.

Изменив немного код можно передать значение напряжения поданного на вход А1 скрипту php.

Подадим напряжение 3,3 В на аналоговый вход А1 и измерим его при помощи php скрипта.

test.php

<meta charset="utf-8">
<table align='center' width="200" border='0' cellspacing='0' cellpadding='5'>

<form action="" method="post">
<td><button type="submit">Измерить напряжение на входе А1</button></td>
</form>
<tr><td colspan="2"><center>
<?php
/* В терминале перед запуском выполните команды:
sudo chown www-data:www-data /dev/ttyUSB0                        
*/
$dev = "/dev/ttyUSB0";
exec("stty -F $dev 9600 raw -echo");
$f = fopen($dev,"w+");// открываем порт
if (!$f) die ("Ошибка!!! Порт не открылся!");

sleep(2);
// чтение порта
while (fread($f, 1) != chr(0xA)){} // ждем ответа
$a = fgets($f);
echo "<br>Напряжение: ". $a. "В";
  
fclose($f); // закрываем порт

?>
</td><tr></table>

скетч

void setup(){
  Serial.begin(9600);
  pinMode(A1,INPUT);
}

float u;
int u1;

void loop(){
  u1=analogRead(A1);
  u=u1*5.0/1023;
  
  Serial.println(u);// Отправляем каждые 1000 мс
   delay(1000);
}

Добавить комментарий

Войти с помощью: