#include <Arduino.h>
#include <WiFi.h>
#include <Arduino_MQTT_Client.h>
#include <ThingsBoard.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ---------- WiFi & ThingsBoard Config ----------
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define TB_SERVER "thingsboard.cloud"
#define TB_TOKEN "ajLNz0u8lYbG7l8JUtdi"
// ---------- Ultrasonic Sensor Pins ----------
const int trigPin = 17;
const int echoPin = 16;
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701
// ---------- DHT22 Sensor ----------
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// ---------- LCD ----------
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C Address 0x27
// ---------- LED, Buzzer, Push Button ----------
#define LED_PIN 5
#define BUZZER_PIN 18
#define BUTTON_PIN 2
bool alertEnabled = true;
// ---------- Globals ----------
WiFiClient wifiClient;
Arduino_MQTT_Client mqttClient(wifiClient);
ThingsBoard tb(mqttClient);
long duration;
float distanceCm;
float distanceInch;
// ---------- Connect to WiFi ----------
void connectToWiFi() {
Serial.print("Connecting to WiFi...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
// ---------- Connect to ThingsBoard ----------
void connectToThingsBoard() {
while (!tb.connected()) {
Serial.println("Connecting to ThingsBoard...");
if (tb.connect(TB_SERVER, TB_TOKEN)) {
Serial.println("Connected to ThingsBoard!");
} else {
Serial.println("Failed to connect. Retrying...");
delay(1000);
}
}
}
void setup() {
Serial.begin(115200);
// Sensor Pin Modes
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Init DHT & LCD
dht.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Smart Monitor");
lcd.setCursor(0, 1);
lcd.print("Initializing...");
delay(2000);
lcd.clear();
// Connect
connectToWiFi();
connectToThingsBoard();
}
void loop() {
// Maintain Connections
if (WiFi.status() != WL_CONNECTED) connectToWiFi();
if (!tb.connected()) connectToThingsBoard();
tb.loop();
// Button Toggle
if (digitalRead(BUTTON_PIN) == LOW) {
alertEnabled = !alertEnabled;
delay(500); // debounce
}
// Read Distance
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distanceCm = duration * SOUND_SPEED / 2;
distanceInch = distanceCm * CM_TO_INCH;
// Read DHT22
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Display on LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("D:");
lcd.print(distanceCm);
lcd.print("cm T:");
lcd.print(temperature, 1);
lcd.setCursor(0, 1);
lcd.print("H:");
lcd.print(humidity, 0);
lcd.print("% ");
lcd.print(alertEnabled ? "A:ON" : "A:OFF");
// Alert System
if (alertEnabled && distanceCm > 0 && distanceCm < 20) {
digitalWrite(LED_PIN, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
}
// Serial Monitor Output
Serial.println("-----");
Serial.print("Distance (cm): "); Serial.println(distanceCm);
Serial.print("Distance (inch): "); Serial.println(distanceInch);
Serial.print("Temperature: "); Serial.print(temperature); Serial.println(" C");
Serial.print("Humidity: "); Serial.print(humidity); Serial.println(" %");
Serial.print("Alert: "); Serial.println(alertEnabled ? "ON" : "OFF");
// Send to ThingsBoard
tb.sendTelemetryData("Distance_cm", distanceCm);
tb.sendTelemetryData("Distance_inch", distanceInch);
tb.sendTelemetryData("Temperature", temperature);
tb.sendTelemetryData("Humidity", humidity);
tb.sendTelemetryData("Alert_Triggered", (alertEnabled && distanceCm < 20) ? 1 : 0);
delay(2000);
}