#define BLYNK_TEMPLATE_ID "TMPL6E2h9_gIH"
#define BLYNK_TEMPLATE_NAME "Flame sensor"
#define BLYNK_AUTH_TOKEN "UM8eS_JeVZpRLbUkkGI0ur1CgxUaBAZd"
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
#include <SPI.h>
#include <Ultrasonic.h>
#include <BlynkSimpleEsp32.h>
#include <ArduinoJson.h>
#define TRIG_PIN_1 13
#define ECHO_PIN_1 12
#define TRIG_PIN_2 15
#define ECHO_PIN_2 2
#define TRIG_PIN_3 0
#define ECHO_PIN_3 4
#define FLAME_SENSOR_PIN 25
#define BUTTON_1_PIN 5
#define BUTTON_2_PIN 23
#define BUZZER_PIN 25
#define LED_PIN_1 14
#define LED_PIN_2 27
#define SERVO_1_PIN 16
#define SERVO_2_PIN 17
LiquidCrystal_I2C lcd(0x27, 16, 2);
int totalSlot = 2;
bool currentSlot[2] = {false, false};
int flameState = 1;
Servo servo1;
Servo servo2;
void setupLCD() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Initializing...");
delay(1000);
lcd.clear();
Serial.println("LCD initialized.");
}
void setupUltrasonic() {
pinMode(TRIG_PIN_1, OUTPUT);
pinMode(TRIG_PIN_2, OUTPUT);
pinMode(TRIG_PIN_3, OUTPUT);
pinMode(ECHO_PIN_1, INPUT);
pinMode(ECHO_PIN_2, INPUT);
pinMode(ECHO_PIN_3, INPUT);
Serial.println("Ultrasonic sensors initialized.");
}
void setupFlameSensor() {
pinMode(FLAME_SENSOR_PIN, INPUT);
Serial.println("Flame sensor initialized.");
}
void setupButtonsAndLEDs() {
pinMode(BUTTON_1_PIN, INPUT);
pinMode(BUTTON_2_PIN, INPUT);
pinMode(LED_PIN_1, OUTPUT);
pinMode(LED_PIN_2, OUTPUT);
digitalWrite(LED_PIN_1, LOW);
digitalWrite(LED_PIN_2, LOW);
Serial.println("Buttons and LEDs initialized.");
}
void setupServos() {
servo1.attach(SERVO_1_PIN);
servo2.attach(SERVO_2_PIN);
Serial.println("Servos initialized.");
}
void setupBuzzer() {
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
Serial.println("Buzzer initialized.");
}
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "test.mosquitto.org";
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
char auth[] = BLYNK_AUTH_TOKEN;
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
// Create a buffer and null-terminate the payload
char message[length + 1];
for (unsigned int i = 0; i < length; i++) {
message[i] = (char)payload[i];
}
message[length] = '\0'; // Null-terminate the string
Serial.println(message);
StaticJsonDocument<200> doc;
DeserializationError error = deserializeJson(doc, message);
ssid= doc["ssid"];
password= doc["password"];
if (ssid && password) {
Serial.print("SSID: ");
Serial.println(ssid);
Serial.print("Password: ");
Serial.println(password);
} else {
Serial.println("SSID or password not found in payload.");
}
setup_wifi();
}
// Main Setup Function
void setup() {
Serial.begin(115200); // Start serial communication
Serial.println("Starting setup...");
// setupRFID();
setupLCD();
setupUltrasonic();
setupFlameSensor();
setupButtonsAndLEDs();
setupServos();
setupBuzzer();
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, password);
Serial.println("Setup complete.");
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "ESP32Client-sirose";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("Connected");
client.subscribe("/sirose/config");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}}
}
float getDistanceUltrasonic(int triggerPin, int echoPin) {
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
int duration = pulseIn(echoPin, HIGH);
return duration * 0.034 / 2;
}
void switchServoOnButton(int buttonPin) {
//car in
if (buttonPin == BUTTON_1_PIN) {
int degree = servo1.read();
servo1.write(90 - degree);
client.publish("/sirose/car/in", "true");
} //car out
else {
int degree = servo2.read();
servo2.write(90 - degree);
client.publish("/sirose/car/out", "true");
}
}
void handleOnButtonClickedEvent(int buttonPin) {
if (digitalRead(buttonPin)) {
while(digitalRead(buttonPin)) {
delay(200);
}
switchServoOnButton(buttonPin);
}
}
void handleOnUltrasonicDistance() {
float distance1 = getDistanceUltrasonic(TRIG_PIN_2, ECHO_PIN_2);
float distance2 = getDistanceUltrasonic(TRIG_PIN_3, ECHO_PIN_3);
if (distance1 <= 5) {
while (getDistanceUltrasonic(TRIG_PIN_2, ECHO_PIN_2) <=5) {delay(200);}
delay(1000);
switchServoOnButton(BUTTON_1_PIN);
}
if (distance2 <= 5) {
while (getDistanceUltrasonic(TRIG_PIN_3, ECHO_PIN_3) <=5) {delay(200);}
delay(1000);
switchServoOnButton(BUTTON_2_PIN);
}
}
void displayLCD()
{
lcd.setCursor(0,0);
lcd.print("Available Slot: ");
lcd.setCursor(5,1);
lcd.print(totalSlot - (currentSlot[0] + currentSlot[1]));
}
void handleOnParkingSlot(int slotId) {
if (slotId == 0) {
float distance1 = getDistanceUltrasonic(TRIG_PIN_1, ECHO_PIN_1);
if (distance1 <= 50) {
currentSlot[slotId] = true;
digitalWrite(LED_PIN_2, HIGH);
digitalWrite(LED_PIN_1, LOW);
} else if (distance1 > 50) {
currentSlot[slotId] = false;
digitalWrite(LED_PIN_2, LOW);
digitalWrite(LED_PIN_1, HIGH);
}
}
}
void sendStatePayloadToServer() {
client.publish("/sirose/parkingSlot/0", String(currentSlot[0]).c_str());
client.publish("/sirose/parkingSlot/1", String(currentSlot[1]).c_str());
if (flameState) {
client.publish("/sirose/flame", String(flameState).c_str());
Blynk.logEvent("flame_alert","warning!!!");
Serial.println("flame_alert");
flameState = 0;
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
Blynk.run();
//device
displayLCD();
handleOnButtonClickedEvent(BUTTON_1_PIN);
handleOnButtonClickedEvent(BUTTON_2_PIN);
handleOnUltrasonicDistance();
handleOnParkingSlot(0);
sendStatePayloadToServer();
}