Go Down

Topic: Arduino + EthernetShield + PHP + WebClient (Read 6 times) previous topic - next topic

carmolim

Olá...

Eu estou iniciando um novo projeto e tenho uma dúvida.
O que eu gostaria de fazer é o seguinte:

Arduino + EthernetShield + sensores

Quero acessar o IP do arduino e ver o estado dos sensores em uma página HTML gerada por ele,  quando o houver uma mudança de estado, de LOW para HIGH, por exemplo gostaria de enviar, pelo arduino, uma variável para um arquivo php, através de um GET ou um POST.

Pelo que pesquisei até agora, não é possível ter um webclient e enviar uma variável usando GET, mas gostaria de ter certeza.

Obrigado!

carmolim


MarceloBoeira

Eu recomendo fazer justamente ao contrário, não sei qual o seu propósito com o sistema, ...

Mas pense que o melhor, na minha opnião é deixar o mínimo de processamento possível pro arduino. Se eu fosse ler sensores, eu faria todo PHP na minha máquina mesmo, no notebook ou desktop, e o arduino só manda estas informações para o computador via GET.

http://192.168.0.10/arduino/sensores/temperatura/17/  -> Arduino acessa esta url, sendo o 17 o valor da temperatura, mas podes passar por post em casos de informações grandes...

Enfim, tanto você vai ter uma linguagem de 'back-end' com o PHP, na sua máquina, que vai te dar suporte a mais performance e também e banco de dados, o que na maioria dos casos é recomendado, se você quer armazenar os dados por uma semana, pra criar uma média e tal...

