#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include "time.h"
// Pin Definitions
#define DHTPIN 14
#define DHTTYPE DHT22 // DHT22 Sensor
#define LED_PIN 2
#define BUTTON_PIN 4 // Using GPIO 4 (with internal pull-up)
// Create Objects
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4); // 20x4 LCD, I2C address 0x27
// WiFi Credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT Settings
const char* mqtt_server = "broker.hivemq.com";
const char* mqtt_client_id = "np_device001";
const char* mqtt_status_topic = "np-iot/device001/status";
const char* mqtt_sensor_topic = "np-iot/device001/sensor";
const char* mqtt_alarm_topic = "np-iot/device001/alarm";
// NTP (Time Sync)
const char* ntpServer = "pool.ntp.org";
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsgTime = 0;
const long interval = 60000; // 60 seconds
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
}
void reconnect() {
while (!client.connected()) {
client.connect(mqtt_client_id, NULL, NULL, mqtt_status_topic, 0, true, "offline");
client.publish(mqtt_status_topic, "online", true);
}
}
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // Use internal pull-up (button to GND)
Serial.begin(115200);
lcd.init();
lcd.backlight();
dht.begin();
setup_wifi();
configTime(0, 0, ntpServer);
client.setServer(mqtt_server, 1883);
reconnect();
}
void loop() {
if (!client.connected()) reconnect();
client.loop();
unsigned long now = millis();
if (now - lastMsgTime > interval) {
lastMsgTime = now;
float temp = dht.readTemperature();
float hum = dht.readHumidity();
char payload[60];
snprintf(payload, sizeof(payload), "{\"temp\":%.2f,\"hum\":%.2f}", temp, hum);
client.publish(mqtt_sensor_topic, payload);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temp);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(hum);
lcd.print(" %");
lcd.setCursor(0, 2);
lcd.print("MQTT Connected");
lcd.setCursor(0, 3);
lcd.print("Press Btn: Alarm");
}
if (digitalRead(BUTTON_PIN) == LOW) {
client.publish(mqtt_alarm_topic, "Alarm Triggered!");
digitalWrite(LED_PIN, HIGH);
delay(1000);
digitalWrite(LED_PIN, LOW);
}
}
LCD (20x4) (I2C)