Problemas com Arduino + PHP

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:

#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:

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

Que arduino você está utilizando?

Arduino Mega.

É 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: Arduino Playground - DisablingAutoResetOnSerialConnection

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

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.

Que botão é esse?

mctimbu:
Que botão é esse?

O único botão que todo arduino tem.

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.

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?

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. :\

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.

mctimbu:
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.

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.

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.

O problema do ruído foi resolvido utilizando um filtro média móvel no Arduino.

Obrigado.