Arduino Ethernet – Pushing data to a (PHP) server

In a previous article, I demonstrated how to use “Data Pull” to read sensor data over a computer network using an Arduino ENC28J60 Ethernet shield/module and some sensors (DS18B20 for example). In this article we will do the opposite: Data Push. This means that we will make the Arduino send data to our server, which stored the results in a database. For this we will use an Apache, MySQL and PHP setup, which can be a full-size web-server or an easy to install “WAMPServer” setup on your desktop or laptop computer. Some basic experience with PHP and web-servers will be helpful when working your way through this article.

Fonte e mais detalhes aqui

GoGo Board: Leitura de Sensor em PHP – III

Para que a programação apresentada anteriormente funcione no Windows, será necessário acrescentar o seguinte código:

exec("mode com1: BAUD=9600 PARITY=N data=8 stop=1 xon=off");

…de maneira que seja antes da conexão ou abertura da porta, ou seja:

// Conecta na porta
exec("mode com1: BAUD=9600 PARITY=N data=8 stop=1 xon=off");
$port = fopen("COM1", "w+");

Desta forma não será necessária a abertura e execução do GoGo Monitor para a programação funcione conforme o esperado.

GoGo Board: Leitura de Sensor em PHP – II

Notamos que nos sistemas operacionais mais recentes, como Windows 7 e outros, o código apresentado anteriormente poderá não funcionar corretamente, causando erro de comunicação ou com o serviço utilizado para que o php seja executado.

Por algum motivo desconhecido, o GoGo Monitor deverá ser instalado no computador e utilizado uma primeira vez para teste da placa. Depois poderá ser fechado e o código em php passará a funcionar conforme o esperado.

Gogo Board + PHP: Socket

Abaixo temos um exemplo de código para realizar uma conexão socket em php ao Gogo Monitor. Aqui usamos o comando beep, porém outros comandos estão disponíveis, vide o manual do protocolo.


<?php

$socket = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($socket, "127.0.0.1");
socket_connect($socket, "127.0.0.1", 9873);

$msg = "beep";

$sock_data = socket_write($socket, $msg, strlen($msg));

$res = "Data sended with response $sock_data.";

echo $res;

?>

Gogo Board + Php + Qr Code: Beep – III


Sempre utilizamos como referência o comando beep da placa Gogo, porém, vale lembrar que há uma dezena de funções que podem ser acessadas, dependendo da versão do firmware, protocolo e componente de controle (dll, ocx).

Pensado na automação residencial, não só podemos imaginar, um espécie de código qr em cada ambiente que estivermos, assim controlando cada um em particular, como, através de cada smartfone, o ambiente pode assumir determinado comportamento ou perfil, de acordo com as preferências pessoais dos usuários.

Foto: http://upload.wikimedia.org/

Gogo Board + Php + Qr Code: Beep – II

Após a criação de um código qr, com o exemplo acima, bastará apontar a câmera do smartfone e a função programada será executada, neste caso, abrirá um site com o código php responsável pelo beep.

Foto: http://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Link_pra_pagina_principal_da_Wikipedia-PT_em_codigo_QR_b.svg/280px-Link_pra_pagina_principal_da_Wikipedia-PT_em_codigo_QR_b.svg.png

Gogo Board + Php + Qr Code: Beep

Antes de falarmos sobre intereções por meio de smartfones, uso na domótica, automação em geral, etc, vamos fazer a seguinte experiência, usando conceitos já abordados aqui e outros novos.

Já experimentamos o controle através da linguagem php, tanto, utilizando computador, ou mesmo smart tvs. Agora utilizaremos smartfones, não apenas para acessar uma página em php, mas criaremos formas diferentes de iniciar este processo.

Neste primeiro exemplo, utilizaremos um código qr criado através de programas geradores de qr, como o Gerador de QR Code, que apontará para uma página em php, a qual fará com que a placa emita um bip.

Gogo Board + Php: Leituras

Com base neste artigo, podemos ler os dados enviados pela porta usb que a placa retornará, de acordo com a função que necessitarmos. Exemplo: Ler sensor 1.

<?php
/**
* Arduino + PHP
*
* @author Bruno Soares
* @website www.bsoares.com.br
*/

// Conecta na porta

$port = fopen("COM3", "w+");

// Em alguns casos a Arduino pode reiniciar, por isso
// é bom esperar para enviar informação depois de conectar
//sleep(2);

// Envia "1" para o programa na Arduino saber que deve responder

fwrite($port, chr(84));
fwrite($port, chr(254));
fwrite($port, chr(32));
fwrite($port, chr(0));

// Espera para que o dado enviado pelo PHP chegue até a Arduino
sleep(1);

// Agora que a Arduino "Provavelmente já respondeu", pega
// o valor da resposta
//echo fgets($port);
echo bin2hex(fgets($port));

// Fecha a conexão com a porta
fclose($port);
?>

Algumas modificações foram feitas para que o código seja compatível com Windows, além de retornar os dados no formato hexadecimal. Estão assinaladas em vermelho.

Os valores retornados ainda estão “brutos”, ou seja, ainda precisam ser trabalhados para que tenhamos o valor real do sensor.

Gogo Real + PHP + Apache: Beep

Em tempos de smartphones, smart tv, surgiu a ideia de colocar uma placa Gogo na internet e acessa-la através dos mais variados dispositivos.

Indo um pouco além deste post, e explorando a classe php serial, criada por Rémy Sanchez , podemos enviar dados para a placa remotamente. A classe se chama “php_serial.class.php” e foi obtida aqui.

Ao baixa-la e descompacta-la na raiz do servidor web, basta abrir seu navegador e clicar nos links existentes.

Nos testes, usamos o “Usb Webserver 8” em um Windows 7. Lembrando que será preciso cuidados na configuração do firewall e roteador de internet, caso os utilize e alterar a página em php com a classe acima, o que abordaremos em outro momento.

Gogo Real + Php: Beep

Este exemplo se refere ao código Php usado em um sistema operacional Linux.

A diferença esta na nomenclatura da porta, que ao contrário do Windows, geralmente chamadas “COM”, no Linux acabam sendo atribuídas com prefixo “TTY”. Já o sufixo, neste caso, o “ACM0”, indica ser uma porta USB e não serial.

Segue o código:

<?php

$fp = fopen("/dev/ttyACM0", "w");

fwrite($fp, chr(84));
fwrite($fp, chr(254));
fwrite($fp, chr(196));
fwrite($fp, chr(0));
fwrite($fp, chr(13));
fwrite($fp, chr(10));

fclose($fp);

?>

Para executa-lo, você precisa ter instalado o Php.