// VEHICLE TYRE MONITOR
#define BLYNK_TEMPLATE_ID "TMPL3Ifw928yt"
#define BLYNK_TEMPLATE_NAME "VEHICLE TYRE MONITOR"
#define BLYNK_AUTH_TOKEN "1QzUmeK_C3FhseiJDtIIIZFlGQY6W-mc"
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include "DHT.h"
// OLED Display setup
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Wi-Fi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Thresholds
const float HIGH_PRESSURE = 50.0;
const float PUNCTURE_THRESHOLD = 5.0; // Pressure drop threshold for puncture detection
const float PUNCTURE_PRESSURE = 10.0; // Pressure level below which puncture is detected
// Buzzer pin for alarm
const int buzzerPin = 25;
const int led1 = 23;
// Potentiometer pin configuration
const int potPin1 = 34; // Potentiometer for Tire 1
const int potPin2 = 35; // Potentiometer for Tire 2
const int potPin3 = 32; // Potentiometer for Tire 3
const int potPin4 = 33; // Potentiometer for Tire 4
// DHT22 sensor pins
#define DHTPIN1 26 // GPIO26 for Tire 1
#define DHTPIN2 27 // GPIO27 for Tire 2
#define DHTPIN3 14 // GPIO14 for Tire 3
#define DHTPIN4 12 // GPIO12 for Tire 4
DHT dht1(DHTPIN1, DHT22);
DHT dht2(DHTPIN2, DHT22);
DHT dht3(DHTPIN3, DHT22);
DHT dht4(DHTPIN4, DHT22);
// Variables to track previous pressure readings
float previousPressure1 = 0;
float previousPressure2 = 0;
float previousPressure3 = 0;
float previousPressure4 = 0;
float tire1Pressure = 0;
float tire2Pressure = 0;
float tire3Pressure = 0;
float tire4Pressure = 0;
void setup() {
Serial.begin(9600);
pinMode(led1, OUTPUT);
// Wi-Fi setup
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
// Blynk initialization
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, password);
// Initialize OLED display
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED initialization failed!");
for (;;); // Stop execution if OLED initialization fails
}
display.clearDisplay();
// Configure buzzer pin
pinMode(buzzerPin, OUTPUT);
digitalWrite(buzzerPin, LOW);
// Initialize potentiometer pins
pinMode(potPin1, INPUT);
pinMode(potPin2, INPUT);
pinMode(potPin3, INPUT);
pinMode(potPin4, INPUT);
// Initialize DHT22 sensors
dht1.begin();
dht2.begin();
dht3.begin();
dht4.begin();
// Buzzer startup sequence
tone(buzzerPin, 1000, 300);
tone(buzzerPin, 1000, 200);
delay(250);
tone(buzzerPin, 1500, 200);
delay(250);
tone(buzzerPin, 2000, 200);
delay(250);
tone(buzzerPin, 2500, 200);
delay(250);
tone(buzzerPin, 3000, 200);
delay(250);
tone(buzzerPin, 3500, 200);
delay(250);
tone(buzzerPin, 4000, 200);
delay(250);
// Debug: Confirm setup completion
Serial.println("Setup complete");
}
void loop() {
Blynk.run();
digitalWrite(led1, LOW);
// Read potentiometer values
int potValue1 = analogRead(potPin1);
int potValue2 = analogRead(potPin2);
int potValue3 = analogRead(potPin3);
int potValue4 = analogRead(potPin4);
// Map potentiometer values to pressure range (0 to 60 PSI)
tire1Pressure = map(potValue1, 0, 4095, 0, 60);
tire2Pressure = map(potValue2, 0, 4095, 0, 60);
tire3Pressure = map(potValue3, 0, 4095, 0, 60);
tire4Pressure = map(potValue4, 0, 4095, 0, 60);
// Debug: Print potentiometer values
Serial.print("TP1: ");
Serial.print(tire1Pressure);
Serial.print(" |TP2: ");
Serial.print(tire2Pressure);
Serial.print(" |TP3: ");
Serial.print(tire3Pressure);
Serial.print(" |TP4: ");
Serial.println(tire4Pressure);
// Display pressures on OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.printf("Tire 1: %.1f PSI\n", tire1Pressure);
display.printf("Tire 2: %.1f PSI\n", tire2Pressure);
display.printf("Tire 3: %.1f PSI\n", tire3Pressure);
display.printf("Tire 4: %.1f PSI\n", tire4Pressure);
display.display();
// Send data to Blynk
sendDataToBlynk();
sendDHTDataToBlynk();
checkPuncture(tire1Pressure, previousPressure1, 0, "Tire 1");
checkPuncture(tire2Pressure, previousPressure2, 1, "Tire 2");
checkPuncture(tire3Pressure, previousPressure3, 2, "Tire 3");
checkPuncture(tire4Pressure, previousPressure4, 3, "Tire 4");
checkHighPressure(tire1Pressure, 0, "Tire 1");
checkHighPressure(tire2Pressure, 1, "Tire 2");
checkHighPressure(tire3Pressure, 2, "Tire 3");
checkHighPressure(tire4Pressure, 3, "Tire 4");
// Update previous pressure values
previousPressure1 = tire1Pressure;
previousPressure2 = tire2Pressure;
previousPressure3 = tire3Pressure;
previousPressure4 = tire4Pressure;
delay(2000);
}
void sendDataToBlynk() {
Blynk.virtualWrite(V0, tire1Pressure);
Blynk.virtualWrite(V1, tire2Pressure);
Blynk.virtualWrite(V2, tire3Pressure);
Blynk.virtualWrite(V4, tire4Pressure);
}
void sendDHTDataToBlynk() {
float t1 = dht1.readTemperature();
float t2 = dht2.readTemperature();
float t3 = dht3.readTemperature();
float t4 = dht4.readTemperature();
if (!isnan(t1)) {
Blynk.virtualWrite(V5, t1);
}
if (!isnan(t2)) {
Blynk.virtualWrite(V6, t2);
}
if (!isnan(t3)) {
Blynk.virtualWrite(V7, t3);
}
if (!isnan(t4)) {
Blynk.virtualWrite(V8, t4);
}
}
void checkPuncture(float currentPressure, float& previousPressure, int tno, const char* tireName) {
// Check for puncture threshold
if (currentPressure <= PUNCTURE_PRESSURE || (previousPressure - currentPressure) > 5) {
const char* eventcodes[] = {"pt_1", "pt_2", "pt_3", "pt_4"};
Blynk.logEvent(eventcodes[tno]);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.printf("%s Puncture!", tireName);
display.display();
Serial.print(tireName);
Serial.println(" puncture Alert!");
digitalWrite(buzzerPin, HIGH);
for (int i = 0; i <= tno; i++) {
digitalWrite(led1, HIGH);
tone(buzzerPin, 1000, 10);
digitalWrite(buzzerPin, LOW);
delay(250);
}
display.display();
} else {
// Deactivate buzzer
display.display();
}
}
void checkHighPressure(float currentPressure, int tno, const char* tireName) {
// Check for high pressure threshold
if (currentPressure >= HIGH_PRESSURE) {
Blynk.logEvent("hp");
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.printf("%s High Pressure!", tireName);
display.display();
Serial.print(tireName);
Serial.println(" high pressure Alert!");
digitalWrite(buzzerPin, HIGH);
digitalWrite(led1, HIGH);
for (int i = 0; i <= tno; i++) {
tone(buzzerPin, 2000, 200);
delay(100);
}
digitalWrite(buzzerPin, LOW);
display.display();
} else {
// Deactivate buzzer
digitalWrite(buzzerPin, LOW);
display.display();
}
}