#include <SPI.h>
#include <WiFi.h>
#include <Arduino.h>
#include <HTTPClient.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebSrv.h>
const char* ssid = "NCtest";
const char* password = "f459f459";
const String servername = "http://163.18.53.145/status.php";
HTTPClient http;
WiFiServer server(80);
// 車輛停止 紅色LED
int Acar_redLED_PIN = 26;
int Bcar_redLED_PIN = 25;
// 車輛減速 黃色LED
// int Acar_yellowLED_PIN;
// int Bcar_yellowLED_PIN;
// 車輛通行 綠色LED
int Acar_greenLED_PIN = 33;
int Bcar_greenLED_PIN = 32;
// 行人停止 紅色LED
int Aped_redLED_PIN = 13;
int Bped_redLED_PIN = 12;
// 行人通行 橘色/綠色LED
int Aped_greenLED_PIN = 14;
int Bped_greenLED_PIN = 27;
// 七段顯示器
int SEG_A = 4;
int SEG_B = 18;
int SEG_C = 2;
int SEG_D = 21;
int SEG_E = 19;
int SEG_F = 16;
int SEG_G = 22;
int SEG_H = 0;
int COM0 = 15;
int COM1 = 17;
int COM2 = 23;
int COM3 = 5;
// 狀態, 時間
int curr_stat;
int yellow_time;
int red_time;
int Acar_green_time;
int Bcar_green_time;
int Aped_green_time;
int Bped_green_time;
int delayflag;
int had_delayflag;
int waiting_time;
int p0;
int p1;
int p2;
int p3;
int reconnect_count;
bool lightstate;
unsigned long time_previous;
void setup() {
Serial.begin(115200);
// Specify destination for HTTP request
http.setReuse(true);
time_previous = millis();
while (!Serial) {
;// wait for serial port to connect. Needed for native USB port only
}
pinMode(SEG_A,OUTPUT);
pinMode(SEG_B,OUTPUT);
pinMode(SEG_C,OUTPUT);
pinMode(SEG_D,OUTPUT);
pinMode(SEG_E,OUTPUT);
pinMode(SEG_F,OUTPUT);
pinMode(SEG_G,OUTPUT);
pinMode(SEG_H,OUTPUT);
pinMode(COM0,OUTPUT);
pinMode(COM1,OUTPUT);
pinMode(COM2,OUTPUT);
pinMode(COM3,OUTPUT);
pinMode(Acar_redLED_PIN, OUTPUT);
pinMode(Bcar_redLED_PIN, OUTPUT);
// pinMode(Acar_yellowLED_PIN, OUTPUT);
// pinMode(Bcar_yellowLED_PIN, OUTPUT);
pinMode(Acar_greenLED_PIN, OUTPUT);
pinMode(Bcar_greenLED_PIN, OUTPUT);
pinMode(Aped_redLED_PIN, OUTPUT);
pinMode(Bped_redLED_PIN, OUTPUT);
pinMode(Aped_greenLED_PIN, OUTPUT);
pinMode(Bped_greenLED_PIN, OUTPUT);
reconnect_count = 20;
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
//Check for the connection
while (reconnect_count > 0 && WiFi.status() != WL_CONNECTED){
delay(1000);
Serial.println("Connecting to WiFi..");
reconnect_count = reconnect_count - 1;
}
if (reconnect_count > 0){
Serial.println("Connected to the WiFi network");
/*
// 斷開wifi網路
WiFi.disconnect(true);
// 關閉網路
WiFi.mode(WIFI_OFF);
Serial.print("Server IP: ");
// 讀取IP位址
Serial.println(WiFi.localIP());
Serial.print("WiFi RSSI: ");
// 讀取WiFi強度
Serial.println(WiFi.RSSI());
*/
}
yellow_time = 0;
red_time = 9;
Acar_green_time = 0;
Aped_green_time = 0;
Bcar_green_time = 0;
Bped_green_time = 0;
delayflag = 0;
had_delayflag = 0;
waiting_time = 1;
// refresh to zero
setdigit(4,0);
curr_stat = 0;
lightstate = true;
getserverstatus(0, 0, 0, 0, 0);
}
void loop() {
// 經過一秒後就讓number加1
unsigned long time_now = millis();
if(time_now - time_previous > 1000){
state();
time_previous += 1000;
}
// 不斷地寫入數字
setnumber();
}
void setnumber(){
// 四位數{p3, p2, p1, p0}
// 求出每個位數的值後,分別更新
// 注意,此處以delay(5)隔開每個位數的更新
setdigit(0, p0);
delay(3);
setdigit(1, p1);
delay(3);
setdigit(2, p2);
delay(3);
setdigit(3, p3);
delay(3);
}
void state(){
switch (curr_stat){
// RED
case 0:
if (lightstate == true){
digitalWrite(Acar_redLED_PIN, HIGH);
// digitalWrite(Acar_yellowLED_PIN, LOW);
digitalWrite(Acar_greenLED_PIN, LOW);
digitalWrite(Aped_redLED_PIN, HIGH);
digitalWrite(Aped_greenLED_PIN, LOW);
digitalWrite(Bcar_redLED_PIN, HIGH);
// digitalWrite(Bcar_yellowLED_PIN, LOW);
digitalWrite(Bcar_greenLED_PIN, LOW);
digitalWrite(Bped_redLED_PIN, HIGH);
digitalWrite(Bped_greenLED_PIN, LOW);
lightstate = false;
}
// check server condition
if (waiting_time <= 1){
getserverstatus(0,0,0,0,0);
waiting_time = 1;
}
else{
waiting_time = waiting_time - 1;
}
// delay condition
if (delayflag == 1 && had_delayflag == 0){
Aped_green_time = Aped_green_time + 15;
Bcar_green_time = Bcar_green_time + 15;
had_delayflag = 1;
}
Serial.print("Red signal time: ");
Serial.print(red_time);
Serial.println("s");
red_time = red_time - 1;
// reset
if (red_time < 0){
if (delayflag == 1){
Acar_green_time = 0;
Aped_green_time = 44;
Bcar_green_time = 44;
Bped_green_time = 0;
delayflag = 0;
}
else{
Acar_green_time = 0;
Aped_green_time = 29;
Bcar_green_time = 29;
Bped_green_time = 0;
}
waiting_time = 2;
curr_stat = 1;
lightstate = true;
}
break;
// GREEN
case 1:
if (lightstate == true){
digitalWrite(Acar_redLED_PIN, HIGH);
// digitalWrite(Acar_yellowLED_PIN, LOW);
digitalWrite(Acar_greenLED_PIN, LOW);
digitalWrite(Aped_redLED_PIN, LOW);
digitalWrite(Aped_greenLED_PIN, HIGH);
digitalWrite(Bcar_redLED_PIN, LOW);
// digitalWrite(Bcar_yellowLED_PIN, LOW);
digitalWrite(Bcar_greenLED_PIN, HIGH);
digitalWrite(Bped_redLED_PIN, HIGH);
digitalWrite(Bped_greenLED_PIN, LOW);
lightstate = false;
}
// check server condition
if (waiting_time <= 1){
getserverstatus(1,Acar_green_time,Aped_green_time,Bcar_green_time,Bped_green_time);
waiting_time = 1;
}
else{
waiting_time = waiting_time - 1;
}
// delay condition
if (delayflag == 1 && had_delayflag == 0){
Aped_green_time = Aped_green_time + 15;
Bcar_green_time = Bcar_green_time + 15;
had_delayflag = 1;
}
Serial.print("B_car Green signal time: ");
Serial.print(Bcar_green_time);
Serial.print("s, ");
Serial.print("A_ped Green signal time: ");
Serial.print(Aped_green_time);
if (had_delayflag == 1){
Serial.println("s, Delay enabled");
}
else{
Serial.println("s");
}
p3 = Bcar_green_time / 10;
p2 = Bcar_green_time % 10;
p1 = Aped_green_time / 10;
p0 = Aped_green_time % 10;
if (Aped_green_time < 0){
Aped_green_time = 0;
digitalWrite(Aped_redLED_PIN, HIGH);
digitalWrite(Aped_greenLED_PIN, LOW);
}
else{
Aped_green_time = Aped_green_time - 1;
}
if (Bcar_green_time < 0){
Bcar_green_time = 0;
digitalWrite(Bcar_redLED_PIN, HIGH);
digitalWrite(Bcar_greenLED_PIN, LOW);
}
else{
Bcar_green_time = Bcar_green_time - 1;
}
// reset
if (Aped_green_time < 0 && Bcar_green_time < 0){
Acar_green_time = 0;
Aped_green_time = 0;
Bcar_green_time = 0;
Bped_green_time = 0;
// yellow_time = 2;
red_time = 4;
waiting_time = 2;
curr_stat = 2;
had_delayflag = 0;
delayflag = 0;
lightstate = true;
}
break;
// YELLOW
/*
case 2:
digitalWrite(Acar_redLED_PIN, HIGH);
digitalWrite(Acar_yellowLED_PIN, LOW);
digitalWrite(Acar_greenLED_PIN, LOW);
digitalWrite(Aped_redLED_PIN, HIGH);
digitalWrite(Aped_greenLED_PIN, LOW);
digitalWrite(Bcar_redLED_PIN, HIGH);
digitalWrite(Bcar_yellowLED_PIN, LOW);
digitalWrite(Bcar_yellowLED_PIN, HIGH);
digitalWrite(Bcar_greenLED_PIN, LOW);
digitalWrite(Bped_redLED_PIN, HIGH);
digitalWrite(Bped_greenLED_PIN, LOW);
// check server condition
if (waiting_time <= 1){
getserverstatus(3,0,0);
waiting_time = 1;
}
else{
waiting_time = waiting_time - 1;
}
if (delayflag == 1 && had_delayflag == 0){
Aped_green_time = Aped_green_time + 10;
Bcar_green_time = Bcar_green_time + 10;
had_delayflag = 1;
}
Serial.print("Yellow signal time: ");
Serial.print(yellow_time);
Serial.println("s");
yellow_time = yellow_time - 1;
// reset
if (yellow_time < 0){
Acar_green_time = 0;
Aped_green_time = 0;
Bcar_green_time = 0;
Bped_green_time = 0;
red_time = 3;
waiting_time = 2;
curr_stat = 3;
}
break;
*/
// RED
case 2:
if (lightstate == true){
digitalWrite(Acar_redLED_PIN, HIGH);
// digitalWrite(Acar_yellowLED_PIN, LOW);
digitalWrite(Acar_greenLED_PIN, LOW);
digitalWrite(Aped_redLED_PIN, HIGH);
digitalWrite(Aped_greenLED_PIN, LOW);
digitalWrite(Bcar_redLED_PIN, HIGH);
// digitalWrite(Bcar_yellowLED_PIN, LOW);
digitalWrite(Bcar_greenLED_PIN, LOW);
digitalWrite(Bped_redLED_PIN, HIGH);
digitalWrite(Bped_greenLED_PIN, LOW);
lightstate = false;
}
// check server condition
if (waiting_time <= 1){
getserverstatus(2,0,0,0,0);
waiting_time = 1;
}
else{
waiting_time = waiting_time - 1;
}
// delay condition
if (delayflag == 1 && had_delayflag == 0){
Aped_green_time = Aped_green_time + 15;
Bcar_green_time = Bcar_green_time + 15;
had_delayflag = 1;
}
Serial.print("Red signal time: ");
Serial.print(red_time);
Serial.println("s");
red_time = red_time - 1;
if (red_time < 0){
if (delayflag == 1){
Acar_green_time = 44;
Aped_green_time = 0;
Bcar_green_time = 0;
Bped_green_time = 44;
delayflag = 0;
}
else{
Acar_green_time = 29;
Aped_green_time = 0;
Bcar_green_time = 0;
Bped_green_time = 29;
}
waiting_time = 2;
lightstate = true;
curr_stat = 3;
}
break;
// GREEN
case 3:
if (lightstate == true){
digitalWrite(Acar_redLED_PIN, LOW);
// digitalWrite(Acar_yellowLED_PIN, LOW);
digitalWrite(Acar_greenLED_PIN, HIGH);
digitalWrite(Aped_redLED_PIN, HIGH);
digitalWrite(Aped_greenLED_PIN, LOW);
digitalWrite(Bcar_redLED_PIN, HIGH);
// digitalWrite(Bcar_yellowLED_PIN, LOW);
digitalWrite(Bcar_greenLED_PIN, LOW);
digitalWrite(Bped_redLED_PIN, HIGH);
digitalWrite(Bped_greenLED_PIN, LOW);
lightstate = false;
}
// check server condition
if (waiting_time <= 1){
getserverstatus(3,Acar_green_time,Aped_green_time,Bcar_green_time,Bped_green_time);
waiting_time = 1;
}
else{
waiting_time = waiting_time - 1;
}
// delay condition
if (delayflag == 1 && had_delayflag == 0){
Acar_green_time = Acar_green_time + 15;
Bped_green_time = Bped_green_time + 15;
had_delayflag = 1;
}
Serial.print("A_car Green signal time: ");
Serial.print(Acar_green_time);
Serial.print("s, ");
Serial.print("B_ped Green signal time: ");
Serial.print(Bped_green_time);
if (had_delayflag == 1){
Serial.println("s, Delay enabled");
}
else{
Serial.println("s");
}
p3 = Acar_green_time / 10;
p2 = Acar_green_time % 10;
p1 = Bped_green_time / 10;
p0 = Bped_green_time % 10;
if (Acar_green_time < 0){
Acar_green_time = 0;
digitalWrite(Acar_redLED_PIN, HIGH);
digitalWrite(Acar_greenLED_PIN, LOW);
}
else{
Acar_green_time = Acar_green_time - 1;
}
if (Bped_green_time < 0){
Bped_green_time = 0;
digitalWrite(Bped_redLED_PIN, HIGH);
digitalWrite(Bped_greenLED_PIN, LOW);
}
else{
Bped_green_time = Bped_green_time - 1;
}
//reset
if (Acar_green_time < 0 && Bped_green_time < 0){
// yellow_time = 2;
red_time = 4;
waiting_time = 2;
curr_stat = 0;
had_delayflag = 0;
delayflag = 0;
lightstate = true;
}
break;
// YELLOW
/*
case 5:
digitalWrite(Acar_redLED_PIN, HIGH);
digitalWrite(Acar_yellowLED_PIN, LOW);
digitalWrite(Acar_yellowLED_PIN, HIGH);
digitalWrite(Acar_greenLED_PIN, LOW);
digitalWrite(Aped_redLED_PIN, HIGH);
digitalWrite(Aped_greenLED_PIN, LOW);
digitalWrite(Bcar_redLED_PIN, HIGH);
digitalWrite(Bcar_yellowLED_PIN, LOW);
digitalWrite(Bcar_greenLED_PIN, LOW);
digitalWrite(Bped_redLED_PIN, HIGH);
digitalWrite(Bped_greenLED_PIN, LOW);
// check server condition
if (waiting_time <= 1){
getserverstatus(3,0,0);
waiting_time = 1;
}
else{
waiting_time = waiting_time - 1;
}
if (delayflag == 1 && had_delayflag == 0){
Bped_green_time = Bped_green_time + 30;
Acar_green_time = Acar_green_time + 30;
had_delayflag = 1;
}
Serial.print("Yellow signal time: ");
Serial.print(yellow_time);
Serial.println("s");
yellow_time = yellow_time - 1;
// reset
if (yellow_time <= 0){
Acar_green_time = 0;
Aped_green_time = 0;
Bcar_green_time = 0;
Bped_green_time = 0;
red_time = 3;
waiting_time = 2;
curr_stat = 0;
}
break;
*/
default: break;
}
}
void setdigit(int pos, int digit){
// 控制想要更新哪一個七段顯示器,將其腳位設為LOW
// 其他腳位則設為HIGH,代表不更新。
switch(pos){
case 0:
digitalWrite(COM0,HIGH);
digitalWrite(COM1,HIGH);
digitalWrite(COM2,HIGH);
digitalWrite(COM3,LOW);
break;
case 1:
digitalWrite(COM0,HIGH);
digitalWrite(COM1,HIGH);
digitalWrite(COM2,LOW);
digitalWrite(COM3,HIGH);
break;
case 2:
digitalWrite(COM0,HIGH);
digitalWrite(COM1,LOW);
digitalWrite(COM2,HIGH);
digitalWrite(COM3,HIGH);
break;
case 3:
digitalWrite(COM0,LOW);
digitalWrite(COM1,HIGH);
digitalWrite(COM2,HIGH);
digitalWrite(COM3,HIGH);
break;
case 4: // setup
digitalWrite(COM0,LOW);
digitalWrite(COM1,LOW);
digitalWrite(COM2,LOW);
digitalWrite(COM3,LOW);
break;
default: break;
}
// 寫入數字
switch(digit){
case 0:
digitalWrite(SEG_A, HIGH);
digitalWrite(SEG_B, HIGH);
digitalWrite(SEG_C, HIGH);
digitalWrite(SEG_D, HIGH);
digitalWrite(SEG_E, HIGH);
digitalWrite(SEG_F, HIGH);
digitalWrite(SEG_G, LOW);
digitalWrite(SEG_H, LOW);
break;
case 1:
digitalWrite(SEG_A, LOW);
digitalWrite(SEG_B, HIGH);
digitalWrite(SEG_C, HIGH);
digitalWrite(SEG_D, LOW);
digitalWrite(SEG_E, LOW);
digitalWrite(SEG_F, LOW);
digitalWrite(SEG_G, LOW);
digitalWrite(SEG_H, LOW);
break;
case 2:
digitalWrite(SEG_A, HIGH);
digitalWrite(SEG_B, HIGH);
digitalWrite(SEG_C, LOW);
digitalWrite(SEG_D, HIGH);
digitalWrite(SEG_E, HIGH);
digitalWrite(SEG_F, LOW);
digitalWrite(SEG_G, HIGH);
digitalWrite(SEG_H, LOW);
break;
case 3:
digitalWrite(SEG_A, HIGH);
digitalWrite(SEG_B, HIGH);
digitalWrite(SEG_C, HIGH);
digitalWrite(SEG_D, HIGH);
digitalWrite(SEG_E, LOW);
digitalWrite(SEG_F, LOW);
digitalWrite(SEG_G, HIGH);
digitalWrite(SEG_H, LOW);
break;
case 4:
digitalWrite(SEG_A, LOW);
digitalWrite(SEG_B, HIGH);
digitalWrite(SEG_C, HIGH);
digitalWrite(SEG_D, LOW);
digitalWrite(SEG_E, LOW);
digitalWrite(SEG_F, HIGH);
digitalWrite(SEG_G, HIGH);
digitalWrite(SEG_H, LOW);
break;
case 5:
digitalWrite(SEG_A, HIGH);
digitalWrite(SEG_B, LOW);
digitalWrite(SEG_C, HIGH);
digitalWrite(SEG_D, HIGH);
digitalWrite(SEG_E, LOW);
digitalWrite(SEG_F, HIGH);
digitalWrite(SEG_G, HIGH);
digitalWrite(SEG_H, LOW);
break;
case 6:
digitalWrite(SEG_A, HIGH);
digitalWrite(SEG_B, LOW);
digitalWrite(SEG_C, HIGH);
digitalWrite(SEG_D, HIGH);
digitalWrite(SEG_E, HIGH);
digitalWrite(SEG_F, HIGH);
digitalWrite(SEG_G, HIGH);
digitalWrite(SEG_H, LOW);
break;
case 7:
digitalWrite(SEG_A, HIGH);
digitalWrite(SEG_B, HIGH);
digitalWrite(SEG_C, HIGH);
digitalWrite(SEG_D, LOW);
digitalWrite(SEG_E, LOW);
digitalWrite(SEG_F, LOW);
digitalWrite(SEG_G, LOW);
digitalWrite(SEG_H, LOW);
break;
case 8:
digitalWrite(SEG_A, HIGH);
digitalWrite(SEG_B, HIGH);
digitalWrite(SEG_C, HIGH);
digitalWrite(SEG_D, HIGH);
digitalWrite(SEG_E, HIGH);
digitalWrite(SEG_F, HIGH);
digitalWrite(SEG_G, HIGH);
digitalWrite(SEG_H, LOW);
break;
case 9:
digitalWrite(SEG_A, HIGH);
digitalWrite(SEG_B, HIGH);
digitalWrite(SEG_C, HIGH);
digitalWrite(SEG_D, HIGH);
digitalWrite(SEG_E, LOW);
digitalWrite(SEG_F, HIGH);
digitalWrite(SEG_G, HIGH);
digitalWrite(SEG_H, LOW);
break;
default: break;
}
}
void getserverstatus(int stat, int Acar, int Aped, int Bcar, int Bped){
//Check WiFi connection status
if(WiFi.status()== WL_CONNECTED){
String serverpath = servername + "?input=R" + "," + stat + "," + Acar + "," + Aped + "," + Bcar + "," + Bped;
http.begin(serverpath.c_str());
int httpResponseCode = http.GET();
String response = http.getString();
Serial.println(response);
if (response == "DELAY" && delayflag == 0){
delayflag = 1;
}
//Free resources
http.end();
}
}