//https://github.com/Andersonferr2020/ESP32-WNOLOGY
#include "DHT.h"
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include<LiquidCrystal_I2C.h>
#include <Wire.h>
// Registra o nome da rede wifi que será usada e sua respectiva senha em variáveis
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Registra endereço do MQTT Broker que será utilizado na variável
char* mqtt_server = "broker.app.wnology.io";
//**************************celula 3 gravado no esp32***********************************************************************************************
const char* deviceID="67de237bd11c4bbb51bc22";
const char* accesskey="4395ecfa-c4e2-4af0-a845-820e20fd1c";
const char* secretkey="3091fdc1af08119d27b45e60cdacdc6b85849e8e89626181adb90de65f2bc8";
const char* state_topic="wnology/67de237bd11c4bbb51bc22/state"; //Registra configuração para envio de informações na variável
const char* command_topic="wnology/67de237bd11c4bbb51bc22/command";//Registra configuração para recebimento de dados na variável
//**********************************************************************************************************************************
const char* comando;//
//bool setMotor = 0;
bool Motor = 0;
bool OldMotor = 0;
#define botaoLigado 4
#define botaoDesliga 5
#define FeedBack 2
#define LigaMotor 27
#define saida1 12 // LED indica Motor Ligado
#define saida2 13 // LED indica Motor Desligado
#define saida3 14 //Define LED indica FALHA
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
// Definição da saída conectada ao sensor DHT
#define DHTPIN 32
// Uncomment whatever DHT sensor type you're using
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Initialize DHT sensor
DHT dht(DHTPIN, DHTTYPE);
// Variables to hold sensor readings
float temp, OldTemp;
float hum, OldHum;
//Variável para monitorar o estado do motor
int EstadoMotor = 0;
char json[90];
DynamicJsonDocument doc(1024);
LiquidCrystal_I2C lcd(0x27,16,2);
void setup() {
lcd.begin(16,2);
lcd.init(); // Serve para iniciar a comunicação com o display já conectado
lcd.backlight(); // Serve para ligar a luz do display
lcd.clear(); // Serve para limpar a tela do display
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(botaoLigado, INPUT);
pinMode(botaoDesliga, INPUT);
pinMode(FeedBack, INPUT);
pinMode(saida1, OUTPUT);
pinMode(saida2, OUTPUT);
pinMode(saida3, OUTPUT);
pinMode(LigaMotor, OUTPUT);
digitalWrite(saida2,HIGH);
dht.begin();
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
lcd.setCursor(0, 0);
lcd.print("Conectando WiFi");
Serial.println(ssid);
lcd.setCursor(2, 1);
lcd.print( ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
lcd.setCursor(0, 7);
lcd.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WiFi conectado");
delay(1000);
Serial.print("IP address: ");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(WiFi.localIP());
Serial.println(WiFi.localIP());
Serial.print("MAC address: ");
Serial.println(WiFi.macAddress());
lcd.setCursor(0, 1);
lcd.print(WiFi.macAddress());
delay(1000);
}
void callback(char* topic, byte* message, unsigned int length) { //Função quwe possibilita receber dados da wegnology no formato json, e atribuir o esperado à variáveis do programa
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
Serial.println();
deserializeJson(doc,messageTemp);//
comando=doc["name"];
Motor=doc["payload"]["liga"];
//Motor=doc["payload"];
Serial.print("Comando recebido:");
Serial.println(comando);
Serial.print("Pacote recebido:");
//Serial.println(setMotor);
Serial.println(Motor);
//----------------------------------------------------INICIO: LOGICA DE ACIONAMENTO REMOTO ---------------------------------------------------------------------------------------
if (String(topic) == command_topic) {
Serial.print("Changing output to ");
if(Motor==1){
Serial.println("true");
//setMotor = 1;
digitalWrite(saida1,HIGH);
digitalWrite(LigaMotor, HIGH); //Aciona relê de ligamento da contatora (Relè aciona em Zero)
digitalWrite(saida2,LOW);//Liga indicação motor desligado
EstadoMotor = 1;// Informa a plataforma IoT que o motor foi ligado
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Motor Ligado");
lcd.setCursor(0, 1);
lcd.print("REMOTAMENTE");
delay(2000);
}
if(Motor==0){
Serial.println("false");
//setMotor = 0;
digitalWrite(saida1,LOW);
digitalWrite(LigaMotor, LOW); //desliga relê de ligamento da contatora
EstadoMotor = 0;// Informa a plataforma IoT que o motor foi desligado
digitalWrite(saida2,HIGH);// indicação de motor desligado
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Motor Desligado");
lcd.setCursor(0, 1);
lcd.print("REMOTAMENTE");
delay(2000);
}
}
//-----------------------------------Fim da Logica de Acionamento Remoto ----------------------------------------------------------------------------------------------
}
void reconnect() {
// Loop until we're reconnected
if (!client.connect(deviceID,accesskey,secretkey)) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CONECTANDO MQTT ...");
if (client.connect(deviceID,accesskey,secretkey))
{
Serial.println("connected");
// Subscribe
lcd.clear();
lcd.setCursor(2, 1);
lcd.print("CONECTADO");
client.subscribe(command_topic);
}
else
{
Serial.print("failed, rc=");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CONECÇÃO FALHOU");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("NOVA TENTATIVA...");
lcd.setCursor(1, 1);
lcd.print("EM 3 SEGUNDOS...");
// Wait 3 seconds before retrying
delay(3000);
}
}
}
void loop()
{
if (!client.connected())
{
reconnect();
}
client.loop();
client.subscribe(command_topic);
//-------------------------------------------------------LOGICA DE ACIONAMENTO LOCAL------------------------------------------------------------------------------------------
while(digitalRead(botaoLigado)==HIGH) //Efetua a leitura do botão Liga
{
digitalWrite(saida1,HIGH);//Liga LED de sinalização
digitalWrite(LigaMotor, LOW);// LIga MOtor
digitalWrite(saida2,LOW);//Desliga indicação de acionamento remoto
EstadoMotor = 1;// Informa a plataforma IoT que o motor foi ligado
Motor = 1;
delay(500);//Aguarda um tempo para confirmação do feedBack
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Motor Ligado");
lcd.setCursor(0, 1);
lcd.print("LOCALMENTE");
}
while((digitalRead(FeedBack)== HIGH) && (EstadoMotor==1))//Verifica se houve falha no Feedback
{
digitalWrite(saida1,LOW);
digitalWrite(saida2,LOW);
digitalWrite(LigaMotor, LOW);//Desliga MOtor
digitalWrite(saida3,HIGH);
EstadoMotor = 2;// Identificada Falha do Motor
delay(3000);
EstadoMotor = 0;// Motor Desligado
Motor = 0;
digitalWrite(saida3,LOW);
digitalWrite(saida2,HIGH);
}
while(digitalRead(botaoDesliga) == HIGH)//Verifica se o botão desliga foi pressionado
{
EstadoMotor = 0;//Motor desligado
Motor = 0;
digitalWrite(saida1,LOW);
digitalWrite(saida2,HIGH);
digitalWrite(LigaMotor, HIGH);
digitalWrite(saida3,LOW);//Desliga indicação de acionamento remoto
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Motor Desligado");
lcd.setCursor(0, 1);
lcd.print("LOCALMENTE");
}
//---------------------------------------Fim da Logica de Acionamento Local--------------------------------------------------------------------------------------------------
long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
// New DHT sensor readings
hum = dht.readHumidity();
// Read temperature as Celsius (the default)
temp = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
//temp = dht.readTemperature(true);
//Atualiza o display apenas quando houver mudança de estado
if((temp != OldTemp) || (hum != OldHum))
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("TEMPERAT.=");
lcd.setCursor(10,0);
lcd.print(temp,1);
lcd.setCursor(15,0);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("HUMIDADE=");
lcd.setCursor(9,1);
lcd.print(hum,1);
lcd.setCursor(14,1);
lcd.print("%");
OldTemp = temp;
OldHum = hum;
}
Serial.print("Temperature: ");
Serial.println(temp);
Serial.print("Humidity: " );
Serial.println(hum);
Serial.print("EstadoMotor: ");
Serial.println(EstadoMotor);
Serial.println(Motor);
//Composição da String que transmitira os dados no formato Json
String cjson = "{\"data\": {\"Temperatura\": " + String(temp) + ", \"Umidade\": " + String(hum)+ ",\"EstadoMotor\": " + String(EstadoMotor)+ "} }";
cjson.toCharArray(json,90);
client.publish(state_topic,json);
}
}