368d6fafea
Code backup
235 lines
5.3 KiB
C++
235 lines
5.3 KiB
C++
#include <esp_now.h>
|
|
#include <WiFI.h>
|
|
#include <SimpleDHT.h>
|
|
#include <WiFiUdp.h>
|
|
#include <Arduino_SNMP.h>
|
|
#include <SSD1306.h>
|
|
#include <Fs.h>
|
|
#include <SPIFS.h>
|
|
|
|
#define DHTPIN 4
|
|
#define INTERVAL 100
|
|
#define ESPNOW_CHANNEL 1
|
|
#define CONFIG_PATH "/conf.bin"
|
|
#define SSID "SSID"
|
|
#define PASSWORD "12345678"
|
|
#define IP "192.168.0.134"
|
|
|
|
WiFiUDP udp;
|
|
SNMPAgent snmp = SNMPAgent("public"); //Inicia o SMMPAgent
|
|
|
|
//Referências para o SNMP
|
|
char* strHumidity;
|
|
char* strTemperature;
|
|
|
|
//Valores caso nada esteja salvo no arquivo de configuração
|
|
int maxHumidity = 65;
|
|
int minHumidity = 55;
|
|
|
|
//parametros: address,SDA,SCL
|
|
SSD1306 display(0x3c, 21, 22); //construtor do objeto que controlaremos o display
|
|
uint8_t slaveMacAddress[] = {0x1A,0xFE,0x34,0xA5,0x90,0x69};
|
|
// uint8_t slaveMacAddress[] = {0x18,0xFE,0x34,0xA5,0x90,0x69};
|
|
|
|
esp_now_peer_info_t slave;
|
|
|
|
//Objeto que realiza a leitura da umidade
|
|
SimpleDHT22 dht;
|
|
|
|
//Variável para guardarmos o valor da umidade
|
|
float humidity = 0;
|
|
|
|
//Variável para guardarmos o valor da temperatura
|
|
float temperature = 0;
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
|
|
strHumidity = (char*)malloc(6);
|
|
strTemperature = (char*)malloc(6);
|
|
memset(strHumidity, 0, 6);
|
|
memset(strTemperature, 0, 6);
|
|
|
|
if(SPIFFS.begin(true))
|
|
{
|
|
loadConfig();
|
|
}
|
|
else
|
|
{
|
|
//Se não conseguiu inicializar
|
|
Serial.println("SPIFFS Mount Failed");
|
|
}
|
|
|
|
setupWiFi();
|
|
setupSNMP();
|
|
setupDisplay();
|
|
setupESPNow();
|
|
setupSlave();
|
|
}
|
|
|
|
void loop() {
|
|
readSensor();
|
|
verifySNMP();
|
|
showOnDisplay();
|
|
verifyHumidity();
|
|
delay(INTERVAL);
|
|
}
|
|
|
|
void setupWiFi()
|
|
{
|
|
WiFi.disconnect();
|
|
WiFi.mode(WIFI_STA);
|
|
|
|
WiFi.begin(SSID, PASSWORD);
|
|
Serial.println("");
|
|
|
|
// Wait for connection
|
|
while (WiFi.status() != WL_CONNECTED) {
|
|
delay(500);
|
|
Serial.print(".");
|
|
}
|
|
|
|
Serial.println("");
|
|
Serial.print("Connected to ");
|
|
Serial.println(SSID);
|
|
|
|
//Configura o IP
|
|
IPAddress ipAddress;
|
|
ipAddress.fromString(IP);
|
|
WiFi.config(ipAddress, WiFi.gatewayIP(), WiFi.subnetMask());
|
|
|
|
Serial.print("IP address: ");
|
|
Serial.println(WiFi.localIP());
|
|
}
|
|
|
|
void setupSNMP()
|
|
{
|
|
//Inicializa o snmp
|
|
snmp.setUDP(&udp);
|
|
snmp.begin();
|
|
//Adiciona o OID para umidade (apenas leitura)
|
|
snmp.addStringHandler(".1.3.6.1.4.1.12345.0", &strHumidity, false);
|
|
//Adiciona o OID para temperatura (apenas leitura)
|
|
snmp.addStringHandler(".1.3.6.1.4.1.12345.1", &strTemperature, false);
|
|
//Adiciona o OID para umidade máxima (leitura e escrita)
|
|
snmp.addIntegerHandler(".1.3.6.1.4.1.12345.2", &maxHumidity, true);
|
|
//Adiciona o OID para umidade mínima (leitura e escrita)
|
|
snmp.addIntegerHandler(".1.3.6.1.4.1.12345.3", &minHumidity, true);
|
|
}
|
|
|
|
void setupDisplay(){
|
|
display.init(); //inicializa o display
|
|
display.flipScreenVertically();
|
|
display.setFont(ArialMT_Plain_10); //configura a fonte
|
|
}
|
|
|
|
void setupESPNow() {
|
|
//Se a inicialização foi bem sucedida
|
|
if (esp_now_init() == ESP_OK) {
|
|
Serial.println("ESPNow Init Success");
|
|
}
|
|
//Se houve erro na inicialização
|
|
else {
|
|
Serial.println("ESPNow Init Failed");
|
|
ESP.restart();
|
|
}
|
|
}
|
|
|
|
void verifySNMP()
|
|
{
|
|
//Deve ser sempre chamado durante o loop principal
|
|
snmp.loop();
|
|
|
|
//Se aconteceu alteração de um dos valores
|
|
if(snmp.setOccurred)
|
|
{
|
|
//Salva as os valores
|
|
saveConfig();
|
|
//Reseta a flag de alteração
|
|
snmp.resetSetOccurred();
|
|
}
|
|
}
|
|
|
|
//Verifica se a umidade está fora dos limites e informa ao ESP8266
|
|
//se o relê deve ficar ligado ou desligado
|
|
void verifyHumidity(){
|
|
if(humidity > maxHumidity)
|
|
{
|
|
sendRelayStatus(LOW);
|
|
}
|
|
else if(humidity < minHumidity)
|
|
{
|
|
sendRelayStatus(HIGH);
|
|
}
|
|
}
|
|
|
|
//Função responsável por realizar a leitura
|
|
//da umidade e temperatura
|
|
void readSensor(){
|
|
float h, t;
|
|
int status = dht.read2(DHTPIN, &t, &h, NULL);
|
|
|
|
if (status == SimpleDHTErrSuccess) {
|
|
humidity = h;
|
|
temperature = t;
|
|
//Transforma os dados em string
|
|
String strH = String(humidity);
|
|
strH.toCharArray(strHumidity, strH.length());
|
|
String strT = String(temperature);
|
|
strT.toCharArray(strTemperature, strT.length());
|
|
}
|
|
}
|
|
|
|
//Mostra a umidade no display
|
|
void showOnDisplay(){
|
|
//apaga o conteúdo do display
|
|
display.clear();
|
|
display.setTextAlignment(TEXT_ALIGN_LEFT);
|
|
display.setFont(ArialMT_Plain_16);
|
|
|
|
display.drawString(0, 0, "Humidity: ");
|
|
display.drawString(70, 0, String(humidity));
|
|
display.drawString(0, 30, "Temperat: ");
|
|
display.drawString(75, 30, String(temperature));
|
|
display.display(); //mostra o conteúdo na tela
|
|
|
|
}
|
|
|
|
void saveConfig()
|
|
{
|
|
Serial.println("saveConfig");
|
|
//Abre o arquivo para escrita
|
|
File file = SPIFFS.open(CONFIG_PATH, FILE_WRITE);
|
|
|
|
//Se não conseguiu abrir/criar o arquivo
|
|
if(!file)
|
|
{
|
|
Serial.println("Failed to open file for writing");
|
|
return;
|
|
}
|
|
|
|
file.seek(0);
|
|
file.write((uint8_t*)&maxHumidity, sizeof(maxHumidity));
|
|
file.write((uint8_t*)&minHumidity, sizeof(minHumidity));
|
|
//Fecha o arquivo
|
|
file.close();
|
|
}
|
|
|
|
void loadConfig()
|
|
{
|
|
Serial.println("loadConfig");
|
|
File file = SPIFFS.open(CONFIG_PATH, FILE_READ);
|
|
|
|
//Se arquivo não existe
|
|
if(!file)
|
|
{
|
|
//Na primeira vez o arquivo ainda não foi criado
|
|
Serial.println("Failed to open file for reading");
|
|
return;
|
|
}
|
|
|
|
file.read((uint8_t*)&maxHumidity, sizeof(maxHumidity));
|
|
file.read((uint8_t*)&minHumidity, sizeof(minHumidity));
|
|
//Fecha o arquivo
|
|
file.close();
|
|
} |