Problemas com Arduino+PHP

Bom dia, estou tentando manipular o Arduíno pelo PHP, mas estou tento dificuldades, estou com um código que em vez de ligar o LED ele apenas dá uma piscada e só, e o código era para deixar o LED ligado, muito estranho, segue o código.

  <<Arduíno>>
int Pino = 13;
int usbnumber = 1 ; 
 
void setup() { 
    pinMode(Pino, OUTPUT);  
    Serial.begin(9600); 
} 
void loop() {
   if (Serial.available() > 0) {
        usbnumber = Serial.read(); 
   }
    if (usbnumber = '1') { 
          digitalWrite(Pino, LOW); //desliga   
    } 
    if (usbnumber = '2'){ 
          digitalWrite(Pino, HIGH); //liga
        }           

}
 <<PHP>>

<?php 
 
$Porta = "com4";
if (isset($_POST["rcmd"])) { 
    $rcmd = $_POST["rcmd"]; 
switch ($rcmd) { 
    case "desliga": 
		$fp =fopen($Porta, "w"); 
		fwrite($fp, chr(1));
		fclose($fp); 
    break; 
   case "liga": 
        $fp =fopen($Porta, "w"); 
		fwrite($fp, chr(2));  
		fclose($fp); 
		break; 
		default:
    } 
} 
?> 
<html> 
<head><title>Controle Arduino</title>
</head> 
<body> 
<div align="center">
<form method="post" action="<?php echo $PHP_SELF;?>"> 
    <p>
      <input type="submit" value="desliga" name="rcmd" height="10%">
    </p>
    <p>&nbsp;</p>
    <p>
 
      <input type="submit" value="liga" name="rcmd">

    </p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <body>
</form> 
</div>
</center> 
</body> 
</html>

Amigo,
dentro do IF, você usou apenas um "=" ao invés de "==" para verificar a igualdade:

if (usbnumber = '1') {
digitalWrite(Pino, LOW); //desliga
}

Abraço
www.webtronico.com

infelizmente do mesmo geito. :roll_eyes:

O problema no seu caso é o AUTO-RESET do Arduino, toda vez que é aberta a porta serial o chip FT232RL reseta o Arduino porque pode ser a IDE enviando um programa, e o LED que pisca não é o seu programa e sim o bootloader aguardando dados.
Siga as instruções aqui:
http://www.arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection
e nos dê um retorno.

PS. Conte mais sobre seu projeto, é windows? XAMPP?

Bom vou contar sobre meu Projeto, Estou sou acadêmico do Curso de Sistemas de Informação, estou desenvolvendo meu TCC, nele irei fazer um sistema de automação residencial, com controle de temperatura, abertura de portas e portões, ligar dispositivos, luz etc.
Sou leigo no assunto, mas estou estudando o máximo possível, acredito que irá dar tudo certo. tenho até o mês de dezembro para concluir. Conto com Vocês.

Utilizo Windows, WAMPSERV, Arduino MEGA1280.

kabixi:
infelizmente do mesmo geito. :roll_eyes:

Jeito é com JOTA. Fazendo TCC o mínimo é escrever corretamente :smiley:

O autoreset é correto, quando você abre a porta seu arduino reseta.

Tenta isso:

  1. Use o fopen com "w+" ao invés de apenas "w".
  2. Coloque um sleep de uns 2 segundos(que deve dar o tempo do seu arduino fazer o "reset") depois dos "fopen" no PHP.

É Wagner Sartori Junior, a correção ortográfica deu certo, XD XD XD, mas o código ficou do mesmo jeito. não desabilitei ainda o auto-reset, devido estou na duvida se utilizo o resistor 110ohms, ou mexer na trilha.

Eu não aconselho você a mexer no arudino(nem resistor nem cortar trilha). Toda vez que seu código abrir o serial com o arduino, ele será resetado. O sleep no PHP deveria resolver isto. Tente aumentar para 5 segundos.

Se não funcionar, precisa debugar, e aí fica mais complicado de explicar.

Comece vendo o CHR() no PHP que converte o ASCII code 1 para um caracter. Precisa ver a real necessidade disto. Tente tirar o CHR e ler do outro lado(no arduino) apenas o número 1(sem as aspas).

Outra coisa e colocar um LED e piscar ele em trechos do seu código para ver o que está acontecendo. Ou mesmo printar(Serial.println) coisas e ler o que está acontecendo. Tipo, imprima o caracter em HEXADECIMAL que vc está recebendo do PHP. Coloque depois do Serial.read um Serial.prinln(usbnumber, HEX).

