Recents in Beach


Receba o meu conteúdo GRATUITAMENTE


ESP32 Lora - Alarme com Barreira IR



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.

ESP32 Lora Alarme com barreira IR

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

Lora ESP32 Oled

Módulo Relé

Módulo relé

Sensor Infravermelho Ativo (IVA)

Sensor infravermelho

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).

Sensor infravermelho

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
Emissor

Receptor
Receptor

Bibliotecas

Adicione a seguinte biblioteca “Adafruit SSD1306”.
Basta acessar “Sketch >> Incluir Bibliotecas >> Gerenciar Bibliotecas...”

Biblioteca


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:


Postar um comentário

7 Comentários

  1. Fernando,
    Nã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

    ResponderExcluir
  2. Qual são os pinos de interrupção, saberia me dizer? Obrigado

    ResponderExcluir
  3. Seria possível realizar o monitoramento de mais de uma barreira com monitoramento e envio independente?

    ResponderExcluir
  4. no matching function for call to 'LoRaClass::begin(long int&, bool)'
    Grande Mestre porque não consigo mandar o programa para o meus esp da heltec
    sempre aparece esse erro

    ResponderExcluir
  5. #include
    #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();
    }

    ResponderExcluir