Arduino – Sensor de temperatura Parte3

Dando continuidade a série Sensor de temperatura, vamos agora visualizar a temperatura via web, resultado final abaixo:

PaginaArduinoWebTempCustomizada01

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.

Sensor de temperatura Parte1

Sensor de temperatura Parte2

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. PaginaArduinoWebTempBasica

Problema

Foi quando testando em outra VM Linux minha, no caso Mint 14 a seguinte pagina abriu sem nenhum erro reportado: PaginaArduinoWebTempBasicaProblema 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:

PaginaArduinoWebTempCustomizada01

PaginaArduinoWebTempCustomizada02

PaginaArduinoWebTempCustomizada03
.

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!

Share Button

CC BY-NC-SA 4.0 Arduino – Sensor de temperatura Parte3 by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.