#include <DHT.h>
#include <WiFi.h>
#include <PubSubClient.h>
// WiFi Configuration
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT Configuration
const char* mqttServer = "broker.emqx.io";
const int mqttPort = 1883;
const char* mqttUsername = "emqx";
const char* mqttPassword = "public";
// Library
DHT dht(14, DHT22); // DHT 11 Declaration
#define LdrPin 34
#define soilMoisturePin 15
int soilMoistureValue;
const int RELAY_PIN = 16;
float calculateBrightness(int ldrRawValue) {
const float gamma = 0.7;
const float rl10 = 50;
// Convert LDR raw value to a 0-1023 scale
ldrRawValue = map(ldrRawValue, 4095, 0, 1024, 0);
// Convert LDR raw value to voltage
float voltage = ldrRawValue / 1024.0 * 5.0;
// Calculate resistance based on voltage and known resistor values
float resistance = 2000 * voltage / (1 - voltage / 5);
// Calculate brightness using the given formula
float brightness = pow(rl10 * 1e3 * pow(10, gamma) / resistance, (1 / gamma));
return brightness;
}
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(9600);
// Starting DHT11 scanning
dht.begin();
pinMode(RELAY_PIN, OUTPUT);
// Connect to Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// Connect to MQTT broker
client.setServer(mqttServer, mqttPort);
if (client.connect("ESP32Client", mqttUsername, mqttPassword)) {
Serial.println("Connected to MQTT broker");
} else {
Serial.println("Connection to MQTT broker failed");
}
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
float hic = dht.computeHeatIndex(t, h, false);
int ldrRawValue = analogRead(LdrPin);
float brightness = calculateBrightness(ldrRawValue);
soilMoistureValue = analogRead(soilMoisturePin);
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.println(" *C ");
client.publish("humidity_topic", String(h).c_str());
Serial.print("Brightness: ");
Serial.print(brightness);
Serial.println(" lux ");
client.publish("emqx/brightnessxx", String(brightness).c_str());
Serial.print("Soil Moisture: ");
Serial.print(soilMoistureValue);
Serial.println(" cm ");
client.publish("soil_moisture_topic", String(soilMoistureValue).c_str());
if (soilMoistureValue >= 75 && soilMoistureValue <= 150) {
digitalWrite(RELAY_PIN, HIGH);
Serial.println("Relay: ON");
client.publish("relay_status_topic", "ON");
} else {
digitalWrite(RELAY_PIN, LOW);
Serial.println("Relay: OFF");
client.publish("relay_status_topic", "OFF");
}
delay(2000);
}