I’m new to Blynk and I’m building a smart traffic light system that can be controlled remotely when needed.
I’m using a Raspberry Pi Pico W + Wi - Fi communication
About Project
The code simulates traffic light at an intersection
North and South traffic lights work together
Same for East and West
Ultrasonic sensors(for lack of better sensors) have been put in place to detect cars
-The sensor is triggered just before the green light is turn on to detect the presence of a car thereby increases the green light duration from 5seconds to 10seconds.
My Problem
Blynk goes offline after some few seconds of staying online
Code is below
I used correct SSID,Password,authentication token
Code is in Micropython
from machine import Pin
import blynklib
import time
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("*******","*******")
BLYNK_AUTH = '*************************************'
# Wait for network connection
wait = 10
while wait > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
wait -= 1
print('waiting for connection...')
time.sleep(1)
# Handle connection error
if wlan.status() != 3:
raise RuntimeError('network connection failed')
else:
print('connected')
ip = wlan.ifconfig()[0]
print('IP: ', ip)
# Connect to Blynk
blynk = blynklib.Blynk(BLYNK_AUTH)
# Initialize the relay pins
relay1_pin = Pin(4, Pin.OUT)
relay2_pin = Pin(8, Pin.OUT)
relay3_pin = Pin(12, Pin.OUT)
relay4_pin = Pin(20, Pin.OUT)
relay5_pin = Pin(10, Pin.OUT)
relay6_pin = Pin(18, Pin.OUT)
# Set up GPIO pins for traffic lights
NORTH_RED_PIN = machine.Pin(2,machine.Pin.OUT)
NORTH_YELLOW_PIN = machine.Pin(3, machine.Pin.OUT)
NORTH_GREEN_PIN = machine.Pin(4, machine.Pin.OUT)
SOUTH_RED_PIN = machine.Pin(6, machine.Pin.OUT)
SOUTH_YELLOW_PIN =machine.Pin(7, machine.Pin.OUT)
SOUTH_GREEN_PIN = machine.Pin(8, machine.Pin.OUT)
EAST_RED_PIN = machine.Pin(10, machine.Pin.OUT)
EAST_YELLOW_PIN = machine.Pin(11, machine.Pin.OUT)
EAST_GREEN_PIN = machine.Pin(12, machine.Pin.OUT)
WEST_RED_PIN = machine.Pin(18, machine.Pin.OUT)
WEST_YELLOW_PIN =machine.Pin(19, machine.Pin.OUT)
WEST_GREEN_PIN = machine.Pin(20, machine.Pin.OUT)
PEDESTRIAN_GREEN_PIN = machine.Pin(15, machine.Pin.OUT)
PEDESTRIAN_RED_PIN = machine.Pin(14, machine.Pin.OUT)
PEDESTRIAN_YELLOW_PIN = machine.Pin(16, machine.Pin.OUT)
#Ultrasonic Senesor Pins
S1 = machine.Pin(0,machine.Pin.OUT)
S2 = machine.Pin(1,machine.Pin.OUT)
S3 = machine.Pin(5,machine.Pin.OUT)
S4 = machine.Pin(9,machine.Pin.OUT)
S5 = machine.Pin(13,machine.Pin.OUT)
S6 = machine.Pin(17,machine.Pin.OUT)
S7 = machine.Pin(26,machine.Pin.OUT)
S8 = machine.Pin(27,machine.Pin.OUT)
#Function to Measure Distance
def measure_distance(a,b):
# Trigger the ultrasonic sensor
a.low()
time.sleep_us(2)
a.high()
time.sleep_us(10)
a.low()
# Wait for the echo pulse
while b.value() == 0:
pass
pulse_start = time.ticks_us()
while b.value() == 1:
pass
pulse_end = time.ticks_us()
# Calculate the distance based on the pulse duration
pulse_duration = time.ticks_diff(pulse_end, pulse_start)
distance = pulse_duration * 0.0343 / 2
return distance
#Funcation for Pedestrian Traffic Light
def pedestrian_crossing():
#Pedestrian
time.sleep(2)
PEDESTRIAN_RED_PIN.value(0)
PEDESTRIAN_GREEN_PIN.value(1)
time.sleep(5)
PEDESTRIAN_GREEN_PIN.value(0)
PEDESTRIAN_YELLOW_PIN.value(1)
time.sleep(2)
PEDESTRIAN_YELLOW_PIN.value(0)
PEDESTRIAN_RED_PIN.value(1)
time.sleep(2)
#Condidtions to take into consideration to extend the duration of green light
def control(d1, d2, L3, N3, L2, N2, L1, N1):
L3.value(0)
N3.value(0)
N2.value(1)
L2.value(1)
if d1 <= 10:
if d2 <= 10:
time.sleep(5)
else:
N3.value(0)
N2.value(0)
N1.value(1)
time.sleep(3)
L3.value(0)
L2.value(1)
time.sleep(2)
elif d2 <= 10:
L2.value(0)
L1.value(1)
time.sleep(3)
N3.value(0)
N2.value(1)
time.sleep(2)
N2.value(0)
time.sleep(2)
is_virtual_pin_on = False
#If a button is on,the corresponding traffic light stays Greeen with the rest of the traffic lights Red
# Register virtual pin handler
@blynk.on("V0") #virtual pin V1
def v1_write_handler(value): #read the value
global is_virtual_pin_on
if int(value[0]) == 1:
is_virtual_pin_on = True
relay1_pin.value(1) #turn the relay1 on
EAST_RED_PIN.value(1)
WEST_RED_PIN.value(1)
EAST_YELLOW_PIN.value(0)
WEST_YELLOW_PIN.value(0)
EAST_GREEN_PIN.value(0)
WEST_GREEN_PIN.value(0)
NORTH_GREEN_PIN.value(1)
SOUTH_GREEN_PIN.value(0)
NORTH_YELLOW_PIN.value(0)
SOUTH_YELLOW_PIN.value(0)
NORTH_RED_PIN.value(0)
SOUTH_RED_PIN.value(1)
PEDESTRIAN_YELLOW_PIN.value(0)
PEDESTRIAN_RED_PIN.value(1)
PEDESTRIAN_GREEN_PIN.value(0)
print("One")
#NOrth
else:
relay1_pin.value(0) #turn the relay1 off
is_virtual_pin_on = False
EAST_RED_PIN.value(0)
EAST_RED_PIN.value(0)
WEST_RED_PIN.value(0)
NORTH_GREEN_PIN.value(0)
SOUTH_RED_PIN.value(0)
PEDESTRIAN_RED_PIN.value(0)
@blynk.on("V1") #virtual pin V2
def v2_write_handler(value): #read the value
global is_virtual_pin_on
if int(value[0]) == 1:
is_virtual_pin_on = True
print("Two")
relay2_pin.value(1)
WEST_RED_PIN.value(0)
EAST_RED_PIN.value(1)
WEST_RED_PIN.value(1)
EAST_YELLOW_PIN.value(0)
WEST_YELLOW_PIN.value(0)
EAST_GREEN_PIN.value(0)
WEST_GREEN_PIN.value(0)
NORTH_GREEN_PIN.value(0)
SOUTH_GREEN_PIN.value(1)
NORTH_YELLOW_PIN.value(0)
SOUTH_YELLOW_PIN.value(0)
NORTH_RED_PIN.value(1)
SOUTH_RED_PIN.value(0)
PEDESTRIAN_YELLOW_PIN.value(0)
PEDESTRIAN_RED_PIN.value(1)
PEDESTRIAN_GREEN_PIN.value(0)
#South
else:
relay2_pin.value(0) #turn the relay2 off
is_virtual_pin_on = False
EAST_RED_PIN.value(0)
WEST_RED_PIN.value(0)
SOUTH_GREEN_PIN.value(0)
NORTH_RED_PIN.value(0)
PEDESTRIAN_RED_PIN.value(0)
@blynk.on("V2") #virtual pin V3
def v3_write_handler(value): #read the value
global is_virtual_pin_on
if int(value[0]) == 1:
is_virtual_pin_on = True
print("Three")
relay3_pin.value(1)
EAST_RED_PIN.value(0)
WEST_RED_PIN.value(1)
EAST_YELLOW_PIN.value(0)
WEST_YELLOW_PIN.value(0)
EAST_GREEN_PIN.value(1)
WEST_GREEN_PIN.value(0)
NORTH_GREEN_PIN.value(0)
SOUTH_GREEN_PIN.value(0)
NORTH_YELLOW_PIN.value(0)
SOUTH_YELLOW_PIN.value(0)
NORTH_RED_PIN.value(1)
SOUTH_RED_PIN.value(1)
PEDESTRIAN_YELLOW_PIN.value(0)
PEDESTRIAN_RED_PIN.value(1)
PEDESTRIAN_GREEN_PIN.value(0)
#East
else:
relay3_pin.value(0) #turn the relay3 off
is_virtual_pin_on = False
NORTH_RED_PIN.value(0)
SOUTH_RED_PIN.value(0)
PEDESTRIAN_RED_PIN.value(0)
WEST_RED_PIN.value(0)
@blynk.on("V3") #virtual pin V4
def v4_write_handler(value): #read the value
global is_virtual_pin_on
if int(value[0]) == 1:
is_virtual_pin_on = True
print("Four")
relay4_pin.value(1)
EAST_RED_PIN.value(1)
WEST_RED_PIN.value(0)
EAST_YELLOW_PIN.value(0)
WEST_YELLOW_PIN.value(0)
EAST_GREEN_PIN.value(0)
WEST_GREEN_PIN.value(1)
NORTH_GREEN_PIN.value(0)
SOUTH_GREEN_PIN.value(0)
NORTH_YELLOW_PIN.value(0)
SOUTH_YELLOW_PIN.value(0)
NORTH_RED_PIN.value(1)
SOUTH_RED_PIN.value(1)
PEDESTRIAN_YELLOW_PIN.value(0)
PEDESTRIAN_RED_PIN.value(1)
PEDESTRIAN_GREEN_PIN.value(0)
else:
relay4_pin.value(0) #turn the relay4 off
is_virtual_pin_on = False
NORTH_RED_PIN.value(0)
SOUTH_RED_PIN.value(0)
EAST_RED_PIN.value(0)
WEST_GREEN_PIN.value(0)
PEDESTRIAN_RED_PIN.value(0)
while True:
#If Virtual Pin is off run the normal operation of a trafficlight
if is_virtual_pin_on == False:
#Measure distance of ultrasonic sensor
d1 = measure_distance(S1,S2)
d2 = measure_distance(S3,S4)
print("d1",d1)
print("d2",d2)
#Turn of Red Light for East and West
#Turn off Red Light for North and South
EAST_RED_PIN.value(1)
WEST_RED_PIN(1)
PEDESTRIAN_RED_PIN.value(1)
#Turn off Red Light for North and South and turn on Green
NORTH_RED_PIN.value(0)
SOUTH_RED_PIN(0)
NORTH_GREEN_PIN.value(1)
SOUTH_GREEN_PIN.value(1)
time.sleep(5)
#Green Time Control control(d1,d2,NORTH_GREEN_PIN,SOUTH_GREEN_PIN,NORTH_YELLOW_PIN,SOUTH_YELLOW_PIN,NORTH_RED_PIN,SOUTH_RED_PIN)
NORTH_YELLOW_PIN.value(0)
SOUTH_YELLOW_PIN.value(0)
NORTH_RED_PIN.value(1)
SOUTH_RED_PIN(1)
time.sleep(2)
pedestrian_crossing()
#Measure distance of ultrasonic sensor
d3 = measure_distance(S5,S6)
d4 = measure_distance(S3,S4)
print("d3",d3)
print("d4",d4)
#Turn East and West Green Light on
EAST_GREEN_PIN.value(1)
WEST_GREEN_PIN.value(1)
EAST_RED_PIN.value(0)
WEST_RED_PIN(0)
time.sleep(5)
#Green Time Duration Control control(d3,d4,EAST_GREEN_PIN,WEST_GREEN_PIN,EAST_YELLOW_PIN,WEST_YELLOW_PIN,EAST_RED_PIN,WEST_RED_PIN)
EAST_YELLOW_PIN.value(0)
WEST_YELLOW_PIN.value(0)
EAST_RED_PIN.value(1)
WEST_RED_PIN(1)
time.sleep(5)
EAST_RED_PIN.value(1)
WEST_RED_PIN(1)
pedestrian_crossing()
#Else execute code under the virtual pin that is on
else:
blynk.run()
time.sleep(4)