CCCPaste

IoT Traffic Light System

/********* Pleasedontcode.com **********

	Pleasedontcode thanks you for automatic code generation! Enjoy your code!

	- Terms and Conditions:
	You have a non-exclusive, revocable, worldwide, royalty-free license
	for personal and commercial use. Attribution is optional; modifications
	are allowed, but you're responsible for code maintenance. We're not
	liable for any loss or damage. For full terms,
	please visit pleasedontcode.com/termsandconditions.

	- Project: TrafficLights
	- Source Code compiled for: ESP32 DevKit V1
	- Source Code created on: 2024-02-26 10:45:15
	- Source Code generated by: Mercy

********* Pleasedontcode.com **********/

/****** SYSTEM REQUIREMENTS *****/
/****** SYSTEM REQUIREMENT 1 *****/
	/* Ultrasonic sensor measures distance. If distance */
	/* is less than 30 cm run the high density function, */
	/* if distance is less than 30 cm run the low density */
	/* function */
/****** SYSTEM REQUIREMENT 2 *****/
	/* High-density function - turn on green1, and red2, */
	/* the rest stay off. Do this for 20 seconds. Then */
	/* turn off everything and turn on yellow1 and */
	/* yellow2 for 5 seconds.  then turn off everything. */
	/* Afterwads turn on red 1 and green 1 for 20 sec and */
	/* turn of */
/****** SYSTEM REQUIREMENT 3 *****/
	/* Low-density function - turn on green1, and red2, */
	/* the rest stay off. Do this for 10 seconds. Then */
	/* turn off everything and turn on yellow1 and */
	/* yellow2 for 5 seconds. then turn off everything. */
	/* Afterwads turn on red 1 and green 1 for 10 sec and */
	/* turn of */
/****** SYSTEM REQUIREMENT 4 *****/
	/* High density -The seven segment should count down */
	/* from 9 to 0 with a delay of 2 seconds */
/****** SYSTEM REQUIREMENT 5 *****/
	/* High density -The seven segment should count down */
	/* from 9 to 0 with a delay of 1 seconds */
/****** END SYSTEM REQUIREMENTS *****/

#include 
#include 
#include "AdafruitIO_WiFi.h"
#include 
#include 

#define SEVEN_SEG_A 22
#define SEVEN_SEG_B 23
#define SEVEN_SEG_C 32
#define SEVEN_SEG_D 25
#define SEVEN_SEG_E 26
#define SEVEN_SEG_F 27
#define SEVEN_SEG_G 33

#define GREEN_1 4
#define GREEN_2 16
#define RED_1 17
#define RED_2 5
#define YELLOW_1 18
#define YELLOW_2 19

#define PUSH_BUTTON 15
#define TRIGGER_PIN 12
#define ECHO_PIN 14

#define WIFI_SSID "Sheila"
#define WIFI_PASS "123456789"

#define MQTT_SERVER "io.adafruit.com"
#define MQTT_PORT 1883
#define MQTT_USERNAME "shei2000"
#define MQTT_KEY "xxx"

#define ADAFRUIT_IO_USERNAME "shei2000"
#define ADAFRUIT_IO_KEY "xxx"

WiFiClient espClient;
Adafruit_MQTT_Client mqtt(&espClient, MQTT_SERVER, MQTT_PORT, MQTT_USERNAME, MQTT_KEY);

Adafruit_MQTT_Publish green1_feed = Adafruit_MQTT_Publish(&mqtt, MQTT_USERNAME "/feeds/green1");
Adafruit_MQTT_Publish green2_feed = Adafruit_MQTT_Publish(&mqtt, MQTT_USERNAME "/feeds/green2");
Adafruit_MQTT_Publish red1_feed = Adafruit_MQTT_Publish(&mqtt, MQTT_USERNAME "/feeds/red1");
Adafruit_MQTT_Publish red2_feed = Adafruit_MQTT_Publish(&mqtt, MQTT_USERNAME "/feeds/red2");
Adafruit_MQTT_Publish yellow1_feed = Adafruit_MQTT_Publish(&mqtt, MQTT_USERNAME "/feeds/yellow1");
Adafruit_MQTT_Publish yellow2_feed = Adafruit_MQTT_Publish(&mqtt, MQTT_USERNAME "/feeds/yellow2");
Adafruit_MQTT_Publish pushbutton_feed = Adafruit_MQTT_Publish(&mqtt, MQTT_USERNAME "/feeds/pushbutton");
Adafruit_MQTT_Publish ultrasonic_feed = Adafruit_MQTT_Publish(&mqtt, MQTT_USERNAME "/feeds/ultrasonic");

