Senhores,

Estou fazendo testes no meu primeiro projeto de automação.

Entre uma dificuldade e outra tenho conseguindo resolver os problemas com  ajuda do que tenho lido aqui no forum. Por isso já gradeço.

No memento estou com problema para fazer o PHP ler as informações envidas via serial pelo Arduino.

Resolvi o "problema" de reset do Arduino quando acessamos via serial com um capacitor de 10uF entre o pino de reset e o GND.

Todas todos os comandos de leitura es escrita funcionam perfeitamente pelo Monitor Serial. Mas no PHP só consigo enviar comandos. Sempre que tento ler o https.exe trava e a porta serial fica presa, só consigo liberar se eu matar o processo httpd.exe.

Já fiz testes em 2 maquinas com windows 8.1 e uma com o windows 7. Irei testar com o XP em breve.

Apesar de não achar necessário devido ao capacitor de 10uF, Usei deley para fazer a leitura e nada.

Cheguei a capturar o trafego da porta serial e tudo funciona até o momento da leitura quando o trafego para.

Seguem os códigos:

<?php
exec("mode COM2: BAUD=9600 PARITY=N data=8 stop=1 xon=off ");
$port = fopen('COM2', 'w+');
fwrite($port, '9');
echo fgets($port);
fclose($port);


if(isset($_GET["1"])){
$port = fopen('COM2', 'w');
fwrite($port, '1');
fclose($port);
echo "LED VERMELHO";
}

if(isset($_GET["2"])){
$port = fopen('COM2', 'w');
fwrite($port, '2');
fclose($port);
echo "LED VERDE";
}

?>

ARDUINO:


//=======================================DECLARAÇÃO DE VARIÁVEIS

//====================CONSTANTES
const int LigaPC = 2;
const int LuzQuarto = 3;
const int LuzOficina = 4;
const int Interruptor = 13;

//VARIÁVEIS
char Leitura_Serial;
//network NB: Pins 10, 11, 12 and 13 are reserved for Ethernet module.

int PC_Button = 0;
int Ler_Interuptor = 1;
int Interruptor_Conut = 0;
int InterruptorState = LOW;
int LastInterruptorState = LOW;

int Status_Quarto = LOW;
int Status_Oficina = LOW;

//======Delay
unsigned long PCPowerButtonDelay = 0;
unsigned long HardShutdownDelay = 0;
unsigned long lastDebounceTime = 0;
int Action_Delay = 1300;
int Interruptor_Delay = 50;


void setup() {
// put your setup code here, to run once:
//=======================================================INICIA SERIAL
Serial.begin(9600);
//Serial.println("INICIANDO SKEYNET V1.1");

//=================================================INICIA PINOS

pinMode(LigaPC, OUTPUT);
digitalWrite(LigaPC,HIGH);

pinMode(Interruptor, INPUT);
digitalWrite(Interruptor,HIGH);

pinMode(LuzQuarto, OUTPUT);
digitalWrite(LuzQuarto,LOW);

pinMode(LuzOficina, OUTPUT);
digitalWrite(LuzOficina,LOW);
}

