#include <WiFi.h>
#include <PubSubClient.h>
#include "DHTesp.h"
#include<Wire.h>
/* The periods assigned to the one-shot and auto-reload timers are 6 second and one econd respectively. */
#define serial_data_load pdMS_TO_TICKS( 1000 )
//create reference hanlders for one-shot and auto-relaod timers
TimerHandle_t xAutoReloadTimer;
BaseType_t xTimer1Started;
#define CONNECTION_TIMEOUT 10
#define DEVICE_ID "mqt"
const char* ssid = "Wokwi-GUEST";
const char* password = "";
WiFiClient espClient;
PubSubClient client(espClient);
DHTesp dhtSensor;
TempAndHumidity data = dhtSensor.getTempAndHumidity();
// PIN mapping of sensors
const int DHT_PIN = 15;
const int fluidPin = 33;
const int ldrPin = 34;
const int co2Pin = 35;
const int MoisturePin = 36;
const int motionPin = 23;
const int relayPin = 2;
// variable for storing the potentiometer value
int ldrValue = 0;
int co2Value = 0;
int MoistureValue = 0;
int fluid_data = 0;
int motion_data = 0;
int relayStatus = 0;
//MQTT Setup
const char *mqtt_broker = "broker.mqttdashboard.com";
const char *MQTT_CLIENT = DEVICE_ID;
const char *mqtt_username = "";
const char *mqtt_password = "";
const char *MQTT_IOT_SENSOR_TOPIC = "iot/moi";
const char *MQTT_IOT_TEMPER_TOPIC = "iot/tem";
const char *MQTT_IOT_HUMIDI_TOPIC = "iot/hum";
const char *MQTT_IOT_GAS_TOPIC = "iot/gas";
const char *MQTT_IOT_LDR_TOPIC = "iot/ldr";
const char *MQTT_IOT_MOTION_TOPIC = "iot/mot";
const char *MQTT_IOT_WATER_TOPIC = "iot/flu";
const char *MQTT_IOT_RELAY_TOPIC = "iot/rel";
const char *MQTT_CONTROL_TOPIC = "iot/control";
const int mqtt_port = 1883;
char messages[50];
void setup(){
Serial.begin(115200);
delay(1000);
setup_wifi();
pinMode(motionPin,INPUT);
pinMode(relayPin,OUTPUT);
digitalWrite(relayPin,0);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
xTaskCreatePinnedToCore (
sensorDataCapture, // Function to implement the task
"sensorDataCapture", // Name of the task
2048, // Stack size in bytes
NULL, // Task input parameter
0, // Priority of the task
NULL, // Task handle.
0 // Core where the task should run
);
xAutoReloadTimer = xTimerCreate("Serial_Data",serial_data_load,pdTRUE,0,sensorDataSend);
if( ( xAutoReloadTimer != NULL ) )
{
xTimer1Started = xTimerStart( xAutoReloadTimer, 0 );
}
}
void loop(){}
//*******************************************sensorDataCapture*********************************************//
//*********************************************************************************************************//
//*********************************************************************************************************//
void sensorDataCapture (void* pvParameters) {
while (1) {
client.loop();
data = dhtSensor.getTempAndHumidity();
ldrValue = analogRead(ldrPin);
co2Value = analogRead(co2Pin);
MoistureValue = analogRead(MoisturePin);
fluid_data = analogRead(fluidPin);
relayStatus = digitalRead(relayPin);
motion_data = digitalRead(motionPin);
vTaskDelay(100);
}
}
//*******************************************sensorDataSend************************************************//
//*********************************************************************************************************//
//*********************************************************************************************************//
void sensorDataSend (TimerHandle_t xTimer1Started) {
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
Serial.print("Light Sensor Data :");
Serial.println(ldrValue);
Serial.print("CO2 Sensor Data :");
Serial.println(co2Value);
Serial.print("Moisture Sensor Data :");
Serial.println(MoistureValue);
Serial.print("Fluid Sensor Data :");
Serial.println(fluid_data);
if(digitalRead(motionPin))
{
Serial.println("Motion Detected");
}
else
{
Serial.println("No Motion Detected");
}
Serial.println("---");
snprintf(messages, 75, "%ld", MoistureValue);
client.publish(MQTT_IOT_SENSOR_TOPIC, messages);
snprintf(messages, 75, "%f", data.temperature);
client.publish(MQTT_IOT_TEMPER_TOPIC, messages);
snprintf(messages, 75, "%f", data.humidity);
client.publish(MQTT_IOT_HUMIDI_TOPIC, messages);
snprintf(messages, 75, "%d", co2Value);
client.publish(MQTT_IOT_GAS_TOPIC, messages);
snprintf(messages, 75, "%d", ldrValue);
client.publish(MQTT_IOT_LDR_TOPIC, messages);
snprintf(messages, 75, "%d", relayStatus);
client.publish(MQTT_IOT_RELAY_TOPIC, messages);
snprintf(messages, 75, "%d", motion_data);
client.publish(MQTT_IOT_MOTION_TOPIC, messages);
snprintf(messages, 75, "%d", fluid_data);
client.publish(MQTT_IOT_WATER_TOPIC, messages);
}
//*********************************************setup_wifi**************************************************//
//*********************************************************************************************************//
//*********************************************************************************************************//
void setup_wifi () {
WiFi.mode(WIFI_STA); //Optional
WiFi.begin(ssid, password);
Serial.println("\nConnecting");
int timeout_counter = 0;
while(WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(200);
timeout_counter++;
if(timeout_counter >= CONNECTION_TIMEOUT*5){
ESP.restart();
}
}
Serial.println("\nConnected to the WiFi network");
Serial.print("Local ESP32 IP: ");
Serial.println(WiFi.localIP());
client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
while (!client.connected()) {
if (client.connect("koikoikoi", mqtt_username, mqtt_password)) {
Serial.println("Public EMQX MQTT broker connected");
client.subscribe(MQTT_CONTROL_TOPIC);
} else {
Serial.print("Failed with state ");
Serial.print(client.state());
delay(2000);
}
}
}
void callback(char *topic, byte *payload, unsigned int length) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message: ");
String message;
for (int i = 0; i < length; i++) {
message += (char) payload[i]; // Convert *byte to string
}
Serial.print(message);
if(message == "ON"){
digitalWrite(relayPin,1);
relayStatus = 1;
}
else if(message == "OFF"){
digitalWrite(relayPin,0);
relayStatus = 0;
}
snprintf(messages, 75, "%d", relayStatus);
client.publish(MQTT_IOT_RELAY_TOPIC, messages);
Serial.println();
Serial.println("-----------------------");
}