#include "DHTesp.h"
#include "ESP32Servo.h"
#include <LiquidCrystal_I2C.h>
#include "WiFi.h"
#include "HTTPClient.h"
#include "PubSubClient.h"
#include <Arduino_JSON.h>
const char* redeWiFi = "Wokwi-GUEST";
const char* senha = "";
const char* mqttBroker = "broker.emqx.io";
const int mqttPort = 1883;
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
HTTPClient cliente;
LiquidCrystal_I2C lcd(0x27, 20, 4);
Servo janela1, janela2;
#define Jan1Pin 4
#define Jan2Pin 16
bool janelasAbertas = false;
DHTesp dhtSensor;
#define DHTPin 15
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
#define IRLed 17
bool ACLigado = false;
#define PIRPin 5
int meiaHora = 10000; // para simulação, 5 segundos. meia hora: 1800000
void setup() {
Serial.begin(115200);
WiFi.begin(redeWiFi, senha, 6);//esperando a internet c onectar
Serial.println("Conectando a rede...");
while(WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("Conectado...");
dhtSensor.setup(DHTPin, DHTesp::DHT22);
pinMode(IRLed, OUTPUT);
pinMode(PIRPin, INPUT);
lcd.begin (20,4);
janela1.attach(Jan1Pin);
janela2.attach(Jan2Pin);
mqttClient.setServer(mqttBroker, mqttPort);//instancia o broker
while(!mqttClient.connected()){ //esperando o broker conectar
String clientId = "nsifb-";
clientId += String(random(0xffff), HEX);
if(mqttClient.connect(clientId.c_str())){
Serial.println("Conectado ao Broker");
//mqttClient.subscribe("senai");
} else {
delay(500);
Serial.println("Conectando ao broker...");
}
}
}
void ligarAC() {
if(ACLigado == false) {
Serial.println("Ligando AC");
digitalWrite(IRLed, HIGH);
delay(100);
digitalWrite(IRLed, LOW);
delay(300);
digitalWrite(IRLed, HIGH);
delay(100);
digitalWrite(IRLed, LOW);
ACLigado = true;
}
}
void desligarAC() {
if(ACLigado == true) {
Serial.println("Desligando AC");
digitalWrite(IRLed, HIGH);
delay(300);
digitalWrite(IRLed, LOW);
delay(100);
digitalWrite(IRLed, HIGH);
delay(300);
digitalWrite(IRLed, LOW);
ACLigado = false;
}
}
void abrirJanelas() {
if(janelasAbertas == false) {
Serial.print("Abrindo janelas\n");
janela1.write(180);
janela2.write(180);
janelasAbertas = true;
}
}
void fecharJanelas() {
if(janelasAbertas == true) {
Serial.print("Fechando janelas\n");
janela1.write(90);
janela2.write(90);
janelasAbertas = false;
}
}
void loop() {
lcd.init();
lcd.backlight();
lcd.clear();
TempAndHumidity data = dhtSensor.getTempAndHumidity();
lcd.setCursor(1, 0);
lcd.print("Ar ligado: ");
if(ACLigado){lcd.print("Sim");}else{lcd.print("Nao");}
lcd.setCursor(1,1);
lcd.print("Umidade: ");
lcd.print(data.humidity);
lcd.setCursor(1,2);
lcd.print("Temperatura: ");
lcd.print(data.temperature);
int ultimoMovimento = 0;
int pirState = digitalRead(PIRPin);
if(pirState == HIGH) {
Serial.println("Movimento!!!");
ultimoMovimento = millis();
}
if(millis()-ultimoMovimento < meiaHora) {
if(data.humidity > 60.0 || data.temperature > 26.0) {
ligarAC();
fecharJanelas();
} else {
desligarAC();
abrirJanelas();
}
}else {
Serial.println("\nNenhum movimento detectado. Desligando tudo.");
fecharJanelas();
desligarAC();
}
String url_temp = "https://api.thingspeak.com/update?api_key=LNZZNNHLTTUIPGRS&field2="+String(data.temperature);
cliente.begin(url_temp.c_str());
cliente.GET();
cliente.end();//mandar a temperatura para o thingspeak
delay(2000);
String url_umid = "https://api.thingspeak.com/update?api_key=YD721596MRCP7QC2&field1="+String(data.humidity);
cliente.begin(url_umid.c_str());
cliente.GET();//mandar a umidade para o thingspeak
cliente.end();
JSONVar payload;//objeto para as informações do ambiente
payload["Temperatura"]= data.temperature;
payload["Umidade"] = data.humidity;
payload["Ar ligado"] = ACLigado;
Serial.println("Enviando mensagem ao Broker, tópico senai");
mqttClient.publish("arcondicionado", JSON.stringify(payload).c_str());//fazer o post no emqx no topico arcondicionado
delay(500);
}