#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Configurações de Wi-Fi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Configurações do ThingSpeak MQTT
const char* mqttServer = "mqtt3.thingspeak.com";
const int mqttPort = 1883;
const char mqttUserName[] = "NCI6CTo3Di4zCyESMzYIHBM";
const char mqttPassword[] = "ctXpcd2lBApHxE4WYWnkmDVA";
const char clientID[] = "NCI6CTo3Di4zCyESMzYIHBM";
unsigned long channelID = 2720534;
// Inicialização dos sensores
#define ONE_WIRE_BUS 2
#define DHTPIN 4
#define DHTTYPE DHT22
DHT SensorDHT(DHTPIN, DHTTYPE);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Pino do LDR
const int ldrPin = 34;
// Parâmetros do LDR para calcular lux
const float GAMMA = 0.7;
const float RL10 = 50;
// Cliente WiFi e MQTT
WiFiClient espClient;
PubSubClient mqttClient(espClient);
void setup() {
Serial.begin(115200);
// Inicialização dos sensores
SensorDHT.begin();
sensors.begin();
pinMode(ldrPin, INPUT);
// Conecta ao Wi-Fi e ao servidor MQTT do ThingSpeak
connectWiFi();
mqttClient.setServer(mqttServer, mqttPort);
}
void loop() {
// Reconecta se desconectado
if (!mqttClient.connected()) {
mqttConnect();
}
mqttClient.loop();
// Lê os valores dos sensores
float temperatura = SensorDHT.readTemperature();
float umidade = SensorDHT.readHumidity();
float luxValue = calcularLux();
// Exibe no Serial Monitor
Serial.print("Temperatura DHT22: ");
Serial.println(temperatura);
Serial.print("Umidade DHT22: ");
Serial.println(umidade);
Serial.print("Lux: ");
Serial.println(luxValue);
// Prepara os dados para o ThingSpeak no formato de payload MQTT
String payload = String("field1=") + String(temperatura) +
"&field2=" + String(umidade) +
"&field3=" + String(luxValue);
// Publica o payload no canal MQTT
if (mqttClient.publish(("channels/" + String(channelID) + "/publish").c_str(), payload.c_str())) {
Serial.println("Dados enviados com sucesso: " + payload);
} else {
Serial.println("Falha ao enviar dados.");
}
delay(20000); // Aguarda 20 segundos entre cada envio
}
float calcularLux() {
int analogValue = analogRead(ldrPin);
// Mapear o valor para lux com base na escala definida
float luxValue;
if (analogValue > 1000) {
luxValue = 0.1;
} else if (analogValue > 900) {
luxValue = 1;
} else if (analogValue > 800) {
luxValue = 10;
} else if (analogValue > 600) {
luxValue = 50;
} else if (analogValue > 500) {
luxValue = 100;
} else if (analogValue > 280) {
luxValue = 400;
} else if (analogValue > 150) {
luxValue = 1000;
} else if (analogValue > 30) {
luxValue = 10000;
} else {
luxValue = 100000;
}
return luxValue;
}
void connectWiFi() {
Serial.print("Conectando ao WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Conectado!");
}
void mqttConnect() {
while (!mqttClient.connected()) {
Serial.print("Conectando ao MQTT...");
if (mqttClient.connect(clientID, mqttUserName, mqttPassword)) {
Serial.println(" conectado");
} else {
Serial.print(" falha, rc=");
Serial.print(mqttClient.state());
Serial.println(" tentando novamente em 5 segundos");
delay(5000);
}
}
}