AdafruitIO_WiFi io(ADAFRUIT_IO_USERNAME, ADAFRUIT_IO_KEY, WIFI_SSID, WIFI_PASS);


int distance = 0;
int countdown = 0;
bool push_button_state = false;
bool push_button_pressed = false;

void setup() {
  Serial.begin(115200);
  delay(10);

  pinMode(SEVEN_SEG_A, OUTPUT);
  pinMode(SEVEN_SEG_B, OUTPUT);
  pinMode(SEVEN_SEG_C, OUTPUT);
  pinMode(SEVEN_SEG_D, OUTPUT);
  pinMode(SEVEN_SEG_E, OUTPUT);
  pinMode(SEVEN_SEG_F, OUTPUT);
  pinMode(SEVEN_SEG_G, OUTPUT);
  
  pinMode(GREEN_1, OUTPUT);
  pinMode(GREEN_2, OUTPUT);
  pinMode(RED_1, OUTPUT);
  pinMode(RED_2, OUTPUT);
  pinMode(YELLOW_1, OUTPUT);
  pinMode(YELLOW_2, OUTPUT);
  pinMode(PUSH_BUTTON, INPUT_PULLUP);
  pinMode(TRIGGER_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);

 // connectToWiFi();

Serial.println("Connecting to Wi-Fi");
  io.connect();
  while(io.status() < AIO_CONNECTED) {
    delay(500);
    Serial.print(".");
}
Serial.println();

  Serial.println("Connected to Adafruit IO");
}

void loop() {
  // Read ultrasonic sensor
  distance = getUltrasonicDistance();
  //ultrasonic_feed.publish(distance);

  
 // Send data to Adafruit IO
  AdafruitIO_Feed *ultrasonicFeed = io.feed("distance");
  ultrasonicFeed->save(distance);
  


  // Check push button state
  if (digitalRead(PUSH_BUTTON) == LOW && !push_button_pressed) {
    push_button_state = !push_button_state;
    pushbutton_feed.publish(push_button_state ? "ON" : "OFF");
    push_button_pressed = true;
    countdown = 10;
    displayCountdown();
  } else if (digitalRead(PUSH_BUTTON) == HIGH) {
    push_button_pressed = false;
  }

  if (push_button_state) {
    if (countdown > 0) {
      countdown--;
      displayCountdown();
    } else {
      push_button_state = false;
      pushbutton_feed.publish("OFF");
      // Resume based on ultrasonic readings
      resumeTrafficLights();
    }
  } else {
    // Control traffic lights based on ultrasonic readings
    controlTrafficLights();
  }
}

void controlTrafficLights() {
  if (distance >= 30) {
    // Turn on green1 and red2
    digitalWrite(GREEN_1, HIGH);
    digitalWrite(RED_2, HIGH);
    delay(6000); // 6 seconds
    AdafruitIO_Feed *green1Feed = io.feed("ON");
  AdafruitIO_Feed *humidityFeed = io.feed("humidity");

  temperatureFeed->save(temperature);
  humidityFeed->save(humidity);

  } else {
    // Turn on green1 and red2
    digitalWrite(GREEN_1, HIGH);
    digitalWrite(RED_2, HIGH);
    delay(10000); // 10 seconds
    
  }
  digitalWrite(GREEN_1, LOW);
  digitalWrite(RED_2, LOW);
  
  // Turn on yellow1 and yellow2
  digitalWrite(YELLOW_1, HIGH);
  digitalWrite(YELLOW_2, HIGH);
  delay(3000); // 3 seconds
  digitalWrite(YELLOW_1, LOW);
  digitalWrite(YELLOW_2, LOW);

  // Turn on red1 and green2
  if (distance >= 30) {
    // Turn on red1 and green2
    digitalWrite(RED_1, HIGH);
    digitalWrite(GREEN_2, HIGH);
    delay(6000); // 6 seconds
  } else {
    // Turn on red1 and green2
    digitalWrite(RED_1, HIGH);
    digitalWrite(GREEN_2, HIGH);
    delay(10000); // 10 seconds
  }
  digitalWrite(RED_1, LOW);
  digitalWrite(GREEN_2, LOW);
}

void resumeTrafficLights() {
  if (distance >= 30) {
    digitalWrite(GREEN_1, HIGH);
    digitalWrite(RED_2, HIGH);
  } else {
    digitalWrite(GREEN_1, HIGH);
    digitalWrite(RED_2, HIGH);
  }
}

int getUltrasonicDistance() {
  digitalWrite(TRIGGER_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN, LOW);
  long duration = pulseIn(ECHO_PIN, HIGH);
  int distance_cm = duration * 0.034 / 2;
  serial.print(distance_cm)
  return distance_cm;
}

