#define BLYNK_TEMPLATE_ID "TMPL67L2e62dk"
#define BLYNK_TEMPLATE_NAME "Node3 Template"
#define BLYNK_AUTH_TOKEN "fHybbgJl0t8xfJGN4Y3d9msfXqqV2zcw"
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <ArduinoJson.h>
#include <PubSubClient.h>
#include <BlynkSimpleEsp32.h>
char auth[] = BLYNK_AUTH_TOKEN;
BlynkTimer timer;
#define BLYNK_PRINT Serial
// 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 = "Node3-Distance";
const char* topic_publish2 = "Node3-Buttons";
const char* topic_subscribe1 = "Node1-joyStick";
const char* topic_subscribe2 = "Node2-light"; // Topic to receive messages
#define PIN_TRIG 32
#define PIN_ECHO 34
#define SOUND_SPEED 0.034
const int button1Pin = 26;
int oldValueOfButton1 = LOW; // default/idle value for pin 8 is low.
const int button2Pin = 27;
int oldValueOfButton2 = LOW; // default/idle value for pin 8 is low.
const int pinR = 0;
const int pinG = 2;
const int pinB = 15;
#define RelayPin 21
// 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-light") {
if (message == "Light_Detected") {
digitalWrite(RelayPin, HIGH);
} else {
digitalWrite(RelayPin, LOW);
}
}
else if (String(topic) == "Node1-joyStick") {
DynamicJsonDocument JoyStickDoc(1024);
DeserializationError error = deserializeJson(JoyStickDoc, message);
if (error) {
Serial.print("Failed to parse JSON: ");
Serial.println(error.f_str());
return;
}
int vert = JoyStickDoc["vertical"];
int horz = JoyStickDoc["horizontal"];
if (vert == 2048 && horz == 2048 ) {
digitalWrite(pinR, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinB, LOW);
} else if (vert > 2048 && horz == 2048 ) {
digitalWrite(pinR, HIGH);
digitalWrite(pinG, LOW);
digitalWrite(pinB, LOW);
} else if (vert == 2048 && horz > 2048 ) {
digitalWrite(pinR, LOW);
digitalWrite(pinG, HIGH);
digitalWrite(pinB, LOW);
} else if (vert == 2048 && horz < 2048 ) {
digitalWrite(pinR, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinB, HIGH);
}
else {
digitalWrite(pinR, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinB, LOW);
}
}
}
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 sendUltraSensor() {
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
int duration = pulseIn(PIN_ECHO, HIGH);
float Distance = duration * SOUND_SPEED / 2.0;
Serial.print("Distance in CM: ");
Serial.println(Distance);
// this speeds up the simulation
DynamicJsonDocument UltraDoc(1024);
UltraDoc["distance"] = Distance;
char UltraBuffer[1024];
serializeJson (UltraDoc, UltraBuffer) ;
mqttClient.publish(topic_publish1, UltraBuffer);
Blynk.virtualWrite(V0, Distance);
if (Distance < 20) {
Blynk.virtualWrite(V1, HIGH);
}
else {
Blynk.virtualWrite(V1, LOW);
}
}
void setup() {
Serial.begin(115200);
Serial.println("Hello, ESP32!");
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
pinMode(button1Pin, INPUT);
pinMode(button2Pin, INPUT);
pinMode(pinR, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinB, OUTPUT);
pinMode(RelayPin, 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,sendUltraSensor);
}
void loop() {
Blynk.run();
timer.run();
if (!mqttClient.connected()) {
reconnect();
}
mqttClient.loop();
int newValueOfButton1 = digitalRead(button1Pin);
int newValueOfButton2 = digitalRead(button2Pin);
// Check if the value was changed,
// by comparing it with the previous value.
DynamicJsonDocument ButtonsDoc(1024);
ButtonsDoc["button_1"] = 0;
ButtonsDoc["button_2"] = 0;
if ((newValueOfButton1 != oldValueOfButton1) || (newValueOfButton2 != oldValueOfButton2)) {
if (newValueOfButton1 != oldValueOfButton1)
{
if (newValueOfButton1 == HIGH)
{
ButtonsDoc["button_1"] = 1;
Serial.println("Speed button is pressed.");
}
else
{
ButtonsDoc["button_1"] = 0;
Serial.println("Speed button is released.");
}
// Remember the value for the next time.
oldValueOfButton1 = newValueOfButton1;
}
// Check if the value was changed,
// by comparing it with the previous value.
if (newValueOfButton2 != oldValueOfButton2)
{
if (newValueOfButton2 == HIGH)
{
ButtonsDoc["button_2"] = 1;
Serial.println("The button2 is pressed.");
}
else
{
ButtonsDoc["button_2"] = 0;
Serial.println("The button2 is released.");
}
// Remember the value for the next time.
oldValueOfButton2 = newValueOfButton2;
}
char ButtonsBuffer[1024];
serializeJson (ButtonsDoc, ButtonsBuffer) ;
mqttClient.publish(topic_publish2, ButtonsBuffer);
}
}
BLYNK_WRITE(V2)
{
int pinValue = param.asInt();
Serial.print("From Blynk red Switch value is: ");
Serial.println(pinValue);
if (pinValue) {
digitalWrite(pinR, HIGH);
digitalWrite(pinG, LOW);
digitalWrite(pinB, LOW);
}
else {
digitalWrite(pinR, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinB, LOW);
}
}
BLYNK_WRITE(V3)
{
int pinValue = param.asInt();
Serial.print("From Blynk green Switch value is: ");
Serial.println(pinValue);
if (pinValue) {
digitalWrite(pinR, LOW);
digitalWrite(pinG, HIGH);
digitalWrite(pinB, LOW);
}
else {
digitalWrite(pinR, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinB, LOW);
}
}
BLYNK_WRITE(V4)
{
int pinValue = param.asInt();
Serial.print("From Blynk blue Switch value is: ");
Serial.println(pinValue);
if (pinValue) {
digitalWrite(pinR, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinB, HIGH);
}
else {
digitalWrite(pinR, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinB, LOW);
}
}
BLYNK_WRITE(V5)
{
int pinValue = param.asInt();
Serial.print("From Blynk relay Switch value is: ");
Serial.println(pinValue);
if (pinValue) {
digitalWrite(RelayPin, HIGH);
}
else {
digitalWrite(RelayPin, LOW);
}
}