#include <WiFi.h>
#include "ThingSpeak.h"
// Wi-Fi credentials
const char* WIFI_NAME = "Wokwi-GUEST"; // Use "Wokwi-GUEST" for Wokwi simulation
const char* WIFI_PASSWORD = ""; // No password for Wokwi
// ThingSpeak credentials
const int myChannelNumber = 2944152;
const char* myApiKey = "TS1MM4OZTGNVV9AQ";
const char* server = "api.thingspeak.com";
// Ultrasonic sensor pins (same logical connections)
#define TRIG_PIN_1 5
#define ECHO_PIN_1 18
#define TRIG_PIN_2 19
#define ECHO_PIN_2 21
#define TRIG_PIN_3 2
#define ECHO_PIN_3 4
// Distance threshold (in cm)
#define THRESHOLD 50
WiFiClient client;
void setup() {
Serial.begin(9600);
// Configure ultrasonic sensor pins
pinMode(TRIG_PIN_1, OUTPUT);
pinMode(ECHO_PIN_1, INPUT);
pinMode(TRIG_PIN_2, OUTPUT);
pinMode(ECHO_PIN_2, INPUT);
pinMode(TRIG_PIN_3, OUTPUT);
pinMode(ECHO_PIN_3, INPUT);
// Connect to Wi-Fi
//WiFi.mode(WIFI_STA); // Set to station mode
WiFi.begin(WIFI_NAME, WIFI_PASSWORD, 6);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
// WiFi.begin("Wokwi-GUEST", "", 6);
}
Serial.println("Connected to WiFi!");
Serial.print("Local IP: ");
Serial.println(WiFi.localIP());
// Initialize ThingSpeak
ThingSpeak.begin(client);
}
void loop() {
// Get distances
float distance1 = getDistance(TRIG_PIN_1, ECHO_PIN_1);
float distance2 = getDistance(TRIG_PIN_2, ECHO_PIN_2);
float distance3 = getDistance(TRIG_PIN_3, ECHO_PIN_3);
// Determine parking status (1 = Occupied, 0 = Free)
int status1 = (distance1 < THRESHOLD) ? 1 : 0;
int status2 = (distance2 < THRESHOLD) ? 1 : 0;
int status3 = (distance3 < THRESHOLD) ? 1 : 0;
int alert = 0;
if(status1 == 1 && status2 == 1 && status3 == 1){
alert = 1;
Serial.print("Alert: All parking areas are full!\n");
}
else{
alert = 0;
}
// Print distances and statuses
Serial.print("Distance 1: "); Serial.print(distance1); Serial.print(" cm | Status: "); Serial.println(status1 ? "Occupied" : "Free");
Serial.print("Distance 2: "); Serial.print(distance2); Serial.print(" cm | Status: "); Serial.println(status2 ? "Occupied" : "Free");
Serial.print("Distance 3: "); Serial.print(distance3); Serial.print(" cm | Status: "); Serial.println(status3 ? "Occupied" : "Free");
// Send data to ThingSpeak
ThingSpeak.setField(1, status1);
ThingSpeak.setField(2, status2);
ThingSpeak.setField(3, status3);
ThingSpeak.setField(4, alert);
int httpCode = ThingSpeak.writeFields(myChannelNumber, myApiKey);
Serial.print("ThingSpeak Response: ");
Serial.println(httpCode);
if (httpCode == 200) {
Serial.println("Data pushed successfully!");
} else if (httpCode == -301) {
Serial.println("Error: Invalid API key or incorrect server setup.");
} else {
Serial.println("Unknown error occurred.");
}
delay(15000);
}
// Function to measure distance
float getDistance(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
return duration * 0.017; // Convert duration to distance (in cm)
}
PARKING 1
PARKING 2
PARKING 3