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