#define BLYNK_TEMPLATE_ID "TMPL63T3DHPg-"
#define BLYNK_TEMPLATE_NAME "Node1 Template"
#define BLYNK_AUTH_TOKEN "nvFId-58oz3pGkqViowjrFWsLhInP9eK"
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include "DHTesp.h"
#include <ArduinoJson.h>
#include <BlynkSimpleEsp32.h>
char auth[] = BLYNK_AUTH_TOKEN;
BlynkTimer timer;
#define BLYNK_PRINT Serial
const int DHT_PIN = 15;
DHTesp dhtSensor;
#define VERT_PIN 35
#define HORZ_PIN 32
#define SEL_PIN 12
#define RelayPin 0
#define BuzzerPin 16
// Wi-Fi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT broker details private
const char* mqtt_broker = "f0d086f337ef47e69eeebf1d993c6e33.s1.eu.hivemq.cloud";
const int mqtt_port = 8883;
const char* mqtt_username = "Nodes";
const char* mqtt_password = "2A357689a";
// MQTT topics
const char* topic_publish1 = "Node1-TempHumdata";
const char* topic_publish2 = "Node1-joyStick";
const char* topic_subscribe1 = "Node2-motion";
const char* topic_subscribe2 = "Node3-Distance"; // Topic to receive messages
// Create instances
WiFiClientSecure wifiClient;
PubSubClient mqttClient(wifiClient);
void setupMQTT() {
mqttClient.setServer(mqtt_broker, mqtt_port);
mqttClient.setCallback(mqttCallback);
}
void reconnect() {
Serial.println("Connecting to MQTT Broker...");
while (!mqttClient.connected()) {
Serial.println("Reconnecting to MQTT Broker...");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
if (mqttClient.connect(clientId.c_str(), mqtt_username, mqtt_password)) {
Serial.println("Connected to MQTT Broker.");
// Subscribe to the control topic
mqttClient.subscribe(topic_subscribe1);
mqttClient.subscribe(topic_subscribe2);
} else {
Serial.print("Failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
// Callback function to handle incoming messages
void mqttCallback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived on topic: [");
Serial.print(topic);
Serial.print("]: \t");
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.println(message);
if (String(topic) == "Node2-motion") {
if (message == "Motion_detected") {
digitalWrite(RelayPin, HIGH);
} else {
digitalWrite(RelayPin, LOW);
}
} else if (String(topic) == "Node3-Distance") {
DynamicJsonDocument UltraDoc(1024);
DeserializationError error = deserializeJson(UltraDoc, message);
if (error) {
Serial.print("Failed to parse JSON: ");
Serial.println(error.f_str());
return;
}
float distance = UltraDoc["distance"];
if (distance < 20) {
digitalWrite(BuzzerPin, HIGH);
tone(BuzzerPin, 100); // 100 is the frequncy of the Tone!
}
else {
digitalWrite(BuzzerPin, LOW);
noTone(BuzzerPin);
}
}
}
void wifiSetup() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connencting to the network.");
}
Serial.println("");
Serial.println("Connected to Wi-Fi");
}
void sendDHTSensor() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
DynamicJsonDocument DHTDoc(1024);
DHTDoc["temperature"] = data.temperature;
DHTDoc["humidity"] = data.humidity;
char DHTBuffer[1024];
serializeJson (DHTDoc, DHTBuffer) ;
mqttClient.publish(topic_publish1, DHTBuffer);
Blynk.virtualWrite(V0, data.temperature);
Blynk.virtualWrite(V1, data.humidity);
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
Serial.println("---");
}
void setup() {
Serial.begin(115200);
Serial.println("Hello, ESP32!");
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
pinMode(VERT_PIN, INPUT);
pinMode(HORZ_PIN, INPUT);
pinMode(SEL_PIN, INPUT_PULLUP);
pinMode(RelayPin, OUTPUT);
pinMode(BuzzerPin, OUTPUT);
wifiSetup();
// Initialize secure WiFiClient
wifiClient.setInsecure(); // Use this only for testing, it allows connecting without a root certificate
setupMQTT();
Blynk.begin(auth,ssid,password);
timer.setInterval(1000L, sendDHTSensor);
}
int oldVertValue = 2048;
int oldHorzValue = 2048;
void loop() {
Blynk.run();
timer.run();
if (!mqttClient.connected()) {
reconnect();
}
mqttClient.loop();
int vert = analogRead(VERT_PIN);
int horz = analogRead(HORZ_PIN);
if (vert != oldVertValue || horz != oldHorzValue) {
Serial.println("Vert = " + String( vert));
Serial.println("horz = " + String( horz));
DynamicJsonDocument JoyStickDoc(1024);
JoyStickDoc["vertical"] = vert;
JoyStickDoc["horizontal"] = horz;
char JoyStickBuffer[1024];
serializeJson (JoyStickDoc, JoyStickBuffer) ;
mqttClient.publish(topic_publish2, JoyStickBuffer);
oldVertValue = vert;
oldHorzValue = horz;
Serial.println("---");
if (vert == 2048 && horz == 2048 ) {
Blynk.virtualWrite(V6, LOW); // V6 is RED LED
Blynk.virtualWrite(V2, LOW); // V2 is Green LED
Blynk.virtualWrite(V3, LOW); // V3 is Blue LED
} else if (vert > 2048 && horz == 2048 ) {
Blynk.virtualWrite(V6, HIGH);
Blynk.virtualWrite(V2, LOW);
Blynk.virtualWrite(V3, LOW);
} else if (vert == 2048 && horz > 2048 ) {
Blynk.virtualWrite(V6, LOW);
Blynk.virtualWrite(V2, HIGH);
Blynk.virtualWrite(V3, LOW);
} else if (vert == 2048 && horz < 2048 ) {
Blynk.virtualWrite(V6, LOW);
Blynk.virtualWrite(V2, LOW);
Blynk.virtualWrite(V3, HIGH);
}
else {
Blynk.virtualWrite(V6, LOW);
Blynk.virtualWrite(V2, LOW);
Blynk.virtualWrite(V3, LOW);
}
}
delay(50);
}
BLYNK_WRITE(V4)
{
int pinValue = param.asInt();
Serial.print("From Blynk Buzzer Switch value is: ");
Serial.println(pinValue);
if (pinValue) {
digitalWrite(BuzzerPin, HIGH);
tone(BuzzerPin, 100); // 100 is the frequncy of the Tone!
}
else {
digitalWrite(BuzzerPin, LOW);
noTone(BuzzerPin);
}
}
BLYNK_WRITE(V5) {
int pinValue = param.asInt();
Serial.print("From Blynk Relay Switch value is: ");
Serial.println(pinValue);
if (pinValue) {
digitalWrite(RelayPin, HIGH);
// 100 is the frequncy of the Tone!
}
else {
digitalWrite(RelayPin, LOW);
}
}