#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
#define STEP_PIN 18
#define DIR_PIN 19
#define DHT_PIN 25
#define DHT_TYPE DHT22
#define LDR_PIN 34
#define RED_PIN 14
#define GREEN_PIN 27
#define BLUE_PIN 26
DHT dht(DHT_PIN, DHT_TYPE);
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "test.mosquitto.org";
const int mqtt_port = 1883;
const char* humidity_topic = "/ThinkIoT/Humidity";
const char* light_topic = "/ThinkIoT/Light";
const char* motor_topic = "/ThinkIoT/Motor";
const char* motor_rpm_topic = "/ThinkIoT/MotorRPM";
WiFiClient espClient;
PubSubClient client(espClient);
const int steps_per_revolution = 200;
void setup() {
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
dht.begin();
digitalWrite(DIR_PIN, HIGH);
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
Serial.begin(9600);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
setRGB(255, 255, 0);
float humidity = dht.readHumidity();
if (isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
delay(5000);
return;
}
int ldrValue = analogRead(LDR_PIN);
Serial.print("Humidity: ");
Serial.println(humidity);
Serial.print("LDR Value: ");
Serial.println(ldrValue);
client.publish(humidity_topic, String(humidity).c_str());
client.publish(light_topic, String(ldrValue).c_str());
const float HUMIDITY_THRESHOLD = 30.0;
const int LDR_THRESHOLD_DUSK = 2000;
const int LDR_THRESHOLD_NIGHT = 1000;
if (humidity < HUMIDITY_THRESHOLD && ldrValue < LDR_THRESHOLD_DUSK && ldrValue > LDR_THRESHOLD_NIGHT) {
unsigned long startTime = millis();
for (int i = 0; i < 1000; i++) {
if (i % 100 == 0) {
setRGB(0, 255, 255);
} else {
setRGB(255, 255, 255);
}
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(1000);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(1000);
}
unsigned long endTime = millis();
float duration = (endTime - startTime) / 1000.0;
float rpm = (1000.0 / steps_per_revolution) / duration * 60.0;
client.publish(motor_rpm_topic, String(rpm).c_str());
client.publish(motor_topic, "ON");
} else {
client.publish(motor_topic, "OFF");
}
delay(5000);
}
void setRGB(int red, int green, int blue) {
analogWrite(RED_PIN, red);
analogWrite(GREEN_PIN, green);
analogWrite(BLUE_PIN, blue);
}
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
setRGB(0, 255, 255);
delay(100);
setRGB(255, 255, 255);
delay(100);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
setRGB(255, 0, 255);
delay(3000);
setRGB(255, 255, 0);
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client")) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}