void loop() {
//====================================================INICIO DO LOOP

//==============================INTERRUPTOR


if (Serial.available()){ // Verificar se há caracteres disponíveis
//
Interruptor_Conut = Serial.read();
if (Interruptor_Conut == '9') {
if (digitalRead(LuzQuarto) == 1) Serial.println("Ligada");
else Serial.println("Desligada");
}

if (Interruptor_Conut != '9') Interruptor_Conut = Interruptor_Conut - 48;

}


/*Serial.println("Testando");
delay (1000); */
Ler_Interuptor = digitalRead(Interruptor);
if (Ler_Interuptor != LastInterruptorState) {
lastDebounceTime = millis();
}

//=====Debauce Interruptor
if ((unsigned long)(millis() - lastDebounceTime) >= Interruptor_Delay) {
if (Ler_Interuptor != InterruptorState){
if (Ler_Interuptor == 0) {
Interruptor_Conut++;
}
InterruptorState = Ler_Interuptor;
}
}

//=====Ações interruptor
if (Interruptor_Conut != 0) { //Só executará ações quando houver interaçã!!!!!
if ((unsigned long)(millis() - lastDebounceTime) >= Action_Delay) {

//==========CHAMA QUARTO
if (Interruptor_Conut == 1) QUARTO (Interruptor_Conut);

//==========OFICINA
if (Interruptor_Conut == 2) OFICINA (Interruptor_Conut);

//==========INVERTE STATUS
if (Interruptor_Conut == 3) {
QUARTO(Interruptor_Conut);
OFICINA(Interruptor_Conut);
}

//==========LIGAR COMPUTADOR
if (Interruptor_Conut == 5) {
PC_Button = 5;
INTERAGE(Interruptor_Conut);
PCPowerButtonDelay = millis();
}

//==========HARD SHUTDOWN
if (Interruptor_Conut == 6) {
PC_Button = 7;
INTERAGE(Interruptor_Conut);
HardShutdownDelay = millis();
}

//====Aquardando nova leitura
Interruptor_Conut=0;

}
}
//==============================FIM INTERRUPTOR

//=================================SETA VARIÁVEIS FINAIS
//====Setar Status das Luzes

LastInterruptorState = Ler_Interuptor;

//========================LIGA PC DELAY
if ((((unsigned long)(millis()) - PCPowerButtonDelay >= 1000)) && ((PC_Button == 5))) {
PC_Button = 99;
Serial.println("solta boto");
digitalWrite(LigaPC,HIGH);
}

//========================FORÇA DESLIGAMENTO DO PC DELAY
if ((((unsigned long)(millis()) - HardShutdownDelay >= 4000)) && ((PC_Button == 7))) {
PC_Button = 99;
Serial.println("solta bot33");
digitalWrite(LigaPC,HIGH);
}

}

//==============================FIM DO LOOP


//==============================FUNÇÕES

String QUARTO (int pop) {
Interruptor_Conut=0;
Status_Quarto = !Status_Quarto;
digitalWrite(LuzQuarto, Status_Quarto);
Serial.println("LUZ DO QUARTO");
}

String OFICINA (int pop) {
Interruptor_Conut=0;
Status_Oficina = !Status_Oficina;
digitalWrite(LuzOficina, Status_Oficina);
//Serial.println("LUZ DA OFICINA");
}

String INTERAGE (int pop) {
Interruptor_Conut=0;
digitalWrite(LigaPC,LOW);
//Serial.println("COMPUTADOR");
}

Exibições: 1806

Responder esta

Respostas a este tópico

imhugo,

Valeu as dicas. Pesquisei bastante sobre qual a melhor maneira de fazer a comunicação do PHP com o Arduino. Cheguei a cogitar algum software SCADA e alguns protocolos de comunicação como firmata e OSC.

Achei a sua ideia melhor pois com um ethernet shield me dá maior mobilidade, inclusive posso hospedar o site externamente e assim não tenho a necessidade de um servidor ligado 24h por dia dentro de casa.

Fica a dica: PHP + Socket + Arduino.

Tem um pequeno tópico sobre o assunto aqui mesmo no Labgaragem.

 

http://labdegaragem.com/forum/topics/ajuda-webserver-php-arduino-sh...

Bom dia Luiz!

Estou perdendo a paciencia com a comunicação Serial tambem, ja fiz um projeto a um ano atras que funcionou perfeitamente, agora estou criando um outro que a porta serial esta me deixando mais careca que sou, heheheh.

Não sei se são as novas configurações de hardware dos PC's ou o que pode ser, a conexao na mesma hora que esta funcionando, para de funcionar, não da para entender


$portAddress = 'COM5';
exec("mode COM5: BAUD=9600 PARITY=N data=8 stop=1 xon=on");
$port = fopen($portAddress, 'w+');


O W+ abre a leitura e escrita o W- so escrita, so que seo da pau com W+ que e o que preciso.

Vou tentar passar para PHP + Socket + Arduino. para ver o que consigo, te agradeco se aparecer mais novidades ai, se vc poder me enviar, e o que eu tiver te passo tambem.

A Biblioteca 
MySQL Connector/Arduino, seria ideal para realizar estes projetos, mais e outra que me deixou de cabelo em pé, alias nem cabelo tenho mais, hehehe

Da uma olhada no projeto que fiz anteriormente, e o danado funciona perfeitamente!!




E ai Marcos,

