Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

ESP32-Based Automatic Passenger Counter and Temperature Sensor with Wi-Fi Connectivity

View and Edit Project In Cirkit DesignerImage of ESP32-Based Automatic Passenger Counter and Temperature Sensor with Wi-Fi Connectivity

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

  1. 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)
  2. DHT22

    • Description: Temperature and humidity sensor.
    • Pins: VCC, OUT, GND
  3. Solar Charger Power Bank

    • Description: Provides power to the circuit.
    • Pins: +, -
  4. 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)

LJC18A3-B-Z/BY Capacitive Proximity Sensor (2)

DHT22

Solar Charger Power Bank

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