Estou com um problema que vem ocorrendo.

Fiz a automação de uma lâmpada mais o controle da TV.  Fiz uma pagina PHP que manda o comando para o Arduino e fiz também através do TouchOSC e ambos tenho o mesmo problema.

Com os comandos do controle para acionar a TV via emissor infra não consegui gerar o problema, mas quando aciono o botão da luz as vezes o mesmo envia o comando mas não recebe a resposta e parece que trava a ethernet shield ai após esse travamento nem os botões do controle remoto funcionam mais. Só resetando na placa do arduino o mesmo volta a funcionar.

E é aleatório as vezes no primeiro click as vezes no vigésimo as vezes no segundo não há muita lógica.

Não sei se ter que por algum delay, bom alguém já teve problema similar ou sabe  o que poderia ser tentado?

Código do arduino abaixo:

//Sistema de Automacao
//Daniel Diniz Arbulu
#include <SPI.h>
#include <Ethernet.h>
#include <IRremote.h>
#include <ArdOSC.h>

//Configurações do Ethernet Shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,0,22 }; // ip que o arduino assumirá
byte gateway[] = { 192,168,0, 1 }; // ip do roteador
byte subnet[] = { 255, 255, 255, 0 };

// String que representa o estado dos dispositivos
char Luz[7] = "0000L#";

EthernetServer server(8081); // Cria o servidor na porta 8081

IRsend irsend; //Objeto IRSend
int i = 0;

// String onde é guardada as msgs recebidas
char msg[7] = "0000L#";

//MOBILE
int serverPort = 8000; //define a porta de recepção do comando OSC
int destPort= 9000; //define a porta de envio do comando OSC
int flag=0;
int flag2=0;

OSCServer server_mobile; //inicializa o servidor OSC (serviço que trata a recepção de mensagem OSC)
OSCClient client_mobile;

void setup() {
Serial.begin(9600);
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();

server_mobile.begin(8000);
server_mobile.addCallback("/ard/relePin",&func1);
server_mobile.addCallback("/ard/btnVolMais",&func2);
server_mobile.addCallback("/ard/btnVolMenos",&func3);
server_mobile.addCallback("/ard/btnVolMenos2",&func3);

pinMode(A0,OUTPUT);
pinMode(A1,OUTPUT);
pinMode(A2,OUTPUT);
pinMode(A3,OUTPUT);
// pinMode(A4,OUTPUT);
// pinMode(A5,OUTPUT);
digitalWrite(A0,LOW);
digitalWrite(A1,LOW);
digitalWrite(A2,LOW);
digitalWrite(A3,LOW);

}

void loop() {

if(server_mobile.aviableCheck()>0) {
Serial.println("Entrei no if do mobile!");
}

EthernetClient client = server.available();

// SE receber um caracter...
if (client) {

// guarda o caracter na string 'msg'
//msg[1]=msg[2]; msg[2]=msg[3]; msg[3]=msg[4]; msg[4]=msg[5]; msg[5]=msg[6];
//msg[6] = client.read();

for(int k = 1; k < 8; k++) {
msg[k] = client.read();
}

Serial.print("MSG 1:");Serial.println(msg[1]);
Serial.print("MSG 2:");Serial.println(msg[2]);
Serial.print("MSG 3:");Serial.println(msg[3]);
Serial.print("MSG 4:");Serial.println(msg[4]);
Serial.print("MSG 5:");Serial.println(msg[5]);
Serial.print("MSG 6:");Serial.println(msg[6]);
Serial.println(i++);
Serial.println("=============================");
if (msg[2]=='#') {
Serial.println("Entrei no R#");
switch(msg[1]) {
case 'R':
// Se receber o comando 'R#' envia de volta o status dos
// dispositivos. (Que é a string 'Luz')
client.write(Luz);
break;
}
} else if(msg[6]=='#') {
Serial.println("Entrei no L#");
switch(msg[5]) {
// case 'P':
// // Caso P#, aciona o pino do portão pequeno por 1s.
// digitalWrite(A4,HIGH);
// delay(1000);
// digitalWrite(A4,LOW);
// break;
// case 'G':
// // Caso G#, aciona o pino do portão pequeno por 1s.
// digitalWrite(A5,HIGH);
// delay(1000);
// digitalWrite(A5,LOW);
// break;
case 'L':
// Caso L#, ele copia os 4 bytes anteriores p/ a
// string 'Luz' e cada byte representa um
// dispositivo, onde '1'=ON e '0'=OFF
Luz[0]=msg[1];
Luz[1]=msg[2];
Luz[2]=msg[3];
Luz[3]=msg[4];
if (Luz[0]=='1') digitalWrite(A0,HIGH); else digitalWrite(A0,LOW);
if (Luz[1]=='1') digitalWrite(A1,HIGH); else digitalWrite(A1,LOW);
if (Luz[2]=='1') digitalWrite(A2,HIGH); else digitalWrite(A2,LOW);
if (Luz[3]=='1') digitalWrite(A3,HIGH); else digitalWrite(A3,LOW);
client.write(Luz);
break;

case 'C':

if (msg[4] == 'p') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DF10EF, 32); //Desligar TV
delay(40);
}
}
if (msg[4] == '+') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DF40BF, 32); //Subir volume
delay(40);
}
}
if (msg[4] == '-') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DFC03F, 32); //Descer volume
delay(40);
}
}
if (msg[4] == '/') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DF00FF, 32); //Subir canal
delay(40);
}
}
if (msg[4] == '*') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DF807F, 32); //Descer canal
delay(40);
}
}
if (msg[4] == 'i') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DFD02F, 32); //Input
delay(40);
}
}
if (msg[4] == 'a') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DF0CF3, 32); //Av Mode
delay(40);
}
}
if (msg[4] == '6') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DF609F, 32); //Direita menu
delay(40);
}
}
if (msg[4] == '4') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DFE01F, 32); //Esquerda menu
delay(40);
}
}
if (msg[4] == '8') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DF02FD, 32); //Cima menu
delay(40);
}
}
if (msg[4] == '5') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DF827D, 32); //Baixo menu
delay(40);
}
}
if (msg[4] == 'e') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DF22DD, 32); //Enter menu
delay(40);
}
}
client.write(Luz);
break;
}
}
}
}

void func1(OSCMessage *_mes){ //rotina que trata comando OSC "/ard/led2" recebido do ANDROID
Serial.println("Antes da atividade!");
int value=(int)_mes->getArgFloat(0); //armazena em "value" o argumento do comando OSC "/ard/led2"
//digitalWrite(A0,value); //muda estado da porta digital 8 (ledPin2) conforme argumento OSC recebido
//delay(40);
//create new osc message
OSCMessage txMes; //cria uma nova menssagem OSC

//set destination ip address & port no
txMes.setAddress(_mes->getIpAddress(),9000); //define o endereço e porta do destino da mensagem OSC
txMes.beginMessage("/ard/relePin"); //define comando OSC
txMes.addArgFloat(flag); //define no estado do led 2 que será enviado no argumento OSC para ANDROID

if(flag==1){
flag=0;
digitalWrite(A0, LOW);
delay(100);
}
else{
flag=1;
digitalWrite(A0, HIGH);
delay(100);
}

txMes.addArgInt32(flag);
Serial.println("Antes do envio da Mensagem!");
//send osc message
client_mobile.send(&txMes); //envia mensagem OSC para atualizar novo estado do led 1 no ANDROID
Serial.println("Enviei a mensagem!");
}

void func2(OSCMessage *_mes){ //rotina que trata comando OSC "/ard/led2" recebido do ANDROID
int value=(int)_mes->getArgFloat(0); //armazena em "value" o argumento do comando OSC "/ard/led2"

irsend.sendNEC(0x20DF40BF, 32); //Subir volume
delay(40);

//create new osc message
OSCMessage txMes; //cria uma nova menssagem OSC

//set destination ip address & port no
txMes.setAddress(_mes->getIpAddress(),9000); //define o endereço e porta do destino da mensagem OSC
txMes.beginMessage("/ard/btnVolMais"); //define comando OSC
txMes.addArgFloat(flag); //define no estado do led 2 que será enviado no argumento OSC para ANDROID


txMes.addArgInt32(flag);

//send osc message
client_mobile.send(&txMes); //envia mensagem OSC para atualizar novo estado do led 1 no ANDROID
Serial.println("Enviei a mensagem!");

}

void func3(OSCMessage *_mes){ //rotina que trata comando OSC "/ard/led2" recebido do ANDROID
int value=(int)_mes->getArgFloat(0); //armazena em "value" o argumento do comando OSC "/ard/led2"

irsend.sendNEC(0x20DFC03F, 32); //Descer volume
delay(40);

//create new osc message
OSCMessage txMes; //cria uma nova menssagem OSC

//set destination ip address & port no
txMes.setAddress(_mes->getIpAddress(),9000); //define o endereço e porta do destino da mensagem OSC
txMes.beginMessage("/ard/btnVolMenos"); //define comando OSC
txMes.addArgFloat(flag); //define no estado do led 2 que será enviado no argumento OSC para ANDROID

txMes.addArgInt32(flag);

//send osc message
client_mobile.send(&txMes); //envia mensagem OSC para atualizar novo estado do led 1 no ANDROID

}

Exibições: 279

Responder esta

Respostas a este tópico

Daniel.

Você está utilizando algum rele para acionar a lampada ou não está com esta parte do circuito?

Abs

Sim uso um módulo Rele sim.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço