Por Fernando Koyanagi 1
Objetivo Nosso objetivo será criar um projeto no qual teremos dois ESP32 Lora se comunicando, um (EMISSOR) ligado ao sensor de barreira infravermelho e outro (RECEPTOR) ligado á um módulo relé. A cada um segundo, o EMISSOR envia um código para o RECEPTOR com o estado atual da barreira. 2
Lora Esp32 Olé 3
Módulo Relé 4
Sensor Infravermelho Ativo (IVA)
Características Sensor Infravermelho Ativo (IVA) -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). 6
Sensor Infravermelho Ativo (IVA) 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. 7
Demonstração
Em www.fernandok.com Seu e-mail 9
Não conectado Montagem
Montagem
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. 13
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. 14
#include <SPI.h> #include <LoRa.h> #include <Wire.h> #include "SSD1306.h" //pino rele #define PIN_RELAY 23 Programa EMISSOR // 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 //frequencia de comunicação long int frequency = 433000000; //estato do relé int statusrelay = LOW; SSD1306 display(0x3c, 4, 15); 15
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 Setup 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 void loop() { //recupera o estado do relé statusrelay = digitalread(pin_relay); //se o relé ativou if( statusrelay == HIGH ) { refreshdisplay( Ativar Alarme ); else{ refreshdisplay( Estado Normal ); 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(500); // 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 //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 #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;
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); Setup 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 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 void parserdata() { // lembrando formato do pacote: =S# -> onde S é o estado da barreira (1 ou 0) String c1 = String(packet.charAt(0)); // delimitador 1 if(c1 == "="){ int c2 = String(packet.charAt(1)).toInt(); // status String c3 = String(packet.charAt(2)); // delimitador 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();
Em www.fernandok.com Download arquivos PDF e INO do código fonte 24