Go Down

Topic: Problemas com Arduino + PHP (Read 2312 times) previous topic - next topic

mctimbu

Estou desenvolvendo meu projeto de graduação que consiste num bando de sensores ligados ao Arduino, e uma página em PHP apresenta as medidas numa página na internet.

O código do Arduino é basicamente esse:

Code: [Select]
#define ANALOG_PIN 0

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if (Serial.available() > 0) {
    if (Serial.read() == '1')
      Serial.print(analogRead(ANALOG_PIN), DEC);
  }
}


E o do PHP:

Code: [Select]
<?php
$port 
fopen('/dev/ttyUSB0''w+');
sleep(2);
fwrite($port'1');
sleep(1);
echo 
fgets($port);
fclose($port);
?>


Queria saber se haveria alguma maneira de eliminar esse sleep.

Wagner Sartori Junior

Que arduino você está utilizando?

mctimbu


Wagner Sartori Junior

É bem provável que seu arduino tenha um auto-reset. Toda vez que a porta serial é aberta ele reseta o arduino por isso do delay. Você precisa desabilitar o auto-reset. Leia isso: http://www.arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection

mctimbu

Fiz o esquema da ligar um resistor do +5V pro reset mas deu erro na hora de compilar o programa.

Wagner Sartori Junior

Sem o auto-reset, quando a IDE do Arduino começa a mandar o código, vc precisa apertar o botão do reset no Arduino para o bootloader receber o novo código.

mctimbu


Wagner Sartori Junior


mctimbu

O primeiro sleep() eu consegui remover... agora falta o segundo.

Além do mais, se mais de uma pessoa acessar a página ao mesmo tempo, dá erro.

Kotch

#9
Jan 04, 2012, 12:54 am Last Edit: Jan 04, 2012, 12:57 am by Kotch Reason: 1
Acho que voce deve usar um shield pra ethernet!
pois voce tem uma porta serial, um usuario acessa o php abre esta porta (serial) se outro usuario ta acessaando  a pagina o php vai tentar abrir uma porta que ja está aberta, acho que por causa disto da o erro, fiz algo semelhante, com ethernet shield usava pra controlar lampadas na minha casa, e abrir o portao da garagem, que eu monitorava por uma camera na internet!

Talvez melhore o seu codigo mandando ignorar o comado de abertura da porta (serial), se ela ja estiver aberta!

Afinal qual erro da?


8)
????????????????????

bubulindo

A solução para fazer isto sem pagar por um shield the Ethernet seria que esse script fosse corrido apenas pelo servidor de X em X tempo e os valores seriam guardados numa tabela ou variável global com o servidor de PHP.
Depois o teu script de PHP que serve os clientes enviaria o dito valor.

Se cada cliente tentar abrir a ligação USB, isso vai dar erro. :\
This... is a hobby.

mctimbu

Arrumei uma solução.

Criei uma página que, quando pega os dados da serial, em vez de exibir para o usuário, grava em um arquivo de texto. Essa página deve ficar rodando continuamente no servidor e cada vez que é carrega, é atualizada automaticamente. Outra página, que será executada pelo cliente, pega os dados do arquivo de texto e mostra ao usuário. Assim, o usuário pode ver a página de forma mais rápida, em vez de ficar esperando o tempo daquele sleep().

Outro problema que eu percebi é que dessa forma tem muito ruído, às vezes dá umas medidas um pouco discrepantes, diferente de quando eu uso aquele exemplo do AnalogReadSerial.

bubulindo


Outro problema que eu percebi é que dessa forma tem muito ruído, às vezes dá umas medidas um pouco discrepantes, diferente de quando eu uso aquele exemplo do AnalogReadSerial.


Muito provavelmente porque sempre que corres o script, fazes reset ao Arduino. Já experimentaste desactivar o reset automático a ver se melhora?

Tens acesso a uma base de dados no teu servidor? Seria mais interessante (e provavelmente mais eficiente) se metesses o valor numa BD em vez de ficheiros.
This... is a hobby.

mctimbu

Foi o que o Wagner Sartori Junior sugeriu e eu fiz...

Por enquanto está funcionando perfeitamente. Vai ver é mau contato, porque quando não tem nada ligado na entrada analógica, aparece uma valor aleatório. A montagem tá muito mal feita.

mctimbu

Essas medidas discrepantes não são ruído não...

Naquele exemplo do AnalogReadSerial, vocês sabem se o Arduino faz algum tipo de média dos valores lidos e apresenta na tela? Porque dessa forma, a leitura do sensor de temperatura, no momento varia de 50 a 51 (decimal). Mas fazendo da outra forma, às vezes chega a aparecer 48, o que dá uma diferença de 2 graus na leitura nesse sensor.

Go Up