//https://github.com/Andersonferr2020/ESP32-WNOLOGY
#include "DHT.h"
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.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="666c275107038cfd646b1b7d";
const char* accesskey="35480995-453a-4070-a355-80da5448049c";
const char* secretkey="c221c31a70f57c90d8d3ad74ca7a545a6ab5bc2d3a48e54ccc73fe75f7c8901c";
const char* state_topic="wnology/666c275107038cfd646b1b7d/state"; //Registra configuração para envio de informações na variável
const char* command_topic="wnology/666c275107038cfd646b1b7d/command";//Registra configuração para recebimento de dados na variável
//**********************************************************************************************************************************
const char* comando;//
bool setMotor = 0;
bool Motor = 0;
#define botaoLigado 4
#define botaoDesliga 5
#define FeedBack 2
#define LigaMotor 27 //Saída para Relê da Contatora
#define saida1 12 // LED indica Motor Ligado
#define saida2 13
#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;
float hum;
//Variável para monitorar o estado do motor
int EstadoMotor = 0;
char json[90];//Tamanho dos dados que serão enviados Json (caracteres)
DynamicJsonDocument doc(1024);
void setup() {
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 ");
Serial.println(ssid);
//WiFi.begin(ssid, password);
WiFi.begin("Wokwi-GUEST", "", 6);//para agilizar comunicação WiFi wokWi
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("MAC address: ");
Serial.println(WiFi.macAddress());
}
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"];
Serial.print("Comando recebido:");
Serial.println(comando);
Serial.print("Pacote recebido:");
Serial.println(setMotor);
//----------------------------------------------------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 1)
digitalWrite(saida2,HIGH);//Liga indicação de acionamento remoto
EstadoMotor = 1;// Informa a plataforma IoT que o motor foi ligado
}
else if(Motor==0){
Serial.println("false");
setMotor = 0;
digitalWrite(saida1,LOW);
digitalWrite(LigaMotor, LOW); //Relê de desligamento da contatora
EstadoMotor = 0;// Informa a plataforma IoT que o motor foi desligado
digitalWrite(saida2,LOW);//Desliga indicação de acionamento remoto
}
}
//-----------------------------------Fim da Logica de Acionamento Remoto ----------------------------------------------------------------------------------------------
}
void reconnect() {
// Loop until we're reconnected
while (!client.connect(deviceID,accesskey,secretkey)) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect(deviceID,accesskey,secretkey)) {
Serial.println("connected");
// Subscribe
client.subscribe(command_topic);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(1000);
}
}
}
void loop()
{
if (!client.connected())
{
reconnect();
}
client.loop();
client.subscribe(command_topic);
//-------------------------------------------------------LOGICA DE ACIONAMENTO LOCAL------------------------------------------------------------------------------------------
if(digitalRead(botaoLigado)==HIGH) //Efetua a leitura do botão Liga
{
digitalWrite(saida1,HIGH);//Liga LED de sinalização
digitalWrite(LigaMotor, HIGH);// LIga MOtor
digitalWrite(saida2,LOW);//Desliga indicação de acionamento remoto
EstadoMotor = 1;// Informa a plataforma IoT que o motor foi ligado
}
if((digitalRead(FeedBack)== HIGH) && (EstadoMotor==1))//Verifica se houve falha no Feedback
{
digitalWrite(saida1,LOW);
digitalWrite(LigaMotor, LOW);//Desliga MOtor
digitalWrite(saida3,HIGH);
EstadoMotor = 2;// Identificada Falha do Motor
delay(3000);
EstadoMotor = 0;// Informa plataforma que Motor foi desligado
}
if(digitalRead(botaoDesliga) == HIGH)//Verifica se o botão desliga foi pressionado
{
EstadoMotor = 0;//Motor desligado
digitalWrite(saida1,LOW);
digitalWrite(LigaMotor, LOW);
digitalWrite(saida2,HIGH);//Indica Motor desligado
}
//---------------------------------------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);
// Convert the value to a char array
char tempString[8];
dtostrf(temp, 1, 2, tempString);
Serial.print("Temperature: ");
Serial.println(tempString);
// Convert the value to a char array
char humString[8];
dtostrf(hum, 1, 2, humString);
Serial.print("Humidity: ");
Serial.println(humString);
char EstadoMotorString[8];
dtostrf(EstadoMotor, 1, 2, EstadoMotorString);
Serial.print("EstadoMotor: ");
Serial.println(EstadoMotorString);
Serial.println(comando);
Serial.println(setMotor);
String cjson = "{\"data\": {\"tEmperature\": " + String(temp) + ", \"hUmidity\": " + String(hum)+ ",\"EstadoMotor\": " + String(EstadoMotor)+ "} }";
cjson.toCharArray(json,90);
client.publish(state_topic,json);
}
}