#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
// WiFi Configuration
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT Configuration
const char* mqtt_server = "broker.emqx.io";
const int mqtt_port = 1883;
const char* mqtt_username = "emqx";
const char* mqtt_password = "public";
// Topic Names
const char* temperatureTopic = "emqx/suhus";
const char* humidityTopic = "emqx/humds";
const char* ldrTopic = "emqx/ldr";
const char* brightnessTopic = "emqx/cahayas";
const char* soilTopic = "emqx/soils";
// DHT Sensor Configuration
#define DHTPIN 15
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// LDR Configuration
#define LDR_PIN 32
// Soil Moisture Configuration
const int dryValue = 700; // Value when soil is dry
const int wetValue = 300; // Value when soil is wet
#define soil 34
// Variables for timing
unsigned long lastMeasurementTime = 0;
const unsigned long measurementInterval = 2000; // 2 seconds
// WiFi Client and MQTT Client
WiFiClient espClient;
PubSubClient client(espClient);
int readSoilMoisture(int soilSensor) {
// Convert analog value to moisture percentage
int moisturePercentage = map(soilSensor, dryValue, wetValue, 0, 100);
moisturePercentage = constrain(moisturePercentage, 0, 100);
return moisturePercentage;
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message: ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
float calculateBrightness(int ldrRawValue) {
const float gamma = 0.7;
const float rl10 = 50;
ldrRawValue = map(ldrRawValue, 4095, 0, 1024, 0);
float voltage = ldrRawValue / 1024.0 * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float brightness = pow(rl10 * 1e3 * pow(10, gamma) / resistance, (1 / gamma));
return brightness;
}
void connectToWiFi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.println("Connecting to WiFi...");
delay(1000);
}
Serial.println("Connected to the Wi-Fi network");
}
void connectToMQTT() {
while (!client.connected()) {
String client_id = "esp32-client-" + WiFi.macAddress();
Serial.printf("The client %s connects to the public MQTT broker\n", client_id.c_str());
if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
Serial.println("Public EMQX MQTT broker connected");
} else {
Serial.print("Failed to connect with state ");
Serial.print(client.state());
delay(2000);
}
}
}
void setup() {
Serial.begin(9600);
connectToWiFi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
connectToMQTT();
dht.begin();
}
void loop() {
client.loop();
unsigned long currentTime = millis();
if (currentTime - lastMeasurementTime > measurementInterval) {
lastMeasurementTime = currentTime;
int soilSensor = analogRead(soil);
int soilMoisture = readSoilMoisture(soilSensor);
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
float heatIndex = dht.computeHeatIndex(temperature, humidity, false);
int ldrRawValue = analogRead(LDR_PIN);
float brightness = calculateBrightness(ldrRawValue);
if (!isnan(humidity) && !isnan(temperature)) {
client.publish(humidityTopic, String(humidity).c_str());
client.publish(temperatureTopic, String(temperature).c_str());
client.publish(ldrTopic, String(ldrRawValue).c_str());
client.publish(brightnessTopic, String(brightness).c_str());
client.publish(soilTopic, String(soilMoisture).c_str());
Serial.print(F("Humidity: "));
Serial.print(humidity);
Serial.print(F("% Temperature: "));
Serial.print(temperature);
Serial.println(" *C ");
Serial.print("LDR Value: ");
Serial.println(ldrRawValue);
Serial.print("Brightness: ");
Serial.print(brightness);
Serial.print(" lux ");
Serial.print("Soil Moisture: ");
Serial.println(soilMoisture);
} else {
Serial.println("Failed to read from DHT & LDR sensor!");
}
}
}