Introduction: Distance Monitoring System Using ESP32, Ultrasonic Sensor and VVAC Cloud Dashboard

About: Supercharged No-Code IIoT Platform Create, connect, and scale IoT applications in days, not months. V-VAC delivers real time monitoring, device management, and data visualization from one browser window. Wheth…

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:

  1. Smart parking systems
  2. Obstacle detection
  3. Smart dustbin automation
  4. Liquid/solid level measurement
  5. 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

  1. ESP32 Dev Board
  2. Ultrasonic Sensor HC-SR04
  3. Jumper wires
  4. Breadboard
  5. A Wi-Fi connection
  6. 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

  1. WiFi by Arduino // This library is usually built-in, but verify that it is installed.
  2. PubSubClient by Nick O'Leary

Step 3: VVAC Cloud Setup

Steps to Connect V-VAC :

  1. Log in to your V-VAC account. (Create a new account if not signed up already.)
  2. In the Devices section add a new device.
  3. Select common device and enter the details of the device.
  4. Copy the Device Token and paste it in the MQTT section of the code.
  5. 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

  1. In Dashboard section you can configure widgets for your required data.
  2. Click “Create Dashboard”.
  3. Give your dashboard a name (e.g., Door Status Dashboard).
  4. Click the 3rd icon in the dashboard to open the dashboard.
  5. Inside the dashboard editor, click “Edit” and click "Add Widget" to add new widgets.
  6. In the selection menu choose the required widget.
  7. Link widget to a Device telemetry key (the data your device sends).
  8. After customizing your widget, click the Show on Dashboard button to display it on the dashboard.
  9. To save your changes, click the Save button at the top-right corner of the dashboard.
  10. 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.