Comunicación entre Arduino y Servidor web utilizando PHP




Voy a dedicar este post a explicar, un poco más en detalle, la comunicación entre Arduino y el servidor web a través del puerto serie (en este caso, USB), utilizando una clase de PHP creada por Rémy Sanchez.

El principio es el mismo que utiliza la aplicación de Arduino para comunicarse con la placa a través del "Serial Monitor". La cuestión aquí es, como enviar y recibir esos datos desde nuestro servidor web.

Yo he utilizado una clase de PHP, ya preparada, para comunicarme con el puerto serie del ordenador. Esta clase funciona perfectamente sobre un servidor en Linux. Según su autor, también es compatible con Windows, pero solo para enviar mensajes.

No hace falta más que este pequeño fragmento de código, para empezar a jugar:
<?php 

   // incluímos la clase necesaria para la comunicación
   require("php_serial.class.php");

   $serial = new phpSerial;
   // indicamos que puerto serie queremos usar
   $serial->deviceSet("/dev/ttyACM0");
   // ahora la velocidad de transmisión de Arduino
   $serial->confBaudRate(115200);
   $serial->deviceOpen();

   // aquí el String que queremos enviar
   $serial->sendMessage("light");
   sleep (1);
   
   $serial->deviceClose();

?>

Yo de momento solo lo he utilizado para enviar. Pero en caso de querer recibir habría que utilizar la función readPort(). Como parámetro podemos enviarle el número de caracteres que debe leer, nos devuelve un String.
<?php

   // guardamos en $read la cadena de 
   // caracteres que hemos recibido de Arduino
   $read = $serial->readPort();

?>

A continuación os dejo la clase necesaria para poder usar estas funciones. Unicamente tendréis que guardarla en un archivo a parte, respetando el nombre que os indico como título del código, para que os funcione con el ejemplo que he puesto arriba.



