#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <DHT.h>
// Wi-Fi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT broker settings
// const char* mqtt_username = "username1";
// const char* mqtt_password = "admin1";
const char* mqtt_server = "test.mosquitto.org";
const int mqtt_port = 8883;
const char* sensor_topic = "DHT_LDR/SensorData"; // Topic for DHT and LDR data
// DHT sensor configuration
#define DHT_PIN 4 // DHT data pin connected to GPIO4
#define DHT_TYPE DHT22 // Specify the type of DHT sensor
DHT dht(DHT_PIN, DHT_TYPE); // Create DHT sensor object
// Pin definitions
#define LDR_PIN 34 // LDR connected to GPIO34
#define LED_PIN 2 // Pin for onboard LED
// WiFi and MQTT clients
WiFiClientSecure espClient;
PubSubClient mqttClient(espClient);
// Global variable for storing the sensor data
char sensorDataArr[200];
// CA certificate for test.mosquitto.org
const char* ca_cert = R"(
-----BEGIN CERTIFICATE-----
MIIEAzCCAuugAwIBAgIUBY1hlCGvdj4NhBXkZ/uLUZNILAwwDQYJKoZIhvcNAQEL
BQAwgZAxCzAJBgNVBAYTAkdCMRcwFQYDVQQIDA5Vbml0ZWQgS2luZ2RvbTEOMAwG
A1UEBwwFRGVyYnkxEjAQBgNVBAoMCU1vc3F1aXR0bzELMAkGA1UECwwCQ0ExFjAU
BgNVBAMMDW1vc3F1aXR0by5vcmcxHzAdBgkqhkiG9w0BCQEWEHJvZ2VyQGF0Y2hv
by5vcmcwHhcNMjAwNjA5MTEwNjM5WhcNMzAwNjA3MTEwNjM5WjCBkDELMAkGA1UE
BhMCR0IxFzAVBgNVBAgMDlVuaXRlZCBLaW5nZG9tMQ4wDAYDVQQHDAVEZXJieTES
MBAGA1UECgwJTW9zcXVpdHRvMQswCQYDVQQLDAJDQTEWMBQGA1UEAwwNbW9zcXVp
dHRvLm9yZzEfMB0GCSqGSIb3DQEJARYQcm9nZXJAYXRjaG9vLm9yZzCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAME0HKmIzfTOwkKLT3THHe+ObdizamPg
UZmD64Tf3zJdNeYGYn4CEXbyP6fy3tWc8S2boW6dzrH8SdFf9uo320GJA9B7U1FW
Te3xda/Lm3JFfaHjkWw7jBwcauQZjpGINHapHRlpiCZsquAthOgxW9SgDgYlGzEA
s06pkEFiMw+qDfLo/sxFKB6vQlFekMeCymjLCbNwPJyqyhFmPWwio/PDMruBTzPH
3cioBnrJWKXc3OjXdLGFJOfj7pP0j/dr2LH72eSvv3PQQFl90CZPFhrCUcRHSSxo
E6yjGOdnz7f6PveLIB574kQORwt8ePn0yidrTC1ictikED3nHYhMUOUCAwEAAaNT
MFEwHQYDVR0OBBYEFPVV6xBUFPiGKDyo5V3+Hbh4N9YSMB8GA1UdIwQYMBaAFPVV
6xBUFPiGKDyo5V3+Hbh4N9YSMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
BQADggEBAGa9kS21N70ThM6/Hj9D7mbVxKLBjVWe2TPsGfbl3rEDfZ+OKRZ2j6AC
6r7jb4TZO3dzF2p6dgbrlU71Y/4K0TdzIjRj3cQ3KSm41JvUQ0hZ/c04iGDg/xWf
+pp58nfPAYwuerruPNWmlStWAXf0UTqRtg4hQDWBuUFDJTuWuuBvEXudz74eh/wK
sMwfu1HFvjy5Z0iMDU8PUDepjVolOCue9ashlS4EB5IECdSR2TItnAIiIwimx839
LdUdRudafMu5T5Xma182OC0/u/xRlEm+tvKGGmfFcN0piqVl8OrSPBgIlb+1IKJE
m/XriWr/Cq4h/JfB7NTsezVslgkBaoU=
-----END CERTIFICATE-----
)";
void setup() {
Serial.begin(115200);
// Setup DHT sensor
dht.begin();
// Setup Wi-Fi and MQTT
setupWiFi();
setupMqtt();
// Configure pins
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
}
void loop() {
if (!mqttClient.connected()) {
reconnectToBroker();
}
mqttClient.loop();
// Update and publish DHT and LDR data
updateAndPublishSensorData();
// Check LDR condition and control LED
controlLedBasedOnLdr();
delay(2000); // Wait 2 seconds before the next loop
}
void setupWiFi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
void setupMqtt() {
mqttClient.setServer(mqtt_server, mqtt_port);
// Load the CA certificate for secure connection
espClient.setCACert(ca_cert);
}
void reconnectToBroker() {
while (!mqttClient.connected()) {
Serial.print("Connecting to MQTT broker...");
if (mqttClient.connect("ESP32-DHT_LDR_Client")) {
Serial.println("Connected to MQTT broker");
} else {
Serial.print("Failed, state: ");
Serial.println(mqttClient.state());
delay(5000);
}
}
}
void updateAndPublishSensorData() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int ldrValue = analogRead(LDR_PIN);
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
String tempStr = String(temperature, 2);
String humStr = String(humidity, 2);
String combinedData = "Temperature: " + tempStr + " °C, Humidity: " + humStr +
" %, LDR Value: " + String(ldrValue);
combinedData.toCharArray(sensorDataArr, 200);
mqttClient.publish(sensor_topic, sensorDataArr);
Serial.println("Publishing sensor data to MQTT:");
Serial.println(sensorDataArr);
}
void controlLedBasedOnLdr() {
int ldrValue = analogRead(LDR_PIN);
// Adjust threshold as needed
if (ldrValue < 1000) {
digitalWrite(LED_PIN, HIGH);
Serial.println("Low luminosity detected: LED ON");
} else {
digitalWrite(LED_PIN, LOW);
Serial.println("Sufficient luminosity: LED OFF");
}
}