Olá pessoal estou com um pequeno probleminha no meu projeto. Este arduino é acessado por uma página em php passa as mgs pra ele via socket.

Primeiro vou passar o código e depois explico qual o problema. (o problema está só no finalzinho do código)

Obs.: cada Luz na verdade é um relé ligado a uma porta do patchpanel poe.

#include <SPI.h>
#include <Ethernet.h>
#include <ICMPPing.h>
 
//Configurações do Ethernet Shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 187,19,27, 1 }; // ip que o arduino assumirá
byte gateway[] = { 187,19,24, 1 };  // ip do roteador
byte subnet[] = { 255, 255,252, 0 };
byte pingAddr[] = {187,19,26,222}; // define enderecço a ser monitorado
SOCKET pingSocket = 3;
char buffer [256];
// String que representa o estado dos dispositivos
char Luz[13] = "0000000011L#";
 
EthernetServer server(8081); // Cria o servidor na porta 8081
 
// String onde é guardada as msgs recebidas
char msg[13] = "0000000011L#";

void setup() {
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  pinMode(A0,OUTPUT);
  pinMode(A1,OUTPUT);
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(A2,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  //digitalWrite(A0,HIGH);
  //digitalWrite(A1,HIGH);
  digitalWrite(2,HIGH);
  digitalWrite(3,HIGH);
  digitalWrite(A2,HIGH);
  digitalWrite(5,HIGH);
  digitalWrite(6,HIGH);
  digitalWrite(7,HIGH);
  digitalWrite(8,HIGH);
  digitalWrite(9,HIGH);
  digitalWrite(10,HIGH);
}

void loop() {
  //Client client = server.available();
  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]=msg[7]; msg[7]=msg[8]; msg[8]=msg[9]; msg[9]=msg[10]; msg[10]=msg[11]; msg[11]=msg[12];
    msg[12] = client.read();

    if (msg[12]=='#') {
      switch(msg[11]) {
        case 'R':
          // Se receber o comando 'R#' envia de volta o status dos
          //   dispositivos. (Que é a string 'Luz')
          client.write(Luz);
        break;
        case 'L':
          // Caso L#, ele copia os 10 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];
          Luz[4]=msg[5];
          Luz[5]=msg[6];
          Luz[6]=msg[7];
          Luz[7]=msg[8];
          Luz[8]=msg[9];
          Luz[9]=msg[10];
          if (Luz[0]=='1') digitalWrite(2,LOW); else digitalWrite(2,HIGH);
          if (Luz[1]=='1') digitalWrite(3,LOW); else digitalWrite(3,HIGH);
          if (Luz[2]=='1') digitalWrite(A2,LOW); else digitalWrite(A2,HIGH);
          if (Luz[3]=='1') digitalWrite(5,LOW); else digitalWrite(5,HIGH);
          if (Luz[4]=='1') digitalWrite(6,LOW); else digitalWrite(6,HIGH);
          if (Luz[5]=='1') digitalWrite(7,LOW); else digitalWrite(7,HIGH);
          if (Luz[6]=='1') digitalWrite(8,LOW); else digitalWrite(8,HIGH);
          if (Luz[7]=='1') digitalWrite(9,LOW); else digitalWrite(9,HIGH);
          if (Luz[8]=='0') digitalWrite(A0,HIGH); else digitalWrite(A0,LOW);
          if (Luz[9]=='0') digitalWrite(A1,HIGH); else digitalWrite(A1,LOW);
        break;
      }
    }
  }

//o problema está aqui em baixo \/ \/ \/


  //WatchDog Porta 1
  ICMPPing ping(pingSocket);
   ping(10, pingAddr, buffer);
     if( strcmp (buffer, "Request Timed Out") == 0) {
      digitalWrite(3, LOW);
      delay(5000);
      digitalWrite(3, HIGH);
      delay(60000);
  }
}

O código funciona, porém se o equipamento que eu estiver pingando nao responder ele entra nesta regra e não me deixa acessar mais nada enquando o equipamento nao voltar a responder. ( ou seja, deixar de receber esta mensagem "Request Timed Out")

Existe alguma maneira de interromper isso quando eu quiser acessar minha pagina em php para hablitar ou desabilitar as portas? Ou até mesmo fazer isso rodar em segundo plano??

Obrigado.

Exibições: 349

Responder esta

Respostas a este tópico

Desculpem por isso, mas ninguém pode me ajudar??

Leandro,

O Arduino tem um esquema de interrupção que pode ser a solução. Tem limitações, mas vai que... pesquise Arduino Interrupts no arduino.cc;

Olá Mauro,

Eu já até dei uma olhada nesses interrupts, mas não consegui nenhum exemplo que eu conseguiria encaixar no meu projeto. Por isso estou apelando para um forum, onde tem pessoas muito mais experientes do que eu que talvez possam me ajudar.

De qualquer forma muito obrigado, vou continuar pesquisando pra ver se acho algo q se encaixe.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço