Introduction: Distance Monitoring System Using ESP32, Ultrasonic Sensor and VVAC Cloud Dashboard
In this DIY IoT project, you will learn how to interface an Ultrasonic Sensor (HC-SR04) with an ESP32 and send real-time distance values to the VVAC IoT Cloud Platform.
This project is perfect for:
- Smart parking systems
- Obstacle detection
- Smart dustbin automation
- Liquid/solid level measurement
- DIY robotics projects
The best part?
Your distance data is displayed live on the VVAC Dashboard, allowing you to visualize, track, and analyze sensor readings securely using MQTT.
Supplies
- ESP32 Dev Board
- Ultrasonic Sensor HC-SR04
- Jumper wires
- Breadboard
- A Wi-Fi connection
- Your V-VAC MQTT topic (given by V-VAC)
Step 1: Wiring ESP32 + HC-SR04
Connect the Esp32 and Sensor according to the connection Diagram.
Step 2: Install Required Arduino Libraries
- WiFi by Arduino // This library is usually built-in, but verify that it is installed.
- PubSubClient by Nick O'Leary
Step 3: VVAC Cloud Setup
Steps to Connect V-VAC :
- Log in to your V-VAC account. (Create a new account if not signed up already.)
- In the Devices section add a new device.
- Select common device and enter the details of the device.
- Copy the Device Token and paste it in the MQTT section of the code.
- Copy the username and password from the setup in devices section and paste it in the MQTT section of the code.
For further details check out (How to connect to V-VAC).
Step 4: ESP32 + HC-SR04 Code
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#define echoPin 12 // CHANGE PIN NUMBER HERE IF YOU WANT TO USE A DIFFERENT PIN
#define trigPin 13 // CHANGE PIN NUMBER HERE IF YOU WANT TO USE A DIFFERENT PIN
// WiFi Configuration
const char* ssid = "Your_Wifi_SSID"; // eg. ssid = "ssid"
const char* password = "Your_Wifi_Password"; // eg. password = "password"
// MQTT Configuration
const char* mqtt_broker = "data.volkkommen.com";
const int mqtt_port = 1883;
const char* mqtt_username = "Your_MQTT_Username"; // eg. mqtt_username = "mqtt_username"
const char* mqtt_password = "Your_MQTT_Password"; // eg. mqtt_password = "mqtt_password"
const char* device_token = "Your_Device_Token"; // eg. device_token = "6810eb7g27560f46"
long duration, distance;
WiFiClient espClient;
PubSubClient mqttClient(espClient);
void setupWiFi() {
Serial.println();
Serial.print("Connecting to WiFi: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
}
void connectMQTT() {
while (!mqttClient.connected()) {
Serial.print("Attempting MQTT connection... ");
if (mqttClient.connect(device_token, mqtt_username, mqtt_password)) {
Serial.println("connected to MQTT broker");
} else {
Serial.print("failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" trying again in 5 seconds");
delay(5000);
}
}
}
String sensor_working() {
// Example data (modify with your sensor/data)
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration / 58.2;
String disp = String(distance);
Serial.print("Distance: ");
Serial.print(disp);
Serial.println(" cm");
delay(1000);
DynamicJsonDocument doc(200); // Create a JSON document
doc["DISTANCE"] = disp; // Add a key-value pair
char payload[200]; // Create a buffer for the JSON document
serializeJson(doc,payload); // Serialize the JSON document into the buffer
return String(payload);
}
void publishData() {
String payload = sensor_working();
String topic_p = "data/v1/" + String(device_token);
if (mqttClient.publish(topic_p.c_str(), payload.c_str())) {
Serial.print("Message published successfully: ");
Serial.println(payload);
} else {
Serial.println("Failed to publish message");
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(115200);
setupWiFi();
mqttClient.setServer(mqtt_broker, mqtt_port);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(2,OUTPUT);
}
void loop() {
if (WiFi.status() != WL_CONNECTED) { // Maintain WiFi connection
setupWiFi();
}
if (!mqttClient.connected()) { // Maintain MQTT connection
connectMQTT();
}
mqttClient.loop();
static unsigned long lastPublishTime = 0; // Publish data every 2 seconds
if (millis() - lastPublishTime >= 2000) {
publishData();
lastPublishTime = millis();
}
}
Step 5: Live Monitoring on VVAC Dashboard
- In Dashboard section you can configure widgets for your required data.
- Click “Create Dashboard”.
- Give your dashboard a name (e.g., Door Status Dashboard).
- Click the 3rd icon in the dashboard to open the dashboard.
- Inside the dashboard editor, click “Edit” and click "Add Widget" to add new widgets.
- In the selection menu choose the required widget.
- Link widget to a Device telemetry key (the data your device sends).
- After customizing your widget, click the Show on Dashboard button to display it on the dashboard.
- To save your changes, click the Save button at the top-right corner of the dashboard.
- You can now remotely see the Door status from anywhere around the world.
For more IoT projects and tutorials, visit the official V-VAC Platform - V-VAC.





