Dando continuidade a série Sensor de temperatura, vamos agora visualizar a temperatura via web, resultado final abaixo:
Antes de continuar é recomendado ler os dois primeiros posts sobre Sensor de temperatura caso contrário não irá entender alguns passos, ou não irá funcionar, caso esteja acompanhando a série pule as duas linhas abaixo e prossiga.
O ambiente que estou utilizando é uma maquina virtual Linux Ubuntu com o VirtualBox, e como realizei este post em casa, a porta serial é uma COM do Windows e você terá que “mapear” no VirtualBox caso contrário irá ter problema, escrevi um post sobre como resolver isso Compartilhar porta serial do Windows para o Linux, se não estiver usando maquina virtual apenas prossiga com o post.
Chegando até aqui, imagino que a Parte1 e Parte2 foram compreendidas e implementadas e a porta serial esteja funcionando, seja utilizando uma maquina [virtual,física].
Para acessar nossa página via web e funcione, você precisara de um servidor web com PHP esteja rodando em sua máquina [virtual, física], como antes de escrever essa série eu vi todas as dificuldades e etapas eu fui antecipando os passos, também escrevi um post sobre como instalar um servidor web com PHP em Linux e Windows, segue os links abaixo:
Instalando um servidor web para o Linux
Instalando um servidor web para o Windows
Agora sim, estamos com nosso ambiente pronto e apto para começar. Então primeiramente crie um diretório chamado arduino no /var/www caso esteja utilizando Linux ou C:xampphtdocs caso esteja utilizando Windows, e dentro do diretório arduino crie um arquivo chamado index.php.
Para realizar o passo no Linux:
cleiton@linuxVM:~$ cd /var/www cleiton@linuxVM:/var/www$ sudo mkdir -p arduino && cd arduino cleiton@linuxVM:/var/www/arduino$ touch index.php
Agora utilize qualquer editor para HTML, PHP, CSS e demais no caso de Linux via terminal você pode usar vim ou nano e em ambiente gráfico pode utilizar Bluefish ou Gedit, no Windows pode utilizar notepad++, Bluefish ou qualquer outra ferramenta que você conheça, estarei utilizando vim e Bluefish.
Para comunicar via serial já sabemos que no Windows (COMx) e no Linux(ttySx) sendo x o número da serial, e para comunicar via web? No caso iremos utilizar o PHP para esta tarefa, e para facilitar a vida de todo mundo já tem uma biblioteca diria eu já implementada para esta tarefa, quem escreveu foi Rémy Sanchez, faça download no arquivo em um dos links abaixo, e salve num diretório dentro de arduino chamado includes.
http://www.phpclasses.org/package/3679-PHP-Communicate-with-a-serial-port.html
http://www.geekymedia.com/tech-articles/php-serial-class-for-osx/
https://code.google.com/p/php-serial/
Agora crie outro arquivo chamado porta_serial.php no diretório arduino, e nossa estrutura de arquivos e diretórios deve ficar como abaixo:
cleiton@linuxVM:/var/www/arduino$ tree . |-- includes | `-- php_serial.class.php |-- index.php |-- porta_serial.php 1 directories, 3 files
Abra o arquivo porta_serial.php e cole o código abaixo:
<?php // Exibir erros do PHP na tela //ini_set('display_erros', 1); // Chamando a biblioteca que baixamos, ela ira configurar e comunicar com a serial require("includes/php_serial.class.php"); $serial = new phpSerial(); $serial->deviceSet("/dev/ttyS2"); /* Acima voce configura o seu dev de acordo com a porta COM emulada caso esteja usando uma maquina virtual com Linux, caso contrario é só setar a COM ou /dev/ttyS correspondente Você irá mudar para COMx caso seja Windows ou ttySx no caso de Linux, como eu estou em ambiente virtualizado e no caso é a COM3 então o meu é ttyS2. */ $serial->confBaudRate(9600); //Taxa de transmissao $serial->confParity("none"); //Paridade $serial->confCharacterLength(8); //Comprimento $serial->confStopBits(1); //Bits de paragem $serial->confFlowControl("none");//Controle //Abrindo a conexao $serial->deviceOpen(); //Tempo para comunicar e o arduino estar pronto sleep(2); //Enviar $serial->sendMessage("t"); // Tempo de espera para recever dados da Serial sleep(1); //$serial->flush(); global $ler_serial; $ler_serial = $serial->readPort(); //Fechando a conexao $serial->deviceClose(); /* Autor da lib que importo para comunicar PHP com Serial Rémy Sanchez <[email protected]> */ ?>
Você deve copiar este código e colar, alterando apenas o valor na linha 11 $serial—>deviceSet(“/dev/ttyS2”), leia os comentários que expliquei o máximo possível.
E a sacadinha esta $serial->sendMessage(“t”), que envia nosso carácter “t” que programamos no firmware do Arduino e em $ler_serial = $serial->readPort(), quando capturo a resposta do Arduino, sendo $ler_serial uma variável global do PHP que eu posso acessar de outro .php que incluir este arquivo, que é que vamos ver no próximo passo.
Agora edite o index.php e copie e cole código abaixo:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="description" content="Pagina Web Temp com Arduino de Cleiton Bueno" /> </head> <body> <center><h1>Arduino WebTemp 2013 - Cleiton Bueno</h1></center> <br><br> <?php // Importando arquivo que realizar configuração e consulta da porta serial require("porta_serial.php"); // Habilitando erros do PHP no navegador //ini_set('display_erros', 1); $temperatura = trim($ler_serial); echo "<br>Temperatura atual: ".$temperatura; ?> </body> </html>
O código PHP é o que esta entre <?php ?> o resto é HTML, e olha temos pouquíssimas linhas, nos comentários expliquei o passo a passo única observação é o trim(), no caso ele remove espaços antes e depois do valor, é útil vai por mim, iremos usar no próximo post mas já adiantei aqui. Agora abra um navegador no seu computador ou em alguma maquina da rede e coloque http://127.0.0.1/arduino caso esteja executando local ou http://192.168.0.90/arduino para acessar via rede ou de uma maquina virtual como é o meu caso, lembre de mudar o IP 192.168.0.90 para o da sua maquina virtual ou da maquina que esta rodando o servidor web.
Problema
Foi quando testando em outra VM Linux minha, no caso Mint 14 a seguinte pagina abriu sem nenhum erro reportado: Cadê a temperatura? Pois é também assustei, como estou utilizando Linux, pensei bom vou executar o index.php direto no terminal e ver o que reporta no shell.
cleiton@linuxVM:/var/www/arduino$ php index.php <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="description" content="Pagina Web Temp com Arduino de Cleiton Bueno" /> </head> <body> <center><h1>Arduino WebTemp 2013 - Cleiton Bueno</h1></center> <br><br> <br>Temperatura atual: 21.99 </body> </html> cleiton@linuxVM:/var/www/arduino$
E para minha surpresa a temperatura é exibida, bom então esta funcionando, e porque via web não funciona?!?
Analisando o log do apache2 olha o que é reportando quando tento acessar:
cleiton@linuxVM:/var/www/arduino$ tail -f /var/log/apache2/error.log PHP Warning: Specified serial port is not valid in /var/www/arduino/includes/php_serial.class.php on line 111 PHP Warning: Unable to set the baud rate : the device is either not set or opened in /var/www/arduino/includes/php_serial.class.php on line 204 PHP Warning: Unable to set parity : the device is either not set or opened in /var/www/arduino/includes/php_serial.class.php on line 254 PHP Warning: Unable to set length of a character : the device is either not set or opened in /var/www/arduino/includes/php_serial.class.php on line 298 PHP Warning: Unable to set the length of a stop bit : the device is either not set or opened in /var/www/arduino/includes/php_serial.class.php on line 335 PHP Warning: Unable to set flow control mode : the device is either not set or opened in /var/www/arduino/includes/php_serial.class.php on line 376 PHP Warning: The device must be set before to be open in /var/www/arduino/includes/php_serial.class.php on line 137 PHP Warning: Device must be opened in /var/www/arduino/includes/php_serial.class.php on line 541 PHP Warning: Device must be opened to read it in /var/www/arduino/includes/php_serial.class.php on line 474
Resumindo, não vou explicar detalhadamente senão este post vai ficar enorme, mas no popular pelo erro esta dizendo que não ter permissão, porque não consegue ler, e é exatamente isso via web o usuário que tenta fazer todo o acesso e execução é o www-data usuário/grupo do apache, e no /dev/ttyS2 www-data não tem acesso para ler quanto menos gravar.
Então com já passei por isso quando estava escrevendo um script para VoIP eu sabia resolver, foi adicionar o usuário www-date ao grupo dialout do Linux, segue o passo abaixo:
cleiton@linuxVM:/var/www/arduino$ ls -l /dev/ttyS2 crw-rw---- 1 root dialout 4, 66 Mar 29 18:45 /dev/ttyS2 cleiton@linuxVM:/var/www/arduino$ cat /etc/group | grep dialout dialout:x:20:cleiton cleiton@linuxVM:/var/www/arduino$ sudo usermod -a -G dialout www-data
Solucionado este problema nosso acesso via web esta pronto, e você irá obter a temperatura através da web utilizando o Arduino, agora um pouco que “perfumaria” utilizando CSS conseguimos deixar nossa pagina um poucos melhorzinha e com alguns recursos amais, como nas imagens abaixo:
Para baixar todos os arquivos do sistema web, clique aqui.
Arduino – Sensor de temperatura Parte4 [Correção de leitura da serial no Windows]
Até a próxima!
Arduino – Sensor de temperatura Parte3 by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.