Ficou bala o teu sistema. Eu estou apenas começando, minhas paginas parecem produzidas em 1995, e eu nem me atrevi fazer algo com banco de dados ainda, mas um dia eu chego lá. Como meu sistema é apenas para controlar meu AP que será entregue me breve, não tem muita coisa para automatizar além de luzes e alguns aparelhos eletrônicos.

Mas o seguinte, vou deixar umas dicas que aprendi nas pesquisas ai que podem te ser uteis caso não saiba.

Se utilizar o esquema do socket vai acabar com esse problema do delay que tens que inserir no PHP, além disso teu servidor não precisa mais ficar conectado diretamente ao arduino, sem falar que podes usar um wifi shield. Fiz aluns testes aqui e não foi muito complicado de implementar.

Bom, mas com tu já tem tudo pronto ai, tenho outra dica para o problema do reset

Um capacitor de 10uF 16V (é o que eu uso) conetado entre o pino de reset e o GND acaba com essa história do reset no acesso a serial. Podes também usar um resistor de 120R a 130R entre os 5V e o reset, mas eu prefiro o capacitor.

O Inconveniente de ambas as soluções é que para fazer o upload de novos programas, terás que remover o capacitor/resistor caso contrario dá erro no envio do programa, mas nada que danifique o arduino.

Boa sorte ai e espero que minhas dicas ajudem.

 

Pois e cara, não consegi com Socket, atualizei meu windows 7 e agora conectou novamente ao USB, to deixando o novo sistema apenas para executar comando do PHP de INSERT e LEITURA, o Banco de dados e os Codigos estão funcionando Online, o Delei continua de 3 segundos. isso que ta me matando, mais infelizmente e um mal necessário.

se der posta o codigo simples do esquema que vc utilizou do Socket, eu so fiquei na duvida se ele so recebe os comandos do HTML ou se manda tambem Arduino para o HTML 

Socket no PHP não tem mistério... Cria ele, conecta, envia/escreve e fecha.

$enviar = "L01";

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_connect($sock,"171.171.1.129", 80);

socket_write($sock,$enviar,3);

socket_close($sock);

Não e possivel, todo mundo fala, faz so eu to apanhando nesse SOCKET, vo tenta dinovo aqui, hehehe :(

A princípio acredito que tu só precisa colocar o IP que tu atribuiu no arduino ali onde tá "171.171.1.129". Aquele 3 ali no write são quantos bytes vai enviar. O resto não altera nada eu acredito.

Tentar fazer um código pro arduino que fique escutando a porta e quando receber algo imprime na serial. E um php bem simples tipo esse trecho aí. Quando funcionar essa parte tu implementa no teu atual.

Estudei um pouco mais par entender e montei um exemplo para testar.

Segue ai o codigo PHP e Arduino. Acho que dá para entender como a comunicação ocorre entre eles.

Trabalhe com arrays, principalmente no arduino, pois os dados são enviados dessa forama.

#include <SPI.h>
#include <Ethernet.h>

//Configurações do Ethernet Shield

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,11, 121 }; // ip que o arduino assumirá
byte gateway[] = { 192,168,11, 126 }; // ip do roteador
byte subnet[] = { 255, 255, 255, 128 };
EthernetServer server(8081); // Cria o servidor na porta 7496
char leitura = 'nada';
char msg[8] = "H0000LR"; //IMPORTANTE TER O MESMO COMPRIMENTO ESPERADO NO PHP

void setup() {
Serial.begin(9600);
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
Serial.println("INICIADO");
pinMode(3,OUTPUT);

}

void loop() {
EthernetClient client = server.available();

//-------REQUISIÇÕES DA REDE
if (client) { //SE TIVERMOS CLIENTE:
Serial.println("conectado");
leitura = client.read(); //GRAVA EM UMA VARIAVEL O QU FOI ENVIADO
Serial.println(leitura); //MOSTRA O QUE FOI RECEBIDO VIA SOCKET NO TERMINAL
if (leitura == 'R') { //SE TIVERMOS ALGUM "R" NA MENSAGEM RECEBIA LIGA O PINO 3 E MOSTRA NO TERMINAL
digitalWrite(3,HIGH);
client.write(msg);
Serial.println(msg);
}
}
}

<?php
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_connect($sock,"192.168.11.121", 8081); //IP DO ARDUINO E PORTA - no codigo do arduino: EthernetServer server(8081)

