sábado, 21 de novembro de 2015

Alarme anti-furto para projetores multimídia - parte 2

Olá pessoal,

Continuando com o projeto segue abaixo vídeo do alarme e do código implementado:




O código:


#include <Wire.h> 
#include <SPI.h>
#include <Ethernet.h>
#include <Agentuino.h> 
//#include "RTClib.h"

// this must be unique
static byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xF0, 0xDA }; 
// change network settings to yours

// change server to your email server ip or domain
// IPAddress server( 1, 2, 3, 4 );
//char server[] = "mail.sorocaba.unesp.br";
//char server[15] = "200.145.27.7";

EthernetClient client;


// RFC1213-MIB OIDs
// .iso (.1)
// .iso.org (.1.3)
// .iso.org.dod (.1.3.6)
// .iso.org.dod.internet (.1.3.6.1)
// .iso.org.dod.internet.mgmt (.1.3.6.1.2)
// .iso.org.dod.internet.mgmt.mib-2 (.1.3.6.1.2.1)
// .iso.org.dod.internet.mgmt.mib-2.system (.1.3.6.1.2.1.1)
// .iso.org.dod.internet.mgmt.mib-2.system.sysDescr (.1.3.6.1.2.1.1.1)
static char sysDescr[20] PROGMEM     = "1.3.6.1.2.1.1.1.0";  // read-only  (DisplayString)

// .iso.org.dod.internet.mgmt.mib-2.system.sysObjectID (.1.3.6.1.2.1.1.2)
static char sysObjectID[20] PROGMEM   = "1.3.6.1.2.1.1.2.0";  // read-only  (ObjectIdentifier)

// .iso.org.dod.internet.mgmt.mib-2.system.sysUpTime (.1.3.6.1.2.1.1.3)
static char sysUpTime[20] PROGMEM     = "1.3.6.1.2.1.1.3.0";  // read-only  (TimeTicks)

// .iso.org.dod.internet.mgmt.mib-2.system.sysContact (.1.3.6.1.2.1.1.4)
static char sysContact[20] PROGMEM    = "1.3.6.1.2.1.1.4.0";  // read-write (DisplayString)

// .iso.org.dod.internet.mgmt.mib-2.system.sysName (.1.3.6.1.2.1.1.5)
static char sysName[20] PROGMEM       = "1.3.6.1.2.1.1.5.0";  // read-write (DisplayString)

// .iso.org.dod.internet.mgmt.mib-2.system.sysLocation (.1.3.6.1.2.1.1.6)
static char sysLocation[20] PROGMEM   = "1.3.6.1.2.1.1.6.0";  // read-write (DisplayString)

// .iso.org.dod.internet.mgmt.mib-2.system.sysServices (.1.3.6.1.2.1.1.7)
static char sysServices[20] PROGMEM   = "1.3.6.1.2.1.1.7.0";  // read-only  (Integer)

// Arduino defined OIDs
// .iso.org.dod.internet.private (.1.3.6.1.4)
// .iso.org.dod.internet.private.enterprises (.1.3.6.1.4.1)
// .iso.org.dod.internet.private.enterprises.arduino (.1.3.6.1.4.1.36582)
// .iso.org.dod.internet.private.enterprises.arduino.value.valA0-A5 (.1.3.6.1.4.1.36582.3.1-6)
/*
static char valA0[] PROGMEM   = "1.3.6.1.4.1.36582.3.1.0";  // read-only  (Integer)

static char valA1[] PROGMEM   = "1.3.6.1.4.1.36582.3.2.0";  // read-only  (Integer)

// .iso.org.dod.internet.private.enterprises.arduino.value.valD0-D13 (.1.3.6.1.4.1.36582.3.7-20)
static char valD0[] PROGMEM   = "1.3.6.1.4.1.36582.3.7.0";  // read-only  (Integer)

static char valD1[] PROGMEM   = "1.3.6.1.4.1.36582.3.8.0";  // read-only  (Integer)
*/
static char alarme1[24] PROGMEM = "1.3.6.1.4.1.36582.3.1.0";  // read-only  (Integer)
static char alarme2[24] PROGMEM = "1.3.6.1.4.1.36582.3.2.0";  // read-only  (Integer)
static char alarme3[24] PROGMEM = "1.3.6.1.4.1.36582.3.3.0";  // read-only  (Integer)
static char relay[24] PROGMEM = "1.3.6.1.4.1.36582.3.7.0";  // read-only  (Integer)


static char locDescr[20] = "Agentuino";

static char locObjectID[20] = "1.3.6.1.4.1.36582";
static uint32_t locUpTime = 0;
static char locContact[20] = "Eric Gionet";
static char locName[20] = "Agentuino";
static char locLocation[20] = "Nova Scotia, CA";
static int32_t locServices = 7;
boolean localarme1 = 0; 
boolean localarme2 = 0; 
boolean localarme3 = 0;
boolean locrele = 0;
boolean statusalarme1 = 0;
boolean statusalarme2 = 0;
boolean statusalarme3 = 0;
boolean statusrele = 0;