php_serial.class.php

 <?php  
 define ("SERIAL_DEVICE_NOTSET", 0);  
 define ("SERIAL_DEVICE_SET", 1);  
 define ("SERIAL_DEVICE_OPENED", 2);  
   
 /**  
  * Serial port control class  
  *  
  * THIS PROGRAM COMES WITH ABSOLUTELY NO WARANTIES !  
  * USE IT AT YOUR OWN RISKS !  
  *  
  * Changes added by Rizwan Kassim <rizwank@uwink.com> for OSX functionality  
  * default serial device for osx devices is /dev/tty.serial for machines with a built in serial device  
  *  
  * @author RÈmy Sanchez <thenux@gmail.com>  
  * @thanks AurÈlien Derouineau for finding how to open serial ports with windows  
  * @thanks Alec Avedisyan for help and testing with reading  
  * @copyright under GPL 2 licence  
  *  
  * do not change this code unless you know what you are getting into. Leaving it as you have received it should work fine!  
  */  
 class phpSerial  
 {  
      var $_device = null;  
      var $_windevice = null;  
      var $_dHandle = null;  
      var $_dState = SERIAL_DEVICE_NOTSET;  
      var $_buffer = "";  
      var $_os = "";  
   
      /**  
       * This var says if buffer should be flushed by sendMessage (true) or manualy (false)  
       *  
       * @var bool  
       */  
      var $autoflush = true;  
   
      /**  
       * Constructor. Perform some checks about the OS and setserial  
       *  
       * @return phpSerial  
       */  
      function phpSerial ()  
      {  
           setlocale(LC_ALL, "en_US");  
   
           $sysname = php_uname();  
   
           if (substr($sysname, 0, 5) === "Linux")  
           {  
                $this->_os = "linux";  
   
                if($this->_exec("stty --version") === 0)  
                {  
                     register_shutdown_function(array($this, "deviceClose"));  
                }  
                else  
                {  
                     trigger_error("No stty availible, unable to run.", E_USER_ERROR);  
                }  
           }  
           elseif (substr($sysname, 0, 6) === "Darwin")  
           {  
                $this->_os = "osx";  
       // We know stty is available in Darwin.   
       // stty returns 1 when run from php, because "stty: stdin isn't a  
       // terminal"  
       // skip this check  
 //               if($this->_exec("stty") === 0)  
 //               {  
                     register_shutdown_function(array($this, "deviceClose"));  
 //               }  
 //               else  
 //               {  
 //                    trigger_error("No stty availible, unable to run.", E_USER_ERROR);  
 //               }  
           }  
           elseif(substr($sysname, 0, 7) === "Windows")  
           {  
                $this->_os = "windows";  
                register_shutdown_function(array($this, "deviceClose"));  
           }  
           else  
           {  
                trigger_error("Host OS is neither osx, linux nor windows, unable tu run.", E_USER_ERROR);  
                exit();  
           }  
      }  
   
      //  
      // OPEN/CLOSE DEVICE SECTION -- {START}  
      //  
   
      /**  
       * Device set function : used to set the device name/address.  
       * -> linux : use the device address, like /dev/ttyS0  
       * -> osx : use the device address, like /dev/tty.serial  
       * -> windows : use the COMxx device name, like COM1 (can also be used  
       *   with linux)  
       *  
       * @param string $device the name of the device to be used  
       * @return bool  
       */  
      function deviceSet ($device)  
      {  
           if ($this->_dState !== SERIAL_DEVICE_OPENED)  
           {  
                if ($this->_os === "linux")  
                {  
                     if (preg_match("@^COM(\d+):?$@i", $device, $matches))  
                     {  
                          $device = "/dev/ttyS" . ($matches[1] - 1);  
                     }  
   
                     if ($this->_exec("stty -F " . $device) === 0)  
                     {  
                          $this->_device = $device;  
                          $this->_dState = SERIAL_DEVICE_SET;  
                          return true;  
                     }  
                }  
                elseif ($this->_os === "osx")  
                {  
                     if ($this->_exec("stty -f " . $device) === 0)  
                     {  
                          $this->_device = $device;  
                          $this->_dState = SERIAL_DEVICE_SET;  
                          return true;  
                     }  
                }  
                elseif ($this->_os === "windows")  
                {  
                     if (preg_match("@^COM(\d+):?$@i", $device, $matches) and $this->_exec(exec("mode " . $device)) === 0)  
                     {  
                          $this->_windevice = "COM" . $matches[1];  
                          $this->_device = "\\.\com" . $matches[1];  
                          $this->_dState = SERIAL_DEVICE_SET;  
                          return true;  
                     }  
                }  
   
                trigger_error("Specified serial port is not valid", E_USER_WARNING);  
                return false;  
           }  
           else  
           {  
                trigger_error("You must close your device before to set an other one", E_USER_WARNING);  
                return false;  
           }  
      }  
   
      /**  
       * Opens the device for reading and/or writing.  
       *  
       * @param string $mode Opening mode : same parameter as fopen()  
       * @return bool  
       */  
      function deviceOpen ($mode = "r+b")  
      {  
           if ($this->_dState === SERIAL_DEVICE_OPENED)  
           {  
                trigger_error("The device is already opened", E_USER_NOTICE);  
                return true;  
           }  
   
           if ($this->_dState === SERIAL_DEVICE_NOTSET)  
           {  
                trigger_error("The device must be set before to be open", E_USER_WARNING);  
                return false;  
           }  
   
           if (!preg_match("@^[raw]\+?b?$@", $mode))  
           {  
                trigger_error("Invalid opening mode : ".$mode.". Use fopen() modes.", E_USER_WARNING);  
                return false;  
           }  
   
           $this->_dHandle = @fopen($this->_device, $mode);  
   
           if ($this->_dHandle !== false)  
           {  
                stream_set_blocking($this->_dHandle, 0);  
                $this->_dState = SERIAL_DEVICE_OPENED;  
                return true;  
           }  
   
           $this->_dHandle = null;  
           trigger_error("Unable to open the device", E_USER_WARNING);  
           return false;  
      }  
   
      /**  
       * Closes the device  
       *  
       * @return bool  
       */  
      function deviceClose ()  
      {  
           if ($this->_dState !== SERIAL_DEVICE_OPENED)  
           {  
                return true;  
           }  
   
           if (fclose($this->_dHandle))  
           {  
                $this->_dHandle = null;  
                $this->_dState = SERIAL_DEVICE_SET;  
                return true;  
           }  
   
           trigger_error("Unable to close the device", E_USER_ERROR);  
           return false;  
      }  
   
      //  
      // OPEN/CLOSE DEVICE SECTION -- {STOP}  
      //  
   
      //  
      // CONFIGURE SECTION -- {START}  
      //  
   
      /**  
       * Configure the Baud Rate  
       * Possible rates : 110, 150, 300, 600, 1200, 2400, 4800, 9600, 38400,  
       * 57600 and 115200.  
       *  
       * @param int $rate the rate to set the port in  
       * @return bool  
       */  
      function confBaudRate ($rate)  
      {  
           if ($this->_dState !== SERIAL_DEVICE_SET)  
           {  
                trigger_error("Unable to set the baud rate : the device is either not set or opened", E_USER_WARNING);  
                return false;  
           }  
   
           $validBauds = array (  
                110  => 11,  
                150  => 15,  
                300  => 30,  
                600  => 60,  
                1200  => 12,  
                2400  => 24,  
                4800  => 48,  
                9600  => 96,  
                19200 => 19,  
                38400 => 38400,  
                57600 => 57600,  
                115200 => 115200  
           );  
   
           if (isset($validBauds[$rate]))  
           {  
                if ($this->_os === "linux")  
                {  
         $ret = $this->_exec("stty -F " . $this->_device . " " . (int) $rate, $out);  
       }  
       if ($this->_os === "darwin")  
       {  
         $ret = $this->_exec("stty -f " . $this->_device . " " . (int) $rate, $out);  
       }  
       elseif ($this->_os === "windows")  
       {  
         $ret = $this->_exec("mode " . $this->_windevice . " BAUD=" . $validBauds[$rate], $out);  
       }  
       else return false;  
   
                if ($ret !== 0)  
                {  
                     trigger_error ("Unable to set baud rate: " . $out[1], E_USER_WARNING);  
                     return false;  
                }  
           }  
      }  
   
      /**  
       * Configure parity.  
       * Modes : odd, even, none  
       *  
       * @param string $parity one of the modes  
       * @return bool  
       */  
      function confParity ($parity)  
      {  
           if ($this->_dState !== SERIAL_DEVICE_SET)  
           {  
                trigger_error("Unable to set parity : the device is either not set or opened", E_USER_WARNING);  
                return false;  
           }  
   
           $args = array(  
                "none" => "-parenb",  
                "odd" => "parenb parodd",  
                "even" => "parenb -parodd",  
           );  
   
           if (!isset($args[$parity]))  
           {  
                trigger_error("Parity mode not supported", E_USER_WARNING);  
                return false;  
           }  
   
           if ($this->_os === "linux")  
           {  
                $ret = $this->_exec("stty -F " . $this->_device . " " . $args[$parity], $out);  
           }  
           else  
           {  
                $ret = $this->_exec("mode " . $this->_windevice . " PARITY=" . $parity{0}, $out);  
           }  
   
           if ($ret === 0)  
           {  
                return true;  
           }  
   
           trigger_error("Unable to set parity : " . $out[1], E_USER_WARNING);  
           return false;  
      }  
   
      /**  
       * Sets the length of a character.  
       *  
       * @param int $int length of a character (5 <= length <= 8)  
       * @return bool  
       */  
      function confCharacterLength ($int)  
      {  
           if ($this->_dState !== SERIAL_DEVICE_SET)  
           {  
                trigger_error("Unable to set length of a character : the device is either not set or opened", E_USER_WARNING);  
                return false;  
           }  
   
           $int = (int) $int;  
           if ($int < 5) $int = 5;  
           elseif ($int > 8) $int = 8;  
   
           if ($this->_os === "linux")  
           {  
                $ret = $this->_exec("stty -F " . $this->_device . " cs" . $int, $out);  
           }  
           else  
           {  
                $ret = $this->_exec("mode " . $this->_windevice . " DATA=" . $int, $out);  
           }  
   
           if ($ret === 0)  
           {  
                return true;  
           }  
   
           trigger_error("Unable to set character length : " .$out[1], E_USER_WARNING);  
           return false;  
      }  
   
      /**  
       * Sets the length of stop bits.  
       *  
       * @param float $length the length of a stop bit. It must be either 1,  
       * 1.5 or 2. 1.5 is not supported under linux and on some computers.  
       * @return bool  
       */  
      function confStopBits ($length)  
      {  
           if ($this->_dState !== SERIAL_DEVICE_SET)  
           {  
                trigger_error("Unable to set the length of a stop bit : the device is either not set or opened", E_USER_WARNING);  
                return false;  
           }  
   
           if ($length != 1 and $length != 2 and $length != 1.5 and !($length == 1.5 and $this->_os === "linux"))  
           {  
                trigger_error("Specified stop bit length is invalid", E_USER_WARNING);  
                return false;  
           }  
   
           if ($this->_os === "linux")  
           {  
                $ret = $this->_exec("stty -F " . $this->_device . " " . (($length == 1) ? "-" : "") . "cstopb", $out);  
           }  
           else  
           {  
                $ret = $this->_exec("mode " . $this->_windevice . " STOP=" . $length, $out);  
           }  
   
           if ($ret === 0)  
           {  
                return true;  
           }  
   
           trigger_error("Unable to set stop bit length : " . $out[1], E_USER_WARNING);  
           return false;  
      }  
   
      /**  
       * Configures the flow control  
       *  
       * @param string $mode Set the flow control mode. Availible modes :  
       *      -> "none" : no flow control  
       *      -> "rts/cts" : use RTS/CTS handshaking  
       *      -> "xon/xoff" : use XON/XOFF protocol  
       * @return bool  
       */  
      function confFlowControl ($mode)  
      {  
           if ($this->_dState !== SERIAL_DEVICE_SET)  
           {  
                trigger_error("Unable to set flow control mode : the device is either not set or opened", E_USER_WARNING);  
                return false;  
           }  
   
           $linuxModes = array(  
                "none"   => "clocal -crtscts -ixon -ixoff raw",  
                "rts/cts" => "-clocal crtscts -ixon -ixoff",  
                "xon/xoff" => "-clocal -crtscts ixon ixoff"  
           );  
           $windowsModes = array(  
                "none"   => "xon=off octs=off rts=on",  
                "rts/cts" => "xon=off octs=on rts=hs",  
                "xon/xoff" => "xon=on octs=off rts=on",  
           );  
   
           if ($mode !== "none" and $mode !== "rts/cts" and $mode !== "xon/xoff") {  
                trigger_error("Invalid flow control mode specified", E_USER_ERROR);  
                return false;  
           }  
   
           if ($this->_os === "linux")  
                $ret = $this->_exec("stty -F " . $this->_device . " " . $linuxModes[$mode], $out);  
           else  
                $ret = $this->_exec("mode " . $this->_windevice . " " . $windowsModes[$mode], $out);  
   
           if ($ret === 0) return true;  
           else {  
                trigger_error("Unable to set flow control : " . $out[1], E_USER_ERROR);  
                return false;  
           }  
      }  
   
      /**  
       * Sets a setserial parameter (cf man setserial)  
       * NO MORE USEFUL !  
       *      -> No longer supported  
       *      -> Only use it if you need it  
       *  
       * @param string $param parameter name  
       * @param string $arg parameter value  
       * @return bool  
       */  
      function setSetserialFlag ($param, $arg = "")  
      {  
           if (!$this->_ckOpened()) return false;  
   
           $return = exec ("setserial " . $this->_device . " " . $param . " " . $arg . " 2>&1");  
   
           if ($return{0} === "I")  
           {  
                trigger_error("setserial: Invalid flag", E_USER_WARNING);  
                return false;  
           }  
           elseif ($return{0} === "/")  
           {  
                trigger_error("setserial: Error with device file", E_USER_WARNING);  
                return false;  
           }  
           else  
           {  
                return true;  
           }  
      }  
   
      //  
      // CONFIGURE SECTION -- {STOP}  
      //  
   
      //  
      // I/O SECTION -- {START}  
      //  
   
      /**  
       * Sends a string to the device  
       *  
       * @param string $str string to be sent to the device  
       * @param float $waitForReply time to wait for the reply (in seconds)  
       */  
      function sendMessage ($str, $waitForReply = 0.1)  
      {  
           $this->_buffer .= $str;  
   
           if ($this->autoflush === true) $this->serialflush();  
   
           usleep((int) ($waitForReply * 1000000));  
      }  
   
      /**  
       * Reads the port until no new datas are availible, then return the content.  
       *  
       * @pararm int $count number of characters to be read (will stop before  
       *      if less characters are in the buffer)  
       * @return string  
       */  
      function readPort ($count = 0)  
      {  
           if ($this->_dState !== SERIAL_DEVICE_OPENED)  
           {  
                trigger_error("Device must be opened to read it", E_USER_WARNING);  
                return false;  
           }  
   
           if ($this->_os === "linux" || $this->_os === "osx")  
                {  
                // Behavior in OSX isn't to wait for new data to recover, but just grabs what's there!  
                // Doesn't always work perfectly for me in OSX  
                $content = ""; $i = 0;  
   
                if ($count !== 0)  
                {  
                     do {  
                          if ($i > $count) $content .= fread($this->_dHandle, ($count - $i));  
                          else $content .= fread($this->_dHandle, 128);  
                     } while (($i += 128) === strlen($content));  
                }  
                else  
                {  
                     do {  
                          $content .= fread($this->_dHandle, 128);  
                     } while (($i += 128) === strlen($content));  
                }  
   
                return $content;  
           }  
           elseif ($this->_os === "windows")  
           {  
                /* Do nothing : not implented yet */  
           }  
   
           trigger_error("Reading serial port is not implemented for Windows", E_USER_WARNING);  
           return false;  
      }  
   
      /**  
       * Flushes the output buffer  
       * Renamed from flush for osx compat. issues  
       *  
       * @return bool  
       */  
      function serialflush ()  
      {  
           if (!$this->_ckOpened()) return false;  
   
           if (fwrite($this->_dHandle, $this->_buffer) !== false)  
           {  
                $this->_buffer = "";  
                return true;  
           }  
           else  
           {  
                $this->_buffer = "";  
                trigger_error("Error while sending message", E_USER_WARNING);  
                return false;  
           }  
      }  
   
      //  
      // I/O SECTION -- {STOP}  
      //  
   
      //  
      // INTERNAL TOOLKIT -- {START}  
      //  
   
      function _ckOpened()  
      {  
           if ($this->_dState !== SERIAL_DEVICE_OPENED)  
           {  
                trigger_error("Device must be opened", E_USER_WARNING);  
                return false;  
           }  
   
           return true;  
      }  
   
      function _ckClosed()  
      {  
           if ($this->_dState !== SERIAL_DEVICE_CLOSED)  
           {  
                trigger_error("Device must be closed", E_USER_WARNING);  
                return false;  
           }  
   
           return true;  
      }  
   
      function _exec($cmd, &$out = null)  
      {  
           $desc = array(  
                1 => array("pipe", "w"),  
                2 => array("pipe", "w")  
           );  
   
           $proc = proc_open($cmd, $desc, $pipes);  
   
           $ret = stream_get_contents($pipes[1]);  
           $err = stream_get_contents($pipes[2]);  
   
           fclose($pipes[1]);  
           fclose($pipes[2]);  
   
           $retVal = proc_close($proc);  
   
           if (func_num_args() == 2) $out = array($ret, $err);  
           return $retVal;  
      }  
   
      //  
      // INTERNAL TOOLKIT -- {STOP}  
      //  
 }
   
Espero que os sirva de ayuda en vuestros proyectos. Y si os surge alguna duda, dejad un comentario.

Un saludo!
Latest
Next Post

14 comentarios:

  1. Hola, tengo una duda, estoy en windows como pongo el puerto serie? tu pones $serial->deviceSet("/dev/ttyACM0"); , no se que debo poner ahi

    ResponderEliminar
    Respuestas
    1. Hola Emiloi,
      para utilizar la clase en Windows tienes que sustituir "/dev/ttyACM0" por el puerto que quieras utilizar "COM1", "COM2", etc... viene todo explicado en la clase.
      De todas formas recuerda que en Windows solo funciona la comunicación en un sentido, ok? es decir puede enviar, pero no recibir datos.

      Un saludo,
      Ruben.

      Eliminar
  2. hola, excelente aporte
    solo quería preguntar: como sabe la pagina a que dirección ip debe enviar los datos
    es decir donde le especificamos a que computadora debe conectarse para controlar el puerto serial; o solo funciona locamente?
    ojala pudieras contestar, muchas gracias :)

    ResponderEliminar
    Respuestas
    1. Hola Geexbox,
      efectivamente, esta clase es únicamente para la comunicación del servidor con el Arduino a través del puerto serie (USB).

      Si lo que quieres es controlar tu Arduino directamente desde Internet o comunicar tu servidor con tu Arduino a través de TCP/IP. Yo te recomiendo la segunda, es decir, que la interfaz gráfica quede toda en un servidor web, y que este mande las instrucciones al Arduino a través de la web. Para ambas opciones necesitarás es instalar un servidor web en tu Arduino. El procedimiento es bastante sencillo, encontrarás muchísima información en internet. Aquí el primer ejemplo: http://arduino.cc/en/Tutorial/WebServer y aquí algo más avanzado: http://playground.arduino.cc/Code/WebServer

      Yo al final he optado por la segunda opción para mi robot. Ya que la comunicación por USB me limitaba mucho (muy laboriosa con pocas opciones para hacerlo inalámbrico). Así que le monté una tarjeta WIFI y ahora mi servidor en Internet se comunica directamente con mi robot.

      Todo esto lo quiero documentar aquí en el blog, pero de momento estoy muy liado con otros temas. A ver si este invierno saco algo de tiempo y voy actualizando.

      Un saludo,
      Ruben.

      Eliminar
    2. hola que tal.. tengo una duda.. no puedo recibir los datos del puerto serial.. puedo enviar datos.. pero no recibo nada de nada.... ¿podrias ayudarme a diagnosticar el problema!--- por favor... gracias!

      Eliminar
    3. Hola Trebla,
      lo podemos intentar, pero necesito algo más de información.
      - Windows o Linux?
      - En que sentido no te funciona la comunicación? Arduino -> PC ó PC -> Arduino?

      Un saludo,
      Ruben

      Eliminar
  3. Muy buen aporte, la verdad, que estoy muy intensado en comunicar el arduino a un webserver, aunque estoy probando y no consigo que funcione. Tengo un codigo en arduino que con 0, se apaga un LED y con 1 se enciende. Trato de mandar esa información, pero lo único que hace es parpadear el LED. La velocidad de datos es la misma y dese el monitor serial funciona, no se que pasa.

    ResponderEliminar
    Respuestas
    1. Hola Nuño,
      por lo que dices, todo indica que has dado con el mismo problema que tuve yo cuando empecé a comunicarme con la placa.

      En este post explico cual es el problema y como solucionarlo:
      http://ge-rov.blogspot.de/2011/07/desactivando-el-auto-reset-enable-trace.html

      Espero que te ayude. Y ten en cuenta, que cuando lo desactives, te puede dar problemas a la hora de programar la placa. Lo vuelves a activar y listo.

      Un saludo,
      Ruben.

      Eliminar
  4. disculpa una pregunta si solo quiero leer el dato de arduino en mi php, donde cambio el codigo de read

    ResponderEliminar
    Respuestas
    1. Hola Emma,
      especifica un poco más la pregunta. Qué quieres cambiar exactamente? La función readPort() la utilizarás en el mismo archivo en el que has incluido la librería "php_serial.class.php", cada vez que quieras leer el buffer de entrada, en principio no tienes que cambiar nada.

      Dame más detalles sobre el problema que tienes para que te pueda ayudar.

      Un saludo,
      Ruben.

      Eliminar
  5. Buenas noches, disculpa, y como recibo el dato en Arduino para que lo interprete, por ejemplo si quisiera encender o apagar un led, como recibo la informacion que envio de php a lenguaje arduino??

    ResponderEliminar
  6. ya lo hice, resolvi mi primer problema, ahora otra problematica que me surgio es que, yo quiero enviar un dato especifico cuando un sensor pir detecta movimiento, quiero que un archivo php este minitoreando el puerto serial para obtener informacion cuando el sensor envie, como podria hacer eso?
    Espero puedan ayudarme

    ResponderEliminar
    Respuestas
    1. Hola Valentin,
      me alegro de que lo resolvieras.

      Para que quede constancia, por si a alguien más le surge la duda, los datos los recibes en Arduino por el puerto serie, tal y como recibes los datos cuando utilizas el "monitor" de la IDE de Arduino.

      Respecto al segundo problema que planteas. Entiendo que quieres información del Arduino al servidor. Yo no llegué a utilizar esta función, pero según Rémy, el autor de la librería, la función readPort() debería funcionar correctamente sobre servidores linux. Aquí encontrarás todas la información al respecto (http://www.phpclasses.org/package/3679-PHP-Communicate-with-a-serial-port.html), espero que te pueda ayudar en tu proyecto.

      Yo en tu lugar, haría un bucle en el que enviaría un request del Servidor al Arduino, y enviaría una respuesta en función del estado de tu sensor. El principal problema, es que desde PHP tienes que ejecutar manualmente la función "readPort()", no conozco una forma de crear una interrupción para que el Servidor reaccione antes la llegada de datos asíncrona/espontanea.

      Un saludo,
      Ruben.

      Eliminar
  7. Hola buenas, me sale un error, gracias de antemano, mi correo es: geokrakenkirby@gmail.com:

    Fatal error: Array and string offset access syntax with curly braces is no longer supported in C:\xampp\htdocs\htmlcom\php_serial.class.php on line 159

    le dejo un fragmento de donde está localizado esa línea:

    function confParity ($parity) {
    if ($this->_dState !== SERIAL_DEVICE_SET) {
    trigger_error("Unable to set parity : the device is either not set or opened", E_USER_WARNING);
    return false;
    }

    $args = array(
    "none" => "-parenb",
    "odd" => "parenb parodd",
    "even" => "parenb -parodd",
    );

    if (!isset($args[$parity])) {
    trigger_error("Parity mode not supported", E_USER_WARNING);
    return false;
    }

    if ($this->_os === "linux") {
    $ret = $this->_exec("stty -F " . $this->_device . " " . $args[$parity], $out);
    } else {
    $ret = $this->_exec("mode " . $this->_windevice . " PARITY=" . $parity{0}, $out);
    }

    if ($ret === 0) {
    return true;
    }

    trigger_error("Unable to set parity : " . $out[1], E_USER_WARNING);
    return false;
    }

    Uso windows y le puse COM7, ya que ese es el puerto USB de arduino

    ResponderEliminar