#include <ArduinoMqttClient.h>
#include <WiFi.h>
#include <ArduinoJson.h>
#define PIR_PIN 22
static void pulish(bool pirState);
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
const char broker[] = "broker.emqx.io";
int port = 1883;
const char topic[] = "sensors/pir/state";
const long interval = 1000;
unsigned long previousMillis = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, ESP32!");
pinMode(PIR_PIN, INPUT);
WiFi.begin("Wokwi-GUEST", "");
while (WiFi.status() != WL_CONNECTED) {
delay(100);
}
if (!mqttClient.connect(broker, port)) {
Serial.print("MQTT connection failed! Error code = ");
Serial.println(mqttClient.connectError());
while (1);
}
Serial.println("You're connected to the MQTT broker!");
Serial.println();
}
static bool prevState = false;
void loop() {
// put your main code here, to run repeatedly:
mqttClient.poll();
bool pirState = digitalRead(PIR_PIN);
if (pirState && !prevState) {
Serial.println("Motion Entering");
publish(pirState);
prevState = pirState;
} else if (!pirState && prevState) {
Serial.println("Motion Exiting");
publish(pirState);
prevState = pirState;
}
delay(10); // this speeds up the simulation
}
void publish(bool pirState) {
mqttClient.beginMessage(topic);
StaticJsonDocument<200> doc;
doc["state"] = pirState;
doc["message"] = (pirState) ? "Motion Entering" : "Motion Exiting";
doc["time"] = millis();
serializeJson(doc, mqttClient);
mqttClient.endMessage();
}