void displayCountdown() {
  digitalWrite(SEVEN_SEG_A, LOW);
  digitalWrite(SEVEN_SEG_B, LOW);
  digitalWrite(SEVEN_SEG_C, LOW);
  digitalWrite(SEVEN_SEG_D, LOW);
  digitalWrite(SEVEN_SEG_E, LOW);
  digitalWrite(SEVEN_SEG_F, LOW);
  digitalWrite(SEVEN_SEG_G, LOW);

  switch(countdown) {
    case 0:
      digitalWrite(SEVEN_SEG_A, HIGH);
      digitalWrite(SEVEN_SEG_B, HIGH);
      digitalWrite(SEVEN_SEG_C, HIGH);
      digitalWrite(SEVEN_SEG_D, HIGH);
      digitalWrite(SEVEN_SEG_E, HIGH);
      digitalWrite(SEVEN_SEG_F, HIGH);
      break;
    case 1:
      digitalWrite(SEVEN_SEG_B, HIGH);
      digitalWrite(SEVEN_SEG_C, HIGH);
      break;
    case 2:
      digitalWrite(SEVEN_SEG_A, HIGH);
      digitalWrite(SEVEN_SEG_B, HIGH);
      digitalWrite(SEVEN_SEG_D, HIGH);
      digitalWrite(SEVEN_SEG_E, HIGH);
      digitalWrite(SEVEN_SEG_G, HIGH);
      break;
    case 3:
      digitalWrite(SEVEN_SEG_A, HIGH);
      digitalWrite(SEVEN_SEG_B, HIGH);
      digitalWrite(SEVEN_SEG_C, HIGH);
      digitalWrite(SEVEN_SEG_D, HIGH);
      digitalWrite(SEVEN_SEG_G, HIGH);
      break;
    case 4:
      digitalWrite(SEVEN_SEG_B, HIGH);
      digitalWrite(SEVEN_SEG_C, HIGH);
      digitalWrite(SEVEN_SEG_F, HIGH);
      digitalWrite(SEVEN_SEG_G, HIGH);
      break;
    case 5:
      digitalWrite(SEVEN_SEG_A, HIGH);
      digitalWrite(SEVEN_SEG_C, HIGH);
      digitalWrite(SEVEN_SEG_D, HIGH);
      digitalWrite(SEVEN_SEG_F, HIGH);
      digitalWrite(SEVEN_SEG_G, HIGH);
      break;
    case 6:
      digitalWrite(SEVEN_SEG_A, HIGH);
      digitalWrite(SEVEN_SEG_C, HIGH);
      digitalWrite(SEVEN_SEG_D, HIGH);
      digitalWrite(SEVEN_SEG_E, HIGH);
      digitalWrite(SEVEN_SEG_F, HIGH);
      digitalWrite(SEVEN_SEG_G, HIGH);
      break;
    case 7:
      digitalWrite(SEVEN_SEG_A, HIGH);
      digitalWrite(SEVEN_SEG_B, HIGH);
      digitalWrite(SEVEN_SEG_C, HIGH);
      break;
    case 8:
      digitalWrite(SEVEN_SEG_A, HIGH);
      digitalWrite(SEVEN_SEG_B, HIGH);
      digitalWrite(SEVEN_SEG_C, HIGH);
      digitalWrite(SEVEN_SEG_D, HIGH);
      digitalWrite(SEVEN_SEG_E, HIGH);
      digitalWrite(SEVEN_SEG_F, HIGH);
      digitalWrite(SEVEN_SEG_G, HIGH);
      break;
    case 9:
      digitalWrite(SEVEN_SEG_A, HIGH);
      digitalWrite(SEVEN_SEG_B, HIGH);
      digitalWrite(SEVEN_SEG_C, HIGH);
      digitalWrite(SEVEN_SEG_D, HIGH);
      digitalWrite(SEVEN_SEG_F, HIGH);
      digitalWrite(SEVEN_SEG_G, HIGH);
      break;
  }
}

void connectToWiFi() {
  Serial.print("Connecting to Wi-Fi");
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("Connected!");
}

void MQTT_connect() {
  int8_t ret;
  if (mqtt.connected()) {
    return;
  }
  Serial.print("Connecting to MQTT...");
  while ((ret = mqtt.connect()) != 0) {
    Serial.println(mqtt.connectErrorString(ret));
    Serial.println("Retrying MQTT connection in 5 seconds...");
    mqtt.disconnect();
    delay(5000);
  }
  Serial.println("MQTT Connected!");
}