Por ser uma solução para
muitos dos problemas que temos hoje em dia, vou seguir falando hoje do ESP32
LORA, uma maravilha para o mundo da Internet das Coisas. Neste artigo trato
novamente sobre segurança ao discorrer sobre um alarme com barreira
infravermelho (IR). Nosso projeto, então, é formado por dois ESP32 Lora se
comunicando.
Um será o EMISSOR e estará
ligado ao sensor de barreira infravermelho e o outro, o RECEPTOR, estará ligado
a um módulo relé. A cada um segundo, o EMISSOR envia um código para o RECEPTOR
com o estado atual da barreira. Tudo isso pretende evitar problemas que
geralmente ocorrem com a ligação de barreiras utilizando fios. Nossa intenção,
portanto, é substituir toda fiação por rádios Lora.
Lora Esp32 Oled
Módulo Relé
Sensor Infravermelho Ativo (IVA)
Características:
·
Feixe duplo
·
Ajuste por mira
·
Esse sensor infravermelho emite luz
infravermelha através de um ponto e recebe esse sinal em outro ponto.
·
É como se houvesse uma linha invisível e ao
atravessá-la é disparado o alarme.
·
Devido a essa característica, o sensor ativo é
também chamado de sensor de barreira ou sensor perimetral.
·
Em relação a distância de funcionamento, ela
pode variar de acordo com as características e fabricante do sensor.
·
Importante notar que esta distância deve ser
informada pelo fabricante do Sensor Infravermelho Ativo (IVA).
·
Em caso de presença da chuva e da neblina a
distância de operação cai consideravelmente (aprox. pela metade).
Funcionamento:
·
O Sensor Infravermelho Ativo(IVA) é um par de
transmissor e receptor de sinais de luz infra-vermelha invisível ao ser humano.
·
Onde o transmissor emite sinais de luz
infra-vermelha e o receptor recebe esses sinais, formando uma linha invisível.
·
A interrupção deste sinal de luz aciona uma
central de alarme ou aciona qualquer outro comando que se faça necessário.
·
A fim de evitar alarmes falsos causados pela
interrupção acidental do feixe de luz, existem sensores IVA com dois feixes de
luz, que devem ser interrompidos simultaneamente para gerar um alarme.
Montagem
Emissor
Receptor
Bibliotecas
Adicione a seguinte biblioteca
“Adafruit SSD1306”.
Basta acessar “Sketch >>
Incluir Bibliotecas >> Gerenciar Bibliotecas...”
Programas
Criaremos dois programas: um
para o ESP32 Lora que trabalhará como EMISSOR e outro programa para o ESP32
Lora que trabalhará como RECEPTOR.
Programa EMISSOR
O programa EMISSOR ficará
configurado para verificar o estado da barreira. A cada 1 segundo enviará o
estado atual da barreira para o RECEPTOR, além de sempre atualizar no display.
Programa EMISSOR
Vamos incluir as bibliotecas e
fazer definições do chip Lora.
#include <SPI.h> #include <LoRa.h> #include <Wire.h> #include "SSD1306.h" //pino rele #define PIN_RELAY 23 // Pin definetion of WIFI LoRa 32 // HelTec AutoMation 2017 support@heltec.cn #define SCK 5 // GPIO5 -- SX127x's SCK #define MISO 19 // GPIO19 -- SX127x's MISO #define MOSI 27 // GPIO27 -- SX127x's MOSI #define SS 18 // GPIO18 -- SX127x's CS #define RST 14 // GPIO14 -- SX127x's RESET #define DI00 26 // GPIO26 -- SX127x's IRQ(Interrupt Request) #define PABOOST true long int frequency = 433000000; int statusRelay = LOW; SSD1306 display(0x3c, 4, 15);
Setup
Nesta etapa, iremos definir os
pinos do Lora e fazer as configurações do display.
void setup() { pinMode(16,OUTPUT); pinMode(2,OUTPUT); Serial.begin(115200); pinMode(PIN_RELAY, INPUT); digitalWrite(16, LOW); // set GPIO16 low to reset OLED delay(50); digitalWrite(16, HIGH); // while OLED is running, must set GPIO16 in high display.init(); display.flipScreenVertically(); display.setFont(ArialMT_Plain_10); delay(1500); display.clear(); SPI.begin(SCK,MISO,MOSI,SS); LoRa.setPins(SS,RST,DI00); if (!LoRa.begin(frequency,PABOOST)) { display.drawString(0, 0, "Starting LoRa failed!"); display.display(); while (1); } LoRa.enableCrc(); display.drawString(0, 0, "LoRa Initial success!"); display.display(); delay(1000); }
Loop
No Loop, vamos configurar o
relé e definir o funcionamento dos leds.
void loop() { //recupera o estado do relé statusRelay = digitalRead(PIN_RELAY); //se o relé ativou if( statusRelay == HIGH ) { refreshDisplay("Estado Normal"); } else{ refreshDisplay("Ativar Alarme"); } display.drawString(0,45,"Freq: "+String(frequency)); display.display(); sendPacket(statusRelay); //acende LED interno para indicar que enviou o pacote e da um delay digitalWrite(2, HIGH); // turn the LED on (HIGH is the voltage level) delay(700); // wait for a second digitalWrite(2, LOW); // turn the LED off by making the voltage LOW delay(500); // wait for a second }
sendPacket e refreshDisplay
Agora, vamos tratar dos
parâmetros do status da barreira, do envio do pacote de dados e da atualização
de informações no display.
//envia o pacote na rede Lora //parâmetro: status da barreira (HIGH | LOW) void sendPacket(int status) { // envia um pacote LoRa.beginPacket(); LoRa.print("="); //delimitador LoRa.print(status); //1(ativo) ou 0(inativo) LoRa.print("#"); //delimitador LoRa.endPacket(); } //atualiza as informações no display void refreshDisplay(String str) { display.clear(); display.setTextAlignment(TEXT_ALIGN_LEFT); display.setFont(ArialMT_Plain_16); display.drawString(0, 0, str); display.display(); }
Programa RECEPTOR
O programa RECEPTOR ficará
escutando a rede Lora e, caso receba um pacote com o seguinte formato:
=S#
Onde: S pode ser 1 (ativado)
ou 0 (desativado)
= e # são delimitadores
De acordo com S, vamos ativar
ou desativar o relé ligado a ele.
Programa RECEPTOR
Desta vez no Receptor, vamos
incluir as bibliotecas e fazer definições do chip Lora.
#include <SPI.h> #include <LoRa.h> #include <Wire.h> #include "SSD1306.h" // Pin definetion of WIFI LoRa 32 // HelTec AutoMation 2017 support@heltec.cn #define SCK 5 // GPIO5 -- SX127x's SCK #define MISO 19 // GPIO19 -- SX127x's MISO #define MOSI 27 // GPIO27 -- SX127x's MOSI #define SS 18 // GPIO18 -- SX127x's CS #define RST 14 // GPIO14 -- SX127x's RESET #define DI00 26 // GPIO26 -- SX127x's IRQ(Interrupt Request) #define PABOOST true #define PIN_RELAY 23 SSD1306 display(0x3c, 4, 15); String rssi = "RSSI --"; String packSize = "--"; String packet ; long int frequency = 433000000; int statusRelay = LOW;
Setup
Diferentemente do Emissor, no
Receptor, o PIN_RELAY será OUTPUT porque aqui este relé deverá ser ativado.
Nesta parte do código ainda trabalhamos com o display e com o chip Lora.
void setup() { Serial.begin(115200); pinMode(PIN_RELAY, OUTPUT); pinMode(16,OUTPUT); digitalWrite(16, LOW); // set GPIO16 low to reset OLED delay(50); digitalWrite(16, HIGH); // while OLED is running, must set GPIO16 in high、 display.init(); display.flipScreenVertically(); display.setFont(ArialMT_Plain_10); delay(1500); display.clear(); SPI.begin(SCK,MISO,MOSI,SS); LoRa.setPins(SS,RST,DI00); if (!LoRa.begin(frequency,PABOOST)) { display.drawString(0, 0, "Starting LoRa failed!"); display.display(); while (1); } LoRa.enableCrc(); display.drawString(0, 0, "LoRa Initial success!"); display.drawString(0, 10, "Wait for incomm data..."); display.display(); delay(1000); LoRa.receive(); }
Loop e parserPacket
Nesta parte, configuramos a
impressão no display e tratamos do pacote de dados.
void loop() { int packetSize = LoRa.parsePacket(); //imprime na tela a frequencia atual que está configurada display.drawString(0,45,"Freq: "+String(frequency)); display.display(); if (packetSize) { parserPacket(packetSize); } } //faz o parser do pacote recebido para tratar os dados void parserPacket(int packetSize) { packet =""; packSize = String(packetSize,DEC); for (int i = 0; i < packetSize; i++) { packet += (char) LoRa.read(); } rssi = "RSSI " + String(LoRa.packetRssi(), DEC) ; parserData(); loraData(); }
parserData e loraData
Por fim, aqui temos uma função
que ativa o relé, bem como as últimas definições envolvendo o display.
void parserData() { // Serial.println(packet); //o primeiro byte do pacote tem o indice da frequencia que o emissor está usando, // colocamos esse valor em CMD para fazeras verificações String c1 = String(packet.charAt(0)); if(c1 == "="){ int c2 = String(packet.charAt(1)).toInt(); String c3 = String(packet.charAt(2)); if(c3 == "#"){ digitalWrite(PIN_RELAY,c2); } } } void loraData(){ display.clear(); display.setTextAlignment(TEXT_ALIGN_LEFT); display.setFont(ArialMT_Plain_16); display.drawString(0, 5, rssi); display.drawString(0 , 20 , packet); display.display(); }
Faça o download dos arquivos:
7 Comentários
Fernando,
ResponderExcluirNão sei a onde comentar... Vc gosta muito de esp8266 e esp32... Veja esse alarme inovador lançado ppr uma galera muito legal... https://konnected.io
Qual são os pinos de interrupção, saberia me dizer? Obrigado
ResponderExcluirSeria possível realizar o monitoramento de mais de uma barreira com monitoramento e envio independente?
ResponderExcluirno matching function for call to 'LoRaClass::begin(long int&, bool)'
ResponderExcluirGrande Mestre porque não consigo mandar o programa para o meus esp da heltec
sempre aparece esse erro
#include
ResponderExcluir#include
#include
#include "SSD1306.h"
// Pin definetion of WIFI LoRa 32
// HelTec AutoMation 2017 support@heltec.cn
#define SCK 5 // GPIO5 -- SX127x's SCK
#define MISO 19 // GPIO19 -- SX127x's MISO
#define MOSI 27 // GPIO27 -- SX127x's MOSI
#define SS 18 // GPIO18 -- SX127x's CS
#define RST 14 // GPIO14 -- SX127x's RESET
#define DI00 26 // GPIO26 -- SX127x's IRQ(Interrupt Request)
#define PABOOST true
#define PIN_RELAY 23
SSD1306 display(0x3c, 4, 15);
String rssi = "RSSI --";
String packSize = "--";
String packet ;
long int frequency = 433000000;
int statusRelay = LOW;
void setup() {
Serial.begin(115200);
pinMode(PIN_RELAY, OUTPUT);
pinMode(16,OUTPUT);
digitalWrite(16, LOW); // set GPIO16 low to reset OLED
delay(50);
digitalWrite(16, HIGH); // while OLED is running, must set GPIO16 in high、
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
delay(1500);
display.clear();
SPI.begin(SCK,MISO,MOSI,SS);
LoRa.setPins(SS,RST,DI00);
if (!LoRa.begin(frequency,PABOOST)) {
display.drawString(0, 0, "Starting LoRa failed!");
display.display();
while (1);
}
LoRa.enableCrc();
display.drawString(0, 0, "LoRa Initial success!");
display.drawString(0, 10, "Wait for incomm data...");
display.display();
delay(1000);
LoRa.receive();
}
void loop() {
int packetSize = LoRa.parsePacket();
//imprime na tela a frequencia atual que está configurada
display.drawString(0,45,"Freq: "+String(frequency));
display.display();
if (packetSize) {
parserPacket(packetSize);
}
}
//faz o parser do pacote recebido para tratar os dados
void parserPacket(int packetSize) {
packet ="";
packSize = String(packetSize,DEC);
for (int i = 0; i < packetSize; i++) {
packet += (char) LoRa.read();
}
rssi = "RSSI " + String(LoRa.packetRssi(), DEC) ;
parserData();
loraData();
}
void parserData()
{
// Serial.println(packet);
//o primeiro byte do pacote tem o indice da frequencia que o emissor está usando,
// colocamos esse valor em CMD para fazeras verificações
String c1 = String(packet.charAt(0));
if(c1 == "="){
int c2 = String(packet.charAt(1)).toInt();
String c3 = String(packet.charAt(2));
if(c3 == "#"){
digitalWrite(PIN_RELAY,c2);
}
}
}
void loraData(){
display.clear();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_16);
display.drawString(0, 5, rssi);
display.drawString(0 , 20 , packet);
display.display();
}
alguem consegui fazer este projeto?
ResponderExcluirBoa noie, eu conseguir
Excluir