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!