//uint32_t prevMillis = millis();
uint32_t dispMillis = 0;


char oid[SNMP_MAX_OID_LEN];
SNMP_API_STAT_CODES api_status;
SNMP_ERR_CODES status;

const int switchPin1 = 2; // Reed switch to digital pin 2
const int switchPin2 = 3; // Reed switch to digital pin 3
const int switchPin3 = 4; // Reed switch to digital pin 3
const int rele = 7;
boolean disparou;
boolean disptempo;

long lastDebounceTime = 0;
long debounceDelay = 1500;

int lastswitch1State = HIGH;
int lastswitch2State = HIGH;
int lastswitch3State = HIGH;
int staterelay = HIGH;

void pduReceived()
{
  SNMP_PDU pdu;
  Serial.println("UDP Packet Received...");
  api_status = Agentuino.requestPdu(&pdu);
  if ( (pdu.type == SNMP_PDU_GET || pdu.type == SNMP_PDU_GET_NEXT || pdu.type == SNMP_PDU_SET)
    && pdu.error == SNMP_ERR_NO_ERROR && api_status == SNMP_API_STAT_SUCCESS ) {
    pdu.OID.toString(oid);
    Serial.print("OID = ");
    Serial.println(oid);
    
    if ( pdu.type == SNMP_PDU_SET ) {
      status = SNMP_ERR_READ_ONLY;
    } else if ( strcmp_P(oid, sysDescr ) == 0 ) {
      status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locDescr);
    } else if ( strcmp_P(oid, sysUpTime ) == 0 ) {
      status = pdu.VALUE.encode(SNMP_SYNTAX_TIME_TICKS, locUpTime);
    } else if ( strcmp_P(oid, sysName ) == 0 ) {
      status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locName);
    } else if ( strcmp_P(oid, sysContact ) == 0 ) {
      status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locContact);
    } else if ( strcmp_P(oid, sysLocation ) == 0 ) {
      status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locLocation);
    } else if ( strcmp_P(oid, sysServices) == 0 ) {
      status = pdu.VALUE.encode(SNMP_SYNTAX_INT, locServices);
     } else if ( strcmp_P(oid, sysObjectID) == 0 ) {
      status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locObjectID);
    } else if ( strcmp_P(oid, alarme1) == 0 ) {
      status = pdu.VALUE.encode(SNMP_SYNTAX_INT, localarme1);
    } else if ( strcmp_P(oid, alarme2) == 0 ) {
      status = pdu.VALUE.encode(SNMP_SYNTAX_INT, localarme2);
    } else if ( strcmp_P(oid, alarme3) == 0 ) {
      status = pdu.VALUE.encode(SNMP_SYNTAX_INT, localarme3);
    } else if ( strcmp_P(oid, relay) == 0 ) {
      status = pdu.VALUE.encode(SNMP_SYNTAX_INT, locrele);
    
    } else {
      status = SNMP_ERR_NO_SUCH_NAME;
    }
    pdu.type = SNMP_PDU_RESPONSE;
    pdu.error = status;
    Agentuino.responsePdu(&pdu);
  }
  Agentuino.freePdu(&pdu);
  
}



void setup() {

  Serial.begin(9600);  // Inicia conexao serial para monitoramento
   pinMode(switchPin1, INPUT);        // switchPin1 is an input
  digitalWrite(switchPin1, HIGH);    // Activate internal pullup resistor
  pinMode(switchPin2, INPUT);        // switchPin1 is an input
  digitalWrite(switchPin2, HIGH);    // Activate internal pullup resistor
  pinMode(switchPin3, INPUT);        // switchPin1 is an input
  digitalWrite(switchPin3, HIGH);    // Activate internal pullup resistor
  pinMode(rele, OUTPUT);      // rele is an output
  digitalWrite(rele, HIGH); 

  Ethernet.begin(mac);
  
  disparou = false;
  disptempo = true;
  
//  Serial.println("Ethernet iniciado");
  
  #ifdef AVR
    Wire.begin();
  #else
    Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
  #endif


  
  api_status = Agentuino.begin();

  if ( api_status == SNMP_API_STAT_SUCCESS ) {
    Agentuino.onPduReceive(pduReceived);
    delay(10);
    Serial.println("SNMP Agent Initiated...");
    return;
  } else
  {
  delay(10);
  Serial.print("SNMP Agent failed!");
  }

}


