Arduino и PHP через последовательный incomingbyte read


У меня есть PHP-скрипт для управления диодом Arduino через веб-сайт, но у меня есть проблема.

Мой код Arduino:

int green = 8;
int incomingbyte;

void setup()
{
  Serial.begin(9600);
  pinMode(green,OUTPUT);
}

void loop()
{
  if(Serial.available() > 0)
  {
    incomingbyte = Serial.read();
  }
  if(incomingbyte == '0'){
  digitalWrite(green,HIGH);
  }
  if(incomingbyte == '1'){
  digitalWrite(green,LOW);
  }
}

Мой PHP код:

<?php

error_reporting(E_ALL); 
ini_set("display_errors", 1);  

if (isset($_GET['action'])) {

    require("php_serial.class.php");

        $serial = new phpSerial();
        $serial->deviceSet("COM3");
        $serial->confBaudRate(9600);
        $serial->deviceOpen();

if ($_GET['action'] == "green1") {

        $serial->sendMessage("0r");

} else if ($_GET['action'] == "green0") {

        $serial->sendMessage("1r");
}

$serial->deviceClose();

}

И мой HTML-код:

<!DOCTYPE html>
<html>
<head>
<title>ARDUINO</title>
</head>
<body>

<h1> ARDUINO AND PHP COMMUNICATION </h1>

<a href="led.php?action=green1">ON</a></br>
<a href="led.php?action=green0">OFF</a></br>

</body>
</html>

У меня есть две проблемы:

  1. Arduino получает только incomingbyte = 0, поэтому я могу включить диод, но не могу выключить его. Я изменил код, чтобы установить incomingbyte = 1, чтобы включить диод, но он также не работает. Поэтому я думаю, что Arduino получает только incomingbyte = 0.

  2. Мой сайт закрывается после запуска скрипта. Когда я нажимаю на" вкл "или" выкл " скрипт запускается и я получаю белый (пустой) сайт. Что я должен делать, чтобы оставаться все время на моем HTML-сайте?

2 4

2 ответа:

Re: 2 Добавьте html-код под обработчик форм php-таким образом, все подается из одного скрипта, или используйте

header() 

Для перемещения обратно на html-страницу - но тогда вы не сможете выводить ошибки.

Отредактируйте так, чтобы сделать это одним файлом:

<?php
// led.php code in here
error_reporting(E_ALL); 
ini_set("display_errors", 1);  

if (isset($_GET['action'])) {
// and so on ...



?>
<!--// now show your html form regardless 
of whether the form was submitted or not // -->
<!DOCTYPE html>
<html>
<head>
<title>ARDUINO</title>
</head>
<body>

<h1> ARDUINO AND PHP COMMUNICATION </h1>

<a href="?action=green1">ON</a></br>
<a href="?action=green0">OFF</a></br>

</body>
</html>

Отредактировано, чтобы попытаться сделать решение немного более ясным. Обратите внимание, что вам не нужно добавлять светодиод.php к ссылкам, они отправляются обратно в тот же файл.

Эй, я только что вычислил два важных изменения для кода ur....

1 > изменить

$serial->sendMessage("0\r");

К

$serial->sendMessage('0');

И то же самое для отправки "1".

2 > Включите команду sleep.вот так

$serial = new phpSerial();
    $serial->deviceSet("COM3");
    $serial->confBaudRate(9600);
    $serial->deviceOpen();
    sleep(2);

Команда sleep вставляет задержку. когда последовательный порт открывается php в

$serial->deviceopen();

Команда arduino получает автосеттинг. таким образом, когда php выполняет следующие команды, которые arduino не сможет получить их и, следовательно, не сможет принять действие. 2-лучшая задержка, так как 1 будет очень коротким, а другие более 2-длинными. используйте php и html код в том же файле, что и в предыдущем сообщении, и назовите его " имя.php "без"". это сработало для меня ....