#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <ArduinoJson.h>
// Wi-Fi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT
const char* mqtt_server = "2e6323f30f1342559c82924bc9803c58.s1.eu.hivemq.cloud";
const int mqtt_port = 8883;
const char* mqtt_user = "transmitter";
const char* mqtt_password = "Transmitter123";
WiFiClientSecure espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[100];
#define DHTPIN 14
#define DHTTYPE DHT22
DHT dhtSensor(DHTPIN, DHTTYPE);
float tempThreshold = 25.0;
float humidityThreshold = 50.0;
int lightThreshold = 150;
void setup() {
Serial.begin(115200);
setup_wifi();
espClient.setInsecure();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
dhtSensor.begin();
delay(2000);
analogRead(35);
// Subscribe to threshold topic
client.subscribe("sensor/thresholds");
}
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client", mqtt_user, mqtt_password)) {
Serial.println("connected");
// Resubscribe to threshold topic
client.subscribe("sensor/thresholds");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
char message[length + 1];
memcpy(message, payload, length);
message[length] = '\0';
Serial.println(message);
if (strcmp(topic, "sensor/thresholds") == 0) {
DynamicJsonDocument doc(1024);
DeserializationError error = deserializeJson(doc, message);
if (error) {
Serial.println("Failed to parse JSON");
return;
}
tempThreshold = doc["tempThreshold"];
humidityThreshold = doc["humidityThreshold"];
lightThreshold = doc["lightThreshold"];
Serial.print("Updated Temp Threshold: ");
Serial.println(tempThreshold);
Serial.print("Updated Humidity Threshold: ");
Serial.println(humidityThreshold);
Serial.print("Updated Light Threshold: ");
Serial.println(lightThreshold);
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
float temperature = dhtSensor.readTemperature();
float humidity = dhtSensor.readHumidity();
delay(10);
int analogValue = analogRead(35);
Serial.println("Temp: " + String(temperature) + "°C");
Serial.println("Humidity: " + String(humidity) + "%");
Serial.println("Light Level: " + String(analogValue)); //150'den küçük olmalı
Serial.println("---");
// Compare current values with thresholds
float tempDiff = abs(temperature - tempThreshold) / tempThreshold * 100;
float humidityDiff = abs(humidity - humidityThreshold) / humidityThreshold * 100;
float lightDiff = abs(analogValue - lightThreshold) / lightThreshold * 100;
if (tempDiff > 3) {
Serial.println("Temperature differs by more than 3% air conditioner will be turned on");
}
if (humidityDiff > 3) {
Serial.println("Humidity differs by more than 3% irrigation system will be turned on");
}
if (lightDiff > 3) {
Serial.println("Light level differs by more than 3% light system will be turned on");
}
// Create a JSON format
snprintf(msg, 100, "{\"temperature\": %.2f, \"humidity\": %.2f, \"light\": %d}", temperature, humidity, analogValue);
Serial.print("Publish message: ");
Serial.println(msg);
client.publish("sensor/data", msg); // Update the topic
}
}