$envio = 'PHPR';
socket_write($sock,$envio); //envia os dados gravados na variavel $envio
$status = socket_read($sock,8);
echo "ENVIADO PARA O ARDUINO: $envio"; //IMPRIME O QUE FOI ENVIADO
echo "</br>";
echo "RECEBIDO DO ARDUINO: $status"; // IMPRIME O QUE FOI RECEBIDO
socket_close($sock); //ENCERRA CONEXÃO
?>

primeiramente gostaria de agradecer e dar os parabens, pois foi o primeiro post que realmente demostrou algo pratico sobre arduino e socket.

testei este codigo e e perfeito.. funciona muito bem.

Mas no meu caso preciso que o arduino inicie a comunicação pois o arduino sabe o endereço do sevidor web wamp, mas o wamp nao sabe o emdereço do arduino na net, entao creio que se o arduino começar a comunicacao daria certo.

sera que poderia me dar uma dica de como fazer isso.

obs; Nao posso rotear porta e usar no-ip no arduino, por isso estou usando sockts e a comunicação teria que partir do arduino pelo menos a primeira conexao, depois o servidor pode "falar".

entende?

José,

Estou bastante afastado do meu projeto em Arduino por enquanto, mas os planos ainda existem.

Entendi a sua necessidade, mas acredito que o Arduino não poderá fazer o acesso ao servidor PHP. Até onde sei você necessita de um browser para interpretar o código PHP, coisa que o Arduino não tem.

O que você poderia fazer é criara um Banco MySQL com as suas variáveis e fazer as alterações no banco com o Arduino e o PHP.

O problema que vejo nessa solução é que o Arduino vei ter que acessar o banco sistematicamente para identificar alterações. Se, por exemplo, você liga uma lâmpada pela pagina o PHP executa a alteração da varável correspondente a mesma no MySQL.

No Código do Arduino você consulta o Banco a procura de alterações a cada, digamos, 10 segundos. O problema é que poderá ter um delay de 10 segundo entre o click na pagina e a lâmpada acender.

Acho muito mais pratico tentar ver alguma forma de direcionar as portas para o Arduino vai dar bem menos trabalho.

Sou Analista de Redes e essa é minha área de atuação, me descreve como é o ambiente de rede que possivelmente te indico a solução.

Ok Luiz, realmente creio que vai ser esse o caminho............

quanto ao anbiente e indefinido pois e um equipamento que vai ser instalado na casa do cliente e cada cliente e um cliente e um caso diferente.

mas a ideia e conecta na net, ta rodando ele busca o banco de dados atualiza e comversa e faz o que tem que fazer...

a parte de atualizar o bd do wamp ja estou fazendo e funciona muito bem, redondo faço a cada 10 s.

mas gostaria de ter um pequeno deley no acionamento e nao ter que rotiar portas no ip e etc.

se diminuir este delay de 10s poderia melhorar, pensando em 1 arduino blz, mas pensando em 50 ,...100 ...1000 fazendo conexao a cada 10s fica muita coisa para o server.......

Saberia me dizer se telnet daria certo? pois no arduino tem uma bibliteca voltada pata client telnet...mas mesmo assim nao acho um codigo telnet php de facil alteração para acoplar a minha nessecidade?

E tambem ja que sua especialidade e rede, saberia me informa se teria algo que poderia substituir este roteamento de porta e o no-ip de forma mais pratica e descomplicada?

Pois é, se tiveres muitos Arduinos podes ter algum tipo de gargalo. Mas mesmo assim essas consultas não devem gerar muito trafego se bem desenvolvido. Eu mesmo gerencio uma rede com cerca de 2 mil pessoas em dois sites destintos acessando e-mail, web, Skpe e tudo mais que tu possa imaginar.

Vai pelo lado do direcionamento da porta, é muito mais simples do que você desenvolver toda uma solução só para isso.

Pense que por exemplo, se comprar um camera IP e desejar acessar a imagem de qualquer lugar vai ter que configurar o direcionamento da porta também.

Em relação ao no-ip, diversos fabricantes (para não dizer a maioria) já incluem a solução de DDNS direto no router.

Pega esse exemplo, nesse simulador da Dlink:

http://suporte.dlink.com.br/suporte/emuladores/DI/DI-524UP_1.06/Adv...

Vai em Advanced>DDNS

No campo: Server Address

Tem varias opções além do no-ip. Tá tudo pronto, é só usar!!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço