Lendo dados do arduino com PHP

1,452 views
Skip to first unread message

Carlos Felipe Ribeiro Maradeia

unread,
Apr 16, 2014, 11:10:20 PM4/16/14
to ardu...@googlegroups.com
Pessoal boa tarde.
Estou desenvolvendo um sistema com Arduino + PHP conectado a um laptop via USB.
Para enviar dados via porta serial para o Arduino está funcionando perfeitamente.
Consigo disparar algumas ações pelo Browser.
Agora não consigo ler dados dessa conexão serial.
O browser faz a requisição e fica aguardando resposta infinitamente.

Seguem os códigos de teste.

== PHP ==
exec("mode com4: BAUD=9600 PARITY=N data=8 stop=1 xon=off");
$porta = fopen("COM4", "w+");
sleep(1);   
fwrite($porta, "a");
sleep(1);
$conteudo = fread($porta, 128);
fclose($porta);
var_dump($conteudo);

== ARDUINO ==
int ledPin13 = 13;
char caracter = 'a';
char varRead;

void setup(){
  Serial.begin(9600);
  Serial.flush();
  pinMode(ledPin13, OUTPUT);
}

void loop(){ 
  if(Serial.available() > 0){
 
    varRead = Serial.read();
   
    if(varRead != caracter){
      caracter = varRead;
    }
   
    //se pressionado "a" liga o led 13
    if(caracter == 'a'){
      digitalWrite(ledPin13, HIGH);
      Serial.print("1");
    }
    else{
      digitalWrite(ledPin13, LOW);
      Serial.print("0");
    }
  }
  delay(1000);
}


--
Carlos Felipe Ribeiro Maradeia
Analista de sistemas, desenvolvedor web e curioso.
Visite http://www.carlos.felipe.nom.br

Marcus Diogo

unread,
Apr 17, 2014, 4:06:26 PM4/17/14
to ardu...@googlegroups.com

Da um print no var para saber o que ta chegando pela serial.

--
Você recebeu essa mensagem porque está inscrito no grupo quot;ArduInRio" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para arduinrio+...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Carlos Felipe Ribeiro Maradeia

unread,
Apr 17, 2014, 4:21:07 PM4/17/14
to ardu...@googlegroups.com
Marcus. Não sei se vou conseguir explicar o problema, mas vou tentar.

Em algumas requisições, funciona.
Mas depois de uns 3 refresh o browser fica "pensando" pois o servidor o web não retorna.
Quando vou tentar abrir o Serial Monitor no arduino ele diz que a porta está sendo usada.

Como se o PHP tivesse Lockando a porta serial tentando ler e o arduino não tivesse mandando.

O código está bem simples, apenas para efeito de teste.

Oscar Marques

unread,
Apr 17, 2014, 8:21:59 PM4/17/14
to ardu...@googlegroups.com

Carlos Felipe Ribeiro Maradeia

unread,
Apr 17, 2014, 10:00:03 PM4/17/14
to ardu...@googlegroups.com
Então Oscar, encontrei um tutorial baseado nesse climaduino.
Mas a solução dada não funcionou.

Renato Martins

unread,
Apr 18, 2014, 9:11:24 AM4/18/14
to ardu...@googlegroups.com
Você quer ler informações vindas do arduino ?
que tal gravar em um banco de dados e depois ler ?

Carlos Felipe Ribeiro Maradeia

unread,
Apr 18, 2014, 3:44:49 PM4/18/14
to ardu...@googlegroups.com
Renato, eu teria que ter um sistema em JAVA, por exemplo, rodando no servidor web para capturar as infos do arduino e depois salva-las em um SGBD.
Para somente depois ler com PHP o BD. Essa solução eu tinha pensado caso não conseguisse fazer direto com o PHP. O problema que isso é um projeto final e mudaria toda documentação já pronta além de inserir uma complexidade maior pois teria mais uma APP no meio da jogada.
O problema é: funcionar, funciona. Mas não ta 100%.

Eduardo Gonçalves

unread,
Apr 18, 2014, 9:54:45 PM4/18/14
to ardu...@googlegroups.com

-Ja experimentou outros modos de abertura da porta? Esta usando o w+, talvez tenha outro que neste caso tenha um comportamento melhor.

- Ja tentou aumentar o tempo de espera pra receber a resposta, ou entao criar um loop do lado do servidor web de modo q ele so escreva novamente depois q ele receber a informacao.

- Outra opcao e nao ficar abrindo e fechando a conexao para cada requisicao. Ou tenta pelo menos verificar se o php esta conseguindo fechar as conexoes em todas as requisicoes.

Sao apenas tentativas que estou sugerindo, pois pesquisei aqui e nao encontrei nada especifico como mencionou.

Eduardo Gonçalves

unread,
Apr 18, 2014, 9:54:45 PM4/18/14
to ardu...@googlegroups.com

Mais uma sugestao que me ocorreu. Teste em outra maquina tambem e em outras portas usb.

Carlos Felipe Ribeiro Maradeia

unread,
Apr 18, 2014, 10:08:59 PM4/18/14
to ardu...@googlegroups.com
Eduardo. Boas ideias.

-Ja experimentou outros modos de abertura da porta? Esta usando o w+, talvez tenha outro que neste caso tenha um comportamento melhor.

Vou testar.

- Ja tentou aumentar o tempo de espera pra receber a resposta, ou entao criar um loop do lado do servidor web de modo q ele so escreva novamente depois q ele receber a informacao.

Já coloquei um sleep() no código entre o envio de parametro do php e recebimendo de parametro.

- Outra opcao e nao ficar abrindo e fechando a conexao para cada requisicao. Ou tenta pelo menos verificar se o php esta conseguindo fechar as conexoes em todas as requisicoes.

Como consigo testar pra saber de fato se a conexão foi fechada? dou o comando de fechar e depois tento usa-la ? ou tem alguma forma melhor para  testar?
Quanto não fechar as conexões, já li em algum lugar que de tempos em tempos o SO, ao notar que a conexão está inativa automaticamente  fecha-a.

- Teste em outra maquina também e em outras portas usb.
Vou testar em outras portas, já que em outra maquina não tenho como.

Carlos Felipe Ribeiro Maradeia

unread,
Apr 20, 2014, 10:22:43 PM4/20/14
to ardu...@googlegroups.com
Já não sei mais oq pode ser.
No serial monitor funciona perfeitamente.
Ao colocar o PHP na jogada parece que a cada Request o arduino é resetado.
É um problema bem dificil de descrever que não to conseguindo uma luz no fim do tunel.

Já utilizei a class php-serial, que é recomendada em muito sites sobre o assunto. Tambem não funcionou.

Romano Silva

unread,
Apr 21, 2014, 11:16:17 AM4/21/14
to arduinrio
Carlos,

você está fazendo uma escrita e uma leitura síncronamente.

Possivelmente o arduino está respondendo mais rápido do que o seu PHP está executando o fread().

Faz um sleep() no arduino antes de dar um Serial.print

Grande abraço,
Romano

Carlos Felipe Ribeiro Maradeia

unread,
Apr 21, 2014, 12:35:18 PM4/21/14
to ardu...@googlegroups.com
Romano.
Já estou fazendo isso. Mas o problema não deve ser esse. Pois acontece a requisição e o navegador fica aguardando o retorno infinitamente.
Durante esse tempo de "aguardo", se eu for na IDE do arduino e tentar abrir o serial monitor ele da um erro dizendo que a porta está sendo usada. Então isso significa q o php está "alocando" o recurso, não esta terminando o processamento por algum motivo misterioso.

Como disse anteriormente, fazendo teste do código do arduino no serial monitor funciona perfeito.



Carlos Felipe Ribeiro Maradeia

unread,
Apr 21, 2014, 1:05:11 PM4/21/14
to ardu...@googlegroups.com
Depois de alguns teste acho que descobri alguma coisa.
Esse travamento ocorre sempre q não fecho a conexão. Só que se eu fechar a conexão parece que o arduino "reseta", reiiniciando meu código (do arduino).
Não sei se consegui ser claro.

Carlos Felipe Ribeiro Maradeia

unread,
Apr 21, 2014, 3:03:19 PM4/21/14
to ardu...@googlegroups.com
Bom pessoal. Desisti de usar USB. Não funciona de modo algum.

To partindo para usar um Shield Ethernet (HanRun HR911102A v1.1), mas também não estou obtendo sucesso.
To bem desesperado, pois tenho menos de 1 mês para finalizar meu projeto final da faculdade. Já está rolando um desanimo.
Não consigo pingar, nem acessar via browser.

O código que estou usando de base para testar o shield é esse:

#include <SPI.h>
#include <Ethernet.h>
 
// Entre com os dados do MAC e ip para o dispositivo.
// Lembre-se que o ip depende de sua rede local
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,10);
 
// Inicializando a biblioteca Ehternet
// 80 é a porta que será usada. (padrão http)
EthernetServer server(80);
 
void setup() {
 // Abrindo a comunicação serial para monitoramento.
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
 
  // Inicia a conexão Ethernet e o servidor:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("Servidor iniciado em: ");
  Serial.println(Ethernet.localIP());
}
 
void loop() {
  // Aguardando novos clientes;
  EthernetClient client = server.available();
  if (client) {
    Serial.println("Novo Cliente");
    // Uma solicitação http termina com uma linha em branco
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // Se tiver chegado ao fim da linha (recebeu um novo
        // Caractere) e a linha estiver em branco, o pedido http terminou,
        // Para que você possa enviar uma resposta
        if (c == '\n' && currentLineIsBlank) {
          // Envia um cabeçalho de resposta HTTP padrão
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // a conexão será fechada após a conclusão da resposta
          client.println("Refresh: 5");  // atualizar a página automaticamente a cada 5 segundos
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html><body>teste</body></html>");
          break;
        }
        if (c == '\n') {
          // Você está começando uma nova linha
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // Você recebeu um caracter na linha atual.
          currentLineIsBlank = false;
        }
      }
    }
    // Dar tempo ao navegador para receber os dados
    delay(1);
    // Fecha a conexão:
    client.stop();
    Serial.println("Cliente desconectado");
  }
}

Reply all
Reply to author
Forward
0 new messages