void loop() {
    int somaledsyellow = 0; //variavel para somar os valores para acionar os leds amarelo via i2c
    int somaledsred = 0; //variavel para somar os valores para acionar os leds vermelho via i2c
    int totalleds = 0; //variavel para totalizar os valores para acionar os leds amarelo e vermelho via i2c
    int reading1 = digitalRead(switchPin1); // estado do sensor magnetico 1
    int reading2 = digitalRead(switchPin2); //estado do sensor magnetico 2
    int reading3 = digitalRead(switchPin3); // estado do sensor magnetico 3
    staterelay = digitalRead(rele); //estado do rele
    
    // se os sensores magneticos nao foram acionados e depois de acionados passaram-se mais de 5 minutos acende os leds verdes
    if ((reading1) && (reading2) && (reading3) && (disptempo)) {
       digitalWrite(rele,HIGH); // rele e desligado
       Wire.beginTransmission(32); //endereca o modulo I2c no endereco 32
       Wire.write(248); // escreve o valor para acender todos os leds
       Wire.endTransmission(); // finaliza a transmissao
    }
    else
    {
      if ((reading1 != lastswitch1State) || (reading2 != lastswitch2State) || (reading3 != lastswitch3State)) {
          lastDebounceTime = millis(); // se  mudou o estado de um dos sensores magneticos grava o tempo com a funcao millis
      }   
      if ((millis() - lastDebounceTime) > debounceDelay) { //Se passou mais de 1500ms com o estado modificado o rele e acionado e toca a sirene
         if ((reading1 == 0) || (reading2 == 0) || (reading3 == 0)) { 
              digitalWrite(rele,LOW); // o rele e ligado
         }
      }
      
      if (reading1 == LOW) { //se o sensor magnetico 1 estiver em estado baixo ou seja acionado
           statusalarme1 = 1; // o status do sensor magnetico 1 e colocado em 1
           somaledsred = somaledsred + 8; //liga o primeiro led vermelho da esquerda pra direita
      }
      else
      {
           somaledsyellow = somaledsyellow + 1; //se o sensor nao foi acionado acende o primeiro led amarelo da esquerda pra direita
           statusalarme1 = 0; // o status do sensor magnetico 1 e colocado em 0
      }
    
      if (reading2 == LOW) { //se o sensor magnetico 2 estiver em estado baixo ou seja acionado
          statusalarme2 = 1; // o status do sensor magnetico 1 e colocado em 1
          somaledsred = somaledsred + 16; //liga o segundo led vermelho da esquerda pra direita
      }
      else
      {
           somaledsyellow = somaledsyellow + 2; //se o sensor nao foi acionado acende o segundo led amarelo da esquerda pra direita
           statusalarme2 = 0; // o status do sensor magnetico 2 e colocado em 0
      }

      if (reading3 == LOW) { //se o sensor magnetico 3 estiver em estado baixo ou seja acionado
          statusalarme3 = 1; // o status do sensor magnetico 3 e colocado em 1
          somaledsred = somaledsred + 32; //liga o terceiro led vermelho da esquerda pra direita
      }
      else
      {
          somaledsyellow = somaledsyellow + 4;//se o sensor nao foi acionado acende o terceiro led amarelo da esquerda pra direita
          statusalarme3 = 0;  // o status do sensor magnetico 3 e colocado em 0
       }

       totalleds = 255 - (somaledsyellow + somaledsred); //totaliza os valores de escrita para os leds amarelos e vermelhos
       Wire.beginTransmission(32);
       Wire.write(255);
       Wire.write(totalleds); // escreve o valor correspondente para acionar ou desacionar os leds vermelhos e amarelos
       Wire.endTransmission();
       
       if (!disparou) { // se o alarme nao disparou
              dispMillis = millis(); 
              disptempo = false;
              disparou = true;
       }
          
       //Aguarda 5 minutos para parar de tocar a sirene
       if ((millis() - dispMillis > 300000) && (!disptempo)){
              digitalWrite(rele,HIGH);
              //  Serial.print("Parar a sirene");
              disptempo = true;
              disparou = false;
       }
  }
    lastswitch1State = reading1; //ultimo estado do sensor magnetico 1
    lastswitch2State = reading2; //ultimo estado do sensor magnetico 2
    lastswitch3State = reading3; //ultimo estado do sensor magnetico 3
    
   
    Agentuino.listen(); //O agentuino fica em espera
    // Atualiza os estados dos sensores para as variaveis a serem lidas via SNMP
    localarme1 = statusalarme1; 
    localarme2 = statusalarme2;  
    localarme3 = statusalarme3;
    locrele = staterelay; //atualiza o estado do rele para ser lido via SNMP
}



Observem que mais uma vez utilizamos o agentuino para disponibilizar os dados dos sensores e do relé para serem lidos pelo Zabbix (vide posts anteriores).

É isso aí pessoal. Quaisquer dúvidas entrem em contato!