Go Down

Topic: Problemas com Arduino + PHP (Read 2015 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?


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.


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. :\
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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.
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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