#include <ESP32Servo.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701
#define max_distance 400
int LEDState = 1;
long previousMillis = 0;
int interval = 5000;
char red_led = 2;
const int trigPin = 27;
const int echoPin = 32;
const int pirPin = 25;
const int servoPin = 21;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* hostname = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
const char* espClientName = "esp32Client_5775257W";
int PORTNUM = 1883;
long duration;
float distanceCm;
Servo myServo;
void setup_wifi()
{
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED )
{
delay(1000);
Serial.print(".");
}
Serial.println();
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("Given IP by the router to ESP32 is ");
Serial.println(WiFi.localIP());
}
void connectMQTT()
{
while(!client.connected() )
{
Serial.println("Connecting to MQTT ...");
if (client.connect(espClientName) )
{
Serial.println("Connected");
MQTTSubscribe();
}
else
{
Serial.print("Failed with state ");
Serial.print(client.state() );
delay(2000);
}
}
}
void callback(String topic, byte* payload, unsigned int length)
{
String messageTemp;
Serial.print("Message received in topic: ");
Serial.print(topic);
Serial.print(" length is: ");
Serial.println(length);
Serial.print("Data received from broker: ");
Serial.println(messageTemp);
for (int i = 0; i<length; i++)
{
Serial.print( (char)payload[i] );
messageTemp += (char)payload[i];
}
/// Handle your topics and payload here
// Example
if (topic == "IOTGP/letterbox/5775257W")
{
Serial.print("Mail deliver");
if (messageTemp == "Off")
{
digitalWrite(2, HIGH);
Serial.println("Off");
}
else if (messageTemp == "On")
{
digitalWrite(2, LOW);
Serial.println("On");
}
}
}
void MQTTSubscribe()
{
client.subscribe("IOTGP/letterbox/5775257W");
}
void setup_MQTT()
{
client.setServer(hostname, PORTNUM);
client.setCallback(callback);
}
void setup()
{
Serial.begin(115200);
// Initialize GPIO pins
pinMode(2, OUTPUT);
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
pinMode(pirPin, INPUT);
setup_wifi();
setup_MQTT();
// Initialize servo motor
myServo.attach(servoPin);
myServo.write(0); // Initial position of the servo
Serial.println("System initialized");
}
void loop()
{
if ( !client.connected() )
{
connectMQTT();
}
client.loop();
// Read PIR Motion Sensor
int pirState = digitalRead(pirPin);
// Debugging statement for PIR sensor state
Serial.print("PIR State: ");
Serial.println(pirState);
if (pirState == HIGH)
{
digitalWrite(2, HIGH); // Turn off LED
Serial.println("Motion detected, LED Off");
}
else
{
digitalWrite(2, LOW); // Turn on LED
Serial.println("Motion detected, LED On");
}
// Clears the trigPin Measure distance using Ultrasonic Sensor
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculate the distance
distanceCm = duration * SOUND_SPEED/2;
Serial.print("duration");
Serial.println(duration);
// Prints the distance in the Serial Monitor
Serial.print("Distance (cm): ");
Serial.println(distanceCm);
// Serial.print("Distance (inch): ");
// Serial.println(distanceInch);
// Activate servo if an object is detected within 10 cm
if (distanceCm <= 10)
{
myServo.write(0); // Move servo to 0 degrees
Serial.println("Postman Arrived");
}
else
{
myServo.write(90); // Move servo to 90 degrees
Serial.println("Postman left");
}
delay(1000);
long currentMillis = millis();
if ( currentMillis - previousMillis >= interval)
previousMillis = currentMillis;
if (LEDState == LOW)
{
LEDState = HIGH;
Serial.println("REDled On");
client.publish("IOTGP/letterbox/5775257W","On");
}
else
{
LEDState = LOW;
digitalWrite(red_led, LEDState);
}
}
Loading
esp32-devkit-c-v4
esp32-devkit-c-v4