#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
// ======= Configuração do DHT22 =======
#define DHTPIN 14
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// ======= Configuração do relé =======
int pinRELE = 4; // Pino IN do relé
float TEMP_LIMITE = 30; // Limite de temperatura em °C
// ======= Configuração dos pinos adicionais =======
int pinLED = 0; // LED manual via MQTT
// ======= Configurações da rede Wi-Fi =======
const char* SSID = "Wokwi-GUEST";
const char* PASSWORD = "";
int sensorLDRPin = A0; // Pino analógico conectado ao LDR
int sensorLDRValue = 0; // Variável para armazenar leitura do LDR
// ======= Configurações MQTT =======
const char* topic_pub = "/sihs/gsds/lum";
const char* topic_sub = "/sihs/gsds/listener";
const char server[] = "broker.mqttdashboard.com";
WiFiClient espClient;
PubSubClient client(espClient);
// ======= Função de callback MQTT =======
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived: ");
Serial.println(topic);
String s = "";
for (int i = 0; i < length; i++) {
s += (char)payload[i];
}
Serial.println("Payload: " + s);
if (s.equals("desligar")) {
digitalWrite(pinLED, LOW);
}
else if (s.equals("ligar")) {
digitalWrite(pinLED, HIGH);
}
else if (s.equals("ligarrele")) {
digitalWrite(pinRELE, HIGH);
}
else if (s.equals("desligarrele")) {
digitalWrite(pinRELE, LOW);
}
}
void lerLDR() {
int sensorLDRValue = analogRead(sensorLDRPin); // lê o valor do ADC (0-4095)
// Converte para % invertido (0 = sem luz, 100 = muita luz)
float luzPercent = 100.0 * (4063.0 - sensorLDRValue) / 4063.0;
String leituraLDR;
if (luzPercent <= 20){
client.publish("/sihs/gsds/status_luz", "Luminosidade Muito Baixa");
Serial.println("Luminosidade Muito Baixa");
}
else if (luzPercent >20 && luzPercent<=40){
client.publish("/sihs/gsds/status_luz", "Luminosidade Baixa");
Serial.println("Luminosidade Baixa");
}
else if (luzPercent >40 && luzPercent<=60){
client.publish("/sihs/gsds/status_luz", "Luminosidade Mediana");
Serial.println("Luminosidade Mediana");
}
else if (luzPercent >60 && luzPercent<=80){
client.publish("/sihs/gsds/status_luz", "Luminosidade Alta");
Serial.println("Luminosidade Alta");
}
else{
client.publish("/sihs/gsds/status_luz", "Luminosidade Muito Alta");
Serial.println("Luminosidade Muito Alta");
}
}
// ======= Função para leitura do DHT22 e acionamento do relé =======
void lerDHT() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Falha ao ler do sensor DHT!");
return;
}
// Monta mensagem MQTT
String payload = String(t);
client.publish("/sihs/gsds/status_temp", payload.c_str());
Serial.println(payload);
}
// ======= Função de reconexão Wi-Fi e MQTT =======
void reconnect() {
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Conectando ao Wi-Fi...");
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Conectado!");
}
while (!client.connected()) {
Serial.print("Conectando MQTT...");
if (client.connect("arduinoClientguilherme")) {
Serial.println("Conectado ao MQTT.");
client.subscribe(topic_sub);
} else {
Serial.print("Falha, rc=");
Serial.print(client.state());
Serial.println(" Tentando novamente em 5s.");
delay(5000);
}
}
}
// ======= Setup =======
void setup() {
Serial.begin(115200);
// Configura pinos
pinMode(pinLED, OUTPUT);
pinMode(sensorLDRPin, INPUT);
pinMode(pinRELE, OUTPUT);
digitalWrite(pinRELE, HIGH); // Relé desligado
// Inicializa sensor
dht.begin();
// Configura MQTT
client.setServer(server, 1883);
client.setCallback(callback);
// Conecta Wi-Fi + MQTT
reconnect();
}
// ======= Loop principal =======
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// Leitura do LDR
// Leitura do DHT e acionamento do relé
lerDHT();
lerLDR();
delay(1000);
}