Se tiver alguma dúvida na implementação não exite em perguntar :)
My Toys:
Raspberry Pi (Model B)
Arduino MEGA 1280: ( Shield LCD 16x2, Ethernet, RFID )
Freescale Kinetis KL25Z [/

carmolim

concordo com você, acredito que vou acabar fazendo dessa forma mesmo, eu já consigo mandar variáveis via POST e GET para páginas PHP...
o que eu não sei como vou fazer é para mandar variáveis para o arduino, da para fazer isso usando o PHP?
vou ter que criar um protocolo de comunicação para o arduino receber essas variáveis pela query né?
eu não tenho muitas informações, estou muito no achismo ainda...

obrigado pela sugestão!

MarceloBoeira

Eu já fiz isso, mas ao contrário, ao invés de enviar variáveis para o arduino, eu faço o arduino buscar as variaveis...

Pense que você tem um banco de dados, e no banco de um registro para o LED13 e uma boolean de estado para ver se ele esta ligado ou desligado, dai de X em X segundos o arduino acessa uma URL que vai devolver ao invés de HTML, JSON, com as infos do LED...

Se não esta familiarizado ainda com padrão JSON da uma olhada:
http://www.brnsouza.com/blog/index.php/2009/05/o-que-e-json-como-e-quando-usar/
http://www.tidbits.com.br/o-que-e-json-como-e-quando-utilizar

E para arduino tem que usar uma LIB:
http://interactive-matter.eu/how-to/ajson-arduino-json-library/
http://www.arduinopassion.com/parsing-json-in-arduino/
http://hardwarefun.com/tutorials/parsing-json-in-arduino
https://code.google.com/p/arduino-json/

Dai então tipo o arduino acessaria: http://192.168.0.10/arduino/pino/13 -> sendo que 13 é onde esta seu led, poodes fazer isso de várias formas...

Dai ele vai devolver
{status:1}

Dai você pega no arduino o valor do índice status e seta como valor do led, podes fazer por segurânça uma validação também ...

OBS: Eu cito JSON mas você pode criar seu próprio protocolo, ou passar no padrão XML, no padrão INI ...
Eu gosto de JSON por ser compacto e já ser implementado tanto em PHP quanto pro Arduino...

Não sei se deu pra entender, mas o arduino é sempre cliente, ele BUSCA as infos no seu PC, e não o PC que manda as infos pro arduino...
My Toys:
Raspberry Pi (Model B)
Arduino MEGA 1280: ( Shield LCD 16x2, Ethernet, RFID )
Freescale Kinetis KL25Z [/

carmolim

Muito obrigado MarceloBoeira!

Eu tenho um pouco de conhecimento JSON, o que estava me faltando mesmo é como funciona a comunicação com o arduino, você falou uma coisa que foi muito esclarecedora...


o arduino é sempre cliente, ele BUSCA as infos no seu PC, e não o PC que manda as infos pro arduino...


agora se eu entendi essa página que o arduino acessaria http://192.168.0.10/arduino/pino/13 estaria no servidor PHP certo?
seria tipo uma REST API? o arquivo faria uma requisição no banco de dados verificaria o estado do pino e retornaria o estado formatado em JSON, correto?
só para ver se eu entendi mesmo...

como eu faria esse arquivo PHP?

MarceloBoeira

Exato, eu explicando aqui pensando que tu não conhecia, ahha... mas é isso mesmo, é como se teu PC fosse um servidor que teria todos os dados do arduino, pensando grande poderias ter até mais de um arduino, mas isso é história pra outra hora.

Antes de partir pro código, teu projeto é de que magnitude? pois dependendo seria interessante usar um framework PHP se for algo que tenha que ser seguro, e que tenha bastante desenvolvimento, mas caso contrário, procure uma classe na internet para conexão com banco, ou use PDO que é mais recomendado até,...
http://objota.com.br/web/php/classe-de-conexao-com-php-utilizando-pdo.html

Eu recomendaria, se você pretende aprender PHP usar um Framework, pois eles ja tem componentes ótimos e seguros pra isso, eu uso Zend Framework, mas para projetos pesados e grandes, caso queira começar com algo simples tem o CakePHP que é interessante, já te da uma base legal...

Você pegou bem o conceito,

Por GET ficaria tipo http://seuservidorweb/arduino/verificaLed.php?pino=13
O arduino faria request como se estivesse acessando site, com parametro o pino do led, e poderia receber os pinos,...


Dai você cria uma página
http://seuservidorweb/arduino/interfaceLed.php
com interface, botões onde você mesmo troca os pinos, com 2 botões e um input, tipo LIGA, DESLIGA Pino: 13 e o script reconhece o Pino gravando no banco o pino e o estado.

Se estiver fazendo algo experimental, podes fazer assim bem 'gambiarra', mas se for fazer algo profissional, seria interessante aprofundar seus conhecimentos com algum framework, e se for pode me procurar, terei prazer em lhe ajudar :)

My Toys:
Raspberry Pi (Model B)
Arduino MEGA 1280: ( Shield LCD 16x2, Ethernet, RFID )
Freescale Kinetis KL25Z [/

carmolim

as coisas estão fazendo cada vez mais sentido...

não sei ainda de que magnitude será o projeto, mas é um projeto pessoal, o fato é que eu sou só um curioso, amante de tecnologia hahaha... eu tenho conhecimento básico de PHP mas nunca trabalhei com nenhum framework, já vi alguns tutoriais do CakePHP, mas vi que ia demandar muito tempo para aprender e infelizmente não tenho tanto tempo para dedicar aos meus projetos...

eu já tive centenas de ideias para esse projeto, e esse é um problema, as vezes fico pensando muito e fazendo pouco... agora estou querendo andar com passos curtos, aos poucos...
eu vou dar uma pensada aqui em que rumo seguir... mas muito obrigado pela ajuda!!

acabei de ver que vc deu um star no meu projeto do cycloduino valeu!!

MarceloBoeira


as vezes fico pensando muito e fazendo pouco... agora estou querendo andar com passos curtos, aos poucos...
eu vou dar uma pensada aqui em que rumo seguir...



Eu estava assim,  e pior eu estava bem desmotivado ultimamente com meus projetos, justamente pelo tempo, mas comecei a usar o https://todoist.com ...
Não é propagando, tanto que eu uso o gratuito e nem sei quem desenvolveu, mas nele você cria tarefas e depois ele avisa por e-mail, eu estou criando e organizando as minhas tarefas lá e fazendo realmente algo, tipo pelo menos 1 tarefa grande por semana e 1 pequena a cada 2 dias... algo assim,...

As vezes falta só este lembrete, quando sobra um tempinho dai é só fazer ...

Recomendo :)
My Toys:
Raspberry Pi (Model B)
Arduino MEGA 1280: ( Shield LCD 16x2, Ethernet, RFID )
Freescale Kinetis KL25Z [/

carmolim

eu uso o Asana, eu uso ele no trabalho também, daí consigo deixar tudo centralizado...

tive um bom avanço hoje, uma dúvida que surgiu foi quanto a frequência que arduino vai procurar os valores...
eu queria ter uma frequência de no mínimo 1Hz, mas como a cada requisição é envolve uma ou mais queries no MySQL não sei se seria viável com uma frequência mais alta tipo 10Hz ou 20Hz, outro agravante é que o servidor não será local...

como posso solucionar isso?

carmolim

dei uma pesquisada e achei uma solução que seria usar o cURL do PHP para enviar um POST para o arduino, dessa forma o arduino não precisa ler o banco de dados a cada x segundos, quando eu fizer alguma alteração eu envio a informação para o bando de dados e um POST para o arduino... o que acha?

MarceloBoeira

Se quiser criar um protocolo de comunicação, para que eles conversem olhe este tópico: http://forum.arduino.cc/index.php?topic=167106.0#msg1246811
Estou a tentar tirar uma dúvida, na criação de um mini protocolo de comunicação entre o arduino e algum outro dispositivo, onde um envia um dado e o outro responde...

No caso do PHP eu não indicaria, vamos supor que algum dia você deseje que seu projeto vire "web", dai você vai ter que reprogramar, pois seu servidor web não vai poder ficar fazendo requests no arduino, entende? pois o seu arduino não vai ter um IP na internet, como ele tem na rede local... na minha opinião o melhor é deixar o arduino sempre como clientes nestes casos, ...
My Toys:
Raspberry Pi (Model B)
Arduino MEGA 1280: ( Shield LCD 16x2, Ethernet, RFID )
Freescale Kinetis KL25Z [/

carmolim

entendo, e em relação à frequência dos requests? tem alguma opnião a respeito?

outra coisa que pensei agora, é de utilizar uma porta diferente para o arduino, dessa forma eu posso usar o roteador para direcionar os requests feitos para essa porta direto para o arduino, eu já uso o no-ip para ter um endereço que aponta para o meu ip do modem, acho que isso funcionaria não?

MarceloBoeira

#13
May 20, 2013, 09:02 pm Last Edit: May 20, 2013, 09:04 pm by MarceloBoeira Reason: 1
Quote
entendo, e em relação à frequência dos requests? tem alguma opnião a respeito?

Dependendo da aplicação é um problema, mas teria que ser muito alto, se for pensar é mais fácil engasgar o arduino do que um sv web que teoricamente esperar diversas requests.

O que você poderia fazer para melhorar a performance era uma fila de processamento, caso haja comunicação com o banco,
você pode gravar em um arduino cada comando a ser executado para o 'insert' e depois de 100 requests finalmente junta todas os comandos e insere de uma vez só diminuindo processamento do banco.

Por exemplo:
O arduino envia a temperatura, então teriamos em cada request uma inserção da temperatura e o datetime daquele exato momento:
O que o arduino 1 vez por segundo envia na sequencia:
1 - temperatura:20 e Datetime:2013-05-20-10-10-01
2 - temperatura:21 e Datetime:2013-05-20-10-10-02
3 - temperatura:19 e Datetime:2013-05-20-10-10-03
10 - temperatura:20 e Datetime:2013-05-20-10-10-10

Dai você vai jogando em um arquivo:
INSERT INTO temperatura(valor, datetime) VALUES
(20,'2013-05-20-10-10-01'), /* request 1 do arduino
(21,'2013-05-20-10-10-02'), /* request 2 do arduino
(19,'2013-05-20-10-10-03'), /* request 3 do arduino
(20,'2013-05-20-10-10-10'); /* request 10 do arduino

Dai você na request '10' vai pegar o comando inteiro do arquivo que você criou e executar.

Desta forma ao invés de executar 1 comando no banco por request, você só executa 10 comandos a cada 10 requests.

Outra forma é fazer o cache destes comandos no arduino, eliminando as requests.
O arduino grava em uma variavel, de preferencia um array, estas 10 informações, a temperatura e datetime, e depois de 10 segundos ele faz uma só request enviando todos estes dados,
dai você elimina os comandos exagerados e as requests, mas não perde a precisão.


Quote
outra coisa que pensei agora, é de utilizar uma porta diferente para o arduino, dessa forma eu posso usar o roteador para direcionar os requests feitos para essa porta direto para o arduino, eu já uso o no-ip para ter um endereço que aponta para o meu ip do modem, acho que isso funcionaria não?

Pode sim, funciona, claro que você  vai depender do no-ip, e tudo mais, ...
O melhor de tudo é se você tem um domínio próprio, você pode fazer o seu domínio apontar para o no-ip.com que vai apontar para o seu IP dinâmico, eu até pouco tempo atrás tinha: http://arduino.marceloboeira.com -> apontava para o IP do meu PC que estava hosteando e intermediando as conexões com arduino...
My Toys:
Raspberry Pi (Model B)
Arduino MEGA 1280: ( Shield LCD 16x2, Ethernet, RFID )
Freescale Kinetis KL25Z [/

carmolim

bem interessante a solução da fila com a fila...

acho que está dificultando um pouco é que eu não falei o que eu estou fazendo... hahahaha...
basicamente é um sistema de alarme, mas estou fazendo de forma genérica para que possa utilizar depois para fazer algumas automações...
mas agora para começar eu já tenho instalado 8 sensores de movimento, e quero instalar pelo menos dois sensores de temperatura, um interno e outro externo...

eu fiz uma página usando jquery mobile para ligar, desligar, configurar zonas, ligar e desligar sensores individuais, que depois pode ser utilizado para lâmpadas, tomadas, etc... essa página envia via AJAX as configurações do sistema para uma página PHP que recebe os dados e faz as atualizações devidas no banco de dados....

o arduino apenas vai mandar a leitura dos sensores de temperatura, não precisa de uma frequência muito grande, acho que de 5 em 5 minutos já está bom, e quando o sensor de movimento, que estiver ligado, detectar algo ele envia para outra a página PHP que vai adicionar o evento em um log e me envia uma notificações para o celular utilizando o http://boxcar.io que é bem interessante...

o que eu estava pensando é o seguinte... quando o alarme está desligado eu não preciso fazer nenhuma verificação no banco de dados para ver se o alarme está ligado ou não, o arduino só iria mandar as temperaturas...

quando eu ligasse o alarme, via web ele envia um HTTP POST via cURL, dessa forma eu ligo o alarme imediatamente, e depois as configurações das zonas, sensores e etc eu também poderia enviar um POST assim ele não precisa ficar fazendo milhares de requests em quanto tiver armado ou desarmado...

por isso acho que faz mais sentido fazer dessa forma... o que você acha? agora que eu expliquei o que estou fazendo... hahaha...

Go Up