#include <DHT.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <ESP32Servo.h>
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define PRESSURE_PIN 35
#define TRIG_PIN 18
#define ECHO_PIN 19
#define PUMP_LED 27
#define FAN_LED 14
#define HEATER_LED 12
#define MOTOR_LED 26
#define BUZZER_PIN 25
// Servo pins
#define SERVO_TEMP_PIN 33
#define SERVO_HUMIDITY_PIN 32
#define SERVO_PRESSURE_PIN 13
#define SERVO_MOTOR_PIN 15
Servo servoTemp;
Servo servoHum;
Servo servoPressure;
Servo servoMotor;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "24f80603f1f64a839a41c56e0ca79b9c.s1.eu.hivemq.cloud";
const int mqtt_port = 8883;
const char* mqtt_username = "meradht";
const char* mqtt_password = "Dallanikhil01";
const char* mqtt_topic = "esp8266_data";
const char* ideal_topic = "ideal_channel";
WiFiClientSecure net;
PubSubClient client(net);
unsigned long previousMillis = 0;
bool buzzerState = false;
// For motor control
bool motorServoOn = false;
void setup_wifi() {
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected!");
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message received on topic: ");
Serial.println(topic);
payload[length] = '\0'; // Null-terminate
String message = String((char*)payload);
Serial.print("Raw JSON: ");
Serial.println(message);
StaticJsonDocument<256> doc;
DeserializationError error = deserializeJson(doc, message);
if (error) {
Serial.print("JSON parse error: ");
Serial.println(error.c_str());
return;
}
float ideal_temp = doc["temperature"];
float ideal_humidity = doc["humidity"];
int ideal_pressure = doc["pressure"];
int ideal_motor = doc["motor"];
Serial.println("Parsed Ideal Values:");
Serial.print(" Temperature: "); Serial.println(ideal_temp);
Serial.print(" Humidity: "); Serial.println(ideal_humidity);
Serial.print(" Pressure: "); Serial.println(ideal_pressure);
Serial.print(" Motor: "); Serial.println(ideal_motor);
// Map values to servo angles (0-180)
servoTemp.write(map((int)ideal_temp, 0, 100, 0, 180));
servoHum.write(map((int)ideal_humidity, 0, 100, 0, 180));
servoPressure.write(map(ideal_pressure, 0, 100, 0, 180));
if (ideal_motor == 1) {
motorServoOn = true;
} else {
motorServoOn = false;
servoMotor.write(90); // Stop position (middle) for standard servo
}
}
void connectToMQTT() {
net.setInsecure();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
if (client.connect("ESP32Client", mqtt_username, mqtt_password)) {
Serial.println("Connected to MQTT broker!");
client.subscribe(ideal_topic);
Serial.println("Subscribed to topic: ideal_channel");
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
delay(2000);
}
}
}
float readDistanceCM() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2;
}
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(PUMP_LED, OUTPUT);
pinMode(FAN_LED, OUTPUT);
pinMode(HEATER_LED, OUTPUT);
pinMode(MOTOR_LED, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Attach servos
servoTemp.attach(SERVO_TEMP_PIN);
servoHum.attach(SERVO_HUMIDITY_PIN);
servoPressure.attach(SERVO_PRESSURE_PIN);
servoMotor.attach(SERVO_MOTOR_PIN);
dht.begin();
setup_wifi();
connectToMQTT();
}
void loop() {
if (!client.connected()) {
connectToMQTT();
}
client.loop();
float temp = dht.readTemperature();
float humidity = dht.readHumidity();
int pressure = map(analogRead(PRESSURE_PIN), 0, 4095, 0, 100);
float level = 400 - readDistanceCM();
if (isnan(temp) || isnan(humidity)) {
Serial.println("Failed to read DHT sensor!");
return;
}
Serial.printf("Temp: %.2f°C | Humidity: %.2f%% | Pressure: %d | Level: %.2fcm\n",
temp, humidity, pressure, level);
digitalWrite(HEATER_LED, temp > 70);
digitalWrite(FAN_LED, humidity > 70);
digitalWrite(PUMP_LED, pressure > 70);
digitalWrite(MOTOR_LED, level < 30);
if (temp > 70 || pressure > 70 || level < 30) {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= 500) {
previousMillis = currentMillis;
buzzerState = !buzzerState;
digitalWrite(BUZZER_PIN, buzzerState);
}
} else {
digitalWrite(BUZZER_PIN, LOW);
}
// Make fluid motor servo rotate back and forth if ON
static int motorAngle = 0;
static bool increasing = true;
if (motorServoOn) {
servoMotor.write(motorAngle);
if (increasing) {
motorAngle += 5;
if (motorAngle >= 180) increasing = false;
} else {
motorAngle -= 5;
if (motorAngle <= 0) increasing = true;
}
delay(100);
}
// Send current values
StaticJsonDocument<256> doc;
doc["temperature"] = temp;
doc["humidity"] = humidity;
doc["pressure"] = pressure;
doc["water_level"] = level;
char jsonBuffer[256];
serializeJson(doc, jsonBuffer);
client.publish(mqtt_topic, jsonBuffer);
Serial.println("Published JSON:");
Serial.println(jsonBuffer);
delay(1000);
}