ESP32-Based Automatic Passenger Counter and Temperature Sensor with Wi-Fi Connectivity
View and Edit Project In Cirkit Designer
Circuit Documentation
Summary
This circuit is designed to function as an automatic passenger counter and temperature sensor. It utilizes an ESP32 microcontroller to interface with capacitive proximity sensors, a DHT22 temperature and humidity sensor, and a solar charger power bank for power. The system is integrated with the Blynk platform for remote monitoring and control.
Component List
LJC18A3-B-Z/BY Capacitive Proximity Sensor
- Description: Capacitive proximity sensor used to detect the presence of objects.
- Pins: VO (BLU), VI (BRN), SIG (BLK)
DHT22
- Description: Temperature and humidity sensor.
- Pins: VCC, OUT, GND
Solar Charger Power Bank
- Description: Provides power to the circuit.
- Pins: +, -
ESP32 (30 pin)
- Description: Microcontroller used to process sensor data and communicate with the Blynk platform.
- Pins: EN, VP, VN, D34, D35, D32, D33, D25, D26, D27, D14, D12, D13, GND, Vin, D23, D22, TX0, RX0, D21, D19, D18, D5, TX2, RX2, D4, D2, D15, 3V3
Wiring Details
LJC18A3-B-Z/BY Capacitive Proximity Sensor (1)
- VI (BRN) connected to ESP32 D12
- VO (BLU) connected to Ground
- SIG (BLK) not connected
LJC18A3-B-Z/BY Capacitive Proximity Sensor (2)
- VI (BRN) connected to ESP32 D14
- VO (BLU) connected to Ground
- SIG (BLK) not connected
DHT22
- OUT connected to ESP32 D13
- VCC connected to 3.3V
- GND connected to Ground
Solar Charger Power Bank
- + connected to ESP32 Vin
- - connected to ESP32 GND
Documented Code
//Blynk Software Mobile App
#define BLYNK_TEMPLATE_ID "TMPL6DfuXV6Lg"
#define BLYNK_TEMPLATE_NAME "Automatic Passenger Counter and Temperature Sensor"
#define BLYNK_AUTH_TOKEN "nhBWPP9Gey9cPCFRAYHEaH3HRmY1V85Y"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
#include <map>
#include <string>
const char* googleScriptHost = "script.google.com";
const char* googleScriptPath = "https://script.google.com/macros/s/AKfycbwSxhJ6Xf7z2yBzTZgHV80mBso-QhgB6OOCjZxooof1xSmCOn31XzjVg52WLkUKEQLh/exec"; // Replace with the path of your Web App URL
String Web_App_URL = "https://script.google.com/macros/s/AKfycbwb86Itit4vdSpg3gAsgkWd2jPU8iKmG_UDdnR_yd4MXMlgEiSgA9Wd9M1LjHtcUmcC/exec";
WiFiClientSecure client;
#include "DHT.h"
char auth[] = "nhBWPP9Gey9cPCFRAYHEaH3HRmY1V85Y";
char ssid[] = "sinigang";
char pass[] = "jessica$$";
// DHT Sensor Configuration
#define DPIN 13 // Pin to connect DHT sensor (GPIO number)
#define DTYPE DHT22 // Define DHT 11 or DHT22 sensor type
DHT dht(DPIN, DTYPE);
// IR Sensor Pins
#define IR_LEFT 14 // Pin for left IR sensor (GPIO number)
#define IR_RIGHT 12 // Pin for right IR sensor (GPIO number)
// Buzzer Pin
#define BUZZER_PIN 15 // Pin for buzzer (GPIO number)
// Variables to track passenger count
int passengersInside = 0;
int totalPassengers = 0;
// State Variables for IR Sensors
bool leftPrevState = LOW;
bool rightPrevState = LOW;
String Status_Read_Sensor = "";
// Flags for sequence detection
bool leftTriggered = false;
bool rightTriggered = false;
// Timer for sequence validation
unsigned long triggerTime = 0;
const unsigned long maxSequenceTime = 1000; // Maximum time to detect a valid sequence (3000ms)
// Timer for non-blocking temperature updates
unsigned long lastTempUpdate = 0;
const unsigned long tempUpdateInterval = 60000; // Update every 1 min
// Define the fare matrix
std::map<std::pair<String, String>, float> fareMatrix = {
{{"Poblacion Talisay", "Emall"}, 26.25},
{{"Emall", "Poblacion Talisay"}, 26.25},
// Add other origin-destination pairs and their corresponding fares
};
// Discount rates
const float studentDiscount = 0.2; // 20% discount
const float pwdDiscount = 0.2; // 20% discount
const float noDiscount = 0.0; // No discount
String selectedOrigin = "";
String selectedDestination = "";
float selectedDiscount = 0.0;
void setup() {
Serial.begin(9600);
// Initialize DHT Sensor
dht.begin();
// Set up IR Sensor Pins
pinMode(IR_LEFT, INPUT);
pinMode(IR_RIGHT, INPUT);
// Set up Buzzer Pin
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW); // Ensure buzzer is off initially
// Display initial message
Serial.println("Passenger Counter and Temperature Monitoring Started...");
Blynk.begin(auth, ssid, pass);
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected.");
Serial.println("Blynk connected...");
}
void loop() {
Blynk.run(); // Required to keep the connection alive
// Read IR Sensors
bool leftCurrentState = digitalRead(IR_LEFT);
bool rightCurrentState = digitalRead(IR_RIGHT);
// Detect LEFT sensor trigger first for entry
if (!leftTriggered && leftPrevState == LOW && leftCurrentState == HIGH) {
leftTriggered = true; // Mark LEFT as triggered
triggerTime = millis(); // Start timer
Serial.println("Left sensor triggered. Waiting for right sensor for entry...");
}
// Detect RIGHT sensor within time after LEFT sensor for entry
if (leftTriggered && rightPrevState == LOW && rightCurrentState == HIGH) {
if (millis() - triggerTime <= maxSequenceTime) { // Check if within valid time
passengersInside++;
totalPassengers++;
Serial.println("=========================");
Serial.println("Passenger Entered.");
Serial.print("Passengers Inside: ");
Serial.println(passengersInside);
Serial.print("Total Passengers Today: ");
Serial.println(totalPassengers);
Serial.println("=========================");
digitalWrite(BUZZER_PIN, HIGH); // Turn on buzzer
delay(200); // Sound duration (200ms)
digitalWrite(BUZZER_PIN, LOW); // Turn off buzzer
// Update passengersInside on Blynk
Blynk.virtualWrite(V2, passengersInside);
Blynk.virtualWrite(V11, totalPassengers); // Send total passengers to V11
}
// Reset LEFT trigger for next sequence
leftTriggered = false;
}
// Reset LEFT trigger if timeout occurs
if (leftTriggered && millis() - triggerTime > maxSequenceTime) {
leftTriggered = false;
Serial.println("Entry sequence timeout. Resetting...");
}
// Detect RIGHT sensor trigger first for exit
if (!rightTriggered && rightPrevState == LOW && rightCurrentState == HIGH) {
rightTriggered = true; // Mark RIGHT as triggered
triggerTime = millis(); // Start timer
Serial.println("Right sensor triggered. Waiting for left sensor for exit...");
}
// Detect LEFT sensor within time after RIGHT sensor for exit
if (rightTriggered && leftPrevState == LOW && leftCurrentState == HIGH) {
if (millis() - triggerTime <= maxSequenceTime) { // Check if within valid time
if (passengersInside > 0) passengersInside--; // Avoid negative count
Serial.println("=========================");
Serial.println("Passenger Exited.");
Serial.print("Passengers Inside: ");
Serial.println(passengersInside);
Serial.println("=========================");
digitalWrite(BUZZER_PIN, HIGH); // Turn on buzzer
delay(200); // Sound duration (200ms)
digitalWrite(BUZZER_PIN, LOW); // Turn off buzzer
// Update passengersInside