aumentei o sleep para 5 e ficou do mesmo jeito, mas e esse esquema de debugar, como posso entender melhor.

Debugar é você saber exatamente o que está acontecendo em algum ponto do seu programa(valor de variáveis, conteúdo de memória, etc...). No arduino(entenda microcontroladores AVR com função debug), como você não tem um programador especializado com funções de debug, você vai precisar cuspir as saídas do que você quer para algum lugar. Pode ser um LED que pisca uma vez quando chega em um ponto do seu programa, duas vezes quando chega em outro e assim por diante.

Como ele está ligado via porta serial na sua máquina, recomendo fazer as saídas na porta serial. Leia mais sobre os métodos print() e println() do Serial:

Abrindo o "Serial Monitor" no IDE do Arduino, você consegue ver as saídas da porta serial, entretanto, o PHP vai "deixar" de funcionar porque você só pode abrir a porta serial em um software de cada vez.

Se você está tendo dificuldades, experimente os exemplos de serial que vem com o IDE do Arduino. O que você está tentando fazer não é coisa de "iniciante" é mais para médio/avançado, então recomendo ler mais e entender exatamente o que faz cada coisa que você está fazendo no seu programa.

kabixi, você costurou um monte de código junto e quer que rode de primeira?

Releia o que os colegas Webtronico e Wagner escreveram
consulte Arduino - Home.

Sugiro que consulte algum codigo já consagrado, como deste site:

e aí sim mudando uma parte por vez e testando. Compare com o seu código e veja onde errou.

Postar o seu código com as devidas alterações não seria correto pois o TCC perderia a função principal que é mostrar que aprendeu e também acaba com a graça do desafio.

não é que costurei o código, simplesmente o código era para ligar um LED RGB ai tirei os outros códigos e deixei apenas um, na teoria era pra funcionar normalmente.

ele até funciona, mas somente dá uma piscada.

esse blog do Bruno Soares já visitei imensas vezes, e as referencias também já conheço quase tudo, mas estou a procura ainda da solução, pois sei que para fazer tudo o que desejo fazer irei ter muito e muitos problemas, senão não terá graça ...

kabixi: eu lembro que visitei esse forum mesmo que tu está tentando, apanhei muitooooooooooo pra conseguir, mas consegui...nao lembro qual era a zica nao, na verdade, a minha porta nao abria conexao...hahaha...em relação ao resistor de 110ohms, eu acho recomendavel voce mesmo montar um resistorzinho, ou pegar um potenciometro e achar 110ohms, nao aconselho mexer em absolutamente nada do arduino...

vou ver se faco essa semana essa mesma coisa que tu quer fazer, e ai faco algum tutorial se eu conseguir de novo...hahaha...usa windows ?linux ??(isso varia pra abrir a porta)

Abraços

To usando o Windows 7 Home Premium, WampServ.

E ai kabixi, nenhum progresso?
Veja, eu não tenho base nenhuma em php/html/mysql, instalei o XAMPP, joguei seu php lá e programei o arduino, em 5 min o código tava funcionando, para não ficar resetando o arduino, coloquei um resistor de 100 ohm entre o reset e 5V(era o que eu tinha) e retirei os sleep do php, ficou rápido...
Como não pode se perder o desafio, vou postar as linhas que contém erros,

******************** Arduino:
int Pino = 13;
int usbnumber = 1 ;

void setup() {
pinMode(Pino, OUTPUT);
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
usbnumber = Serial.read();
}
if (usbnumber = '1') {
digitalWrite(Pino, LOW); //desliga
}
if (usbnumber = '2'){
digitalWrite(Pino, HIGH); //liga
}

}

********************* PHP:

<?php $Porta = "com4"; if (isset($_POST["rcmd"])) { $rcmd = $_POST["rcmd"]; switch ($rcmd) { case "desliga": $fp =fopen($Porta, "w"); fwrite($fp, chr(1)); fclose($fp); break; case "liga": $fp =fopen($Porta, "w"); fwrite($fp, chr(2)); fclose($fp); break; default: } } ?> Controle Arduino

 

 

 

já alterei de "=" para "==" se esse foi o problema, mas continua dando o mesmo erro. o led somente pisca em vez de ficar ligado...

Fabio vc falou de 3 possiveis erros, o do == ja tinha notado, mas e esse do <?php echo $PHP_SELF;?> e o chr(); o que seria esses erros? notei que existe um ; no antes do ?, e para enviar o código para o Arduíno retirei o chr() e continuou a mesma coisa, seria isso que vc esta se referindo, pois de momento continua sem funcionar, estou até achando que pode ser alguma coisa de sistema operacional(Windows 7 Home Premium)?

Amigo, apenas coloquei em evidência as dicas dos outros colegas que tentaram ajudá-lo estão corretas...

<form method="post" action="<?php echo $PHP_SELF;?>">
O conteúdo do action em um dos exemplos do Bruno Soares é vazio "" e foi como fiz porque com com seu ardumento dá erro.

2° Sugiro que você estude mais a linguagem de programação(o arduino no fundo é um C++ disfarçado),
No arduino você compara
if (usbnumber = '1') ; Esse '1' entre aspas quer dizer o caracter 1 que na tabela ASCII significa 49, então no PHP você tem que enviar o caracter 1, mas você manda

fwrite($fp, chr(1));

A função chr() pega o caracter referente aquela posição decimal 1, que na tabela ASCII não possui simbolo, apenas um nome SOH. Então pense, 49 é igual a 1? O correto seria

fwrite($fp, '1');

A minha parte PHP que rodou

<?php 
$Porta = "com4";
if (isset($_POST["rcmd"])) { 
    $rcmd = $_POST["rcmd"]; 
switch ($rcmd) { 
    case "desliga": 
		$fp =fopen($Porta, "w+"); 
sleep(2);		
fwrite($fp, '1');

		fclose($fp); 
    break; 
   case "liga": 
        $fp =fopen($Porta, "w+"); 
sleep(2);
		fwrite($fp, '2');  
		fclose($fp); 
		break; 
		default:
    } 
} 

?> 

<html> 

<head><title>Controle Arduino</title>
</head> 
<body> 
<div align="center">
<form method="post" action=""> 
    <p>
      <input type="submit" value="desliga" name="rcmd" height="10%">
    </p>
   
    <p>
 
      <input type="submit" value="liga" name="rcmd" height="10%">


    </p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <body>
</form> 
</div>
</center> 
</body> 
</html>

Agradeço a Todos por terem me ajudado, consegui resolver os problemas do Arduino+PHP , o grande problema estava no servidor apache, não estava se comunicando com a porta serial, ai foi só reinstalar o "Wampserv", e efetuar os ajustes nos códigos e deu tudo certo, segue os códigos que funcionarão:

<<Arduíno>>
int Pino = 13;
int usbnumber = 1 ; 
 
void setup() { 
    pinMode(Pino, OUTPUT);  
    Serial.begin(9600); 
} 
void loop() {
   if (Serial.available() > 0) {
        usbnumber = Serial.read(); 
   }
    if (usbnumber == '1') { 
          digitalWrite(Pino, LOW); //desliga   
    } 
    if (usbnumber == '2'){ 
          digitalWrite(Pino, HIGH); //liga
        }    
}
<?php 
$Porta = "com4";
if (isset($_POST["rcmd"])) { 
    $rcmd = $_POST["rcmd"]; 
switch ($rcmd) { 
    case "desliga": 
		$fp =fopen($Porta, "w+"); 
sleep(2);		
fwrite($fp, '1');

		fclose($fp); 
    break; 
   case "liga": 
        $fp =fopen($Porta, "w+"); 
sleep(2);
		fwrite($fp, '2');  
		fclose($fp); 
		break; 
		default:
    } 
} 

?> 

<html> 

<head><title>Controle Arduino</title>
</head> 
<body> 
<div align="center">
<form method="post" action=""> 
    <p>
      <input type="submit" value="desliga" name="rcmd" height="10%">
    </p>
   
    <p>
 
      <input type="submit" value="liga" name="rcmd" height="10%">


    </p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <body>
</form> 
</div>
</center> 
</body> 
</html>

Os códigos são as correções que o nosso amigo Fabio passou, Obrigado XD...
se precisar de algo tamos ai ;)...

Olá a Todos

Peço desculpas desde já, visto ter adquirido um Arduino Uno apenas á dias, e não percebendo nada de programação tenho andado a ler uma serie de posts e tuturiais para me integrar minimamente.

Eu tenho instalado o windows xp + wampserver e coloquei os seus codigos na directoria www do wamp como codigo html e php, mas quando tento carregar na caixa de ligar nada acontece, apenas alterei a porta com que no meu caso é a COM11
Eu programei o codigo no IDE e quando vou a SerialMonitor carrego em 2 e liga o led 1 desliga por tanto a comunicação IDE/Arduino funciona.
Será que me podiam tentar esclarecer o que estarei a fazer mal.
O meu obrigado
Nuno