Miropython制作交通灯
前言
目前,比起C语言控制单片机,python控制单片机的教程以及一些能搜集到以及解决相应问题的回答以及博客很少,至少在我学习Micropython的过程中确实在搜集资料方面很费劲。因此希望自己在学习过程中受其他人的启发以及自己些许的思考写了两个交通灯的程序对看到的筒子们有所帮助,大家一起成长。
一、循环控制交通灯
首先说明一下我用的STM32F4系列的一款单片机,python编程相比C来说简单明了,因为底层已经给我们编好了,大家用就行,但基本的语法知识还是很相似,但不是相同。 比如要说的for+i++的语句我们直接可以用for i in range(n)就可以搞定。这里的循环方式的交通灯我们用for循环加上到达一定临界的判断,我们这里的循环一共进行1000次,利用余数的方式判断我们执行红灯还是绿灯大家应该可以看懂,中间等于9留个机会关闭上一次的灯,然后机上了两个中断,模拟黄灯闪烁,提醒车辆快速通过,以及加上蓝灯模拟加长绿灯时间长度,当然也可以是红灯。另外加上OLED显示倒计时,用总的闪烁9次减去已经闪烁的此说然后转换成字符串显示在OLED上,没错,连上OLED初始化开始等就这么少,是不是突然被Python吸粉了,废话不说上代码。
import time
import pyb
from ssd1306 import SSD1306
from pyb import Switch,Pin,ExtInt,LED,Timer
def my_beeper(ch):#蜂鸣器设置
ch.pulse_width_percent(50)
time.sleep(0.2)
ch.pulse_width_percent(0)
def Yellow():#黄灯闪烁
for i in range(1,5):
if i<=4:
pyb.LED(3).on()
time.sleep_ms(500)
pyb.LED(3).off()
time.sleep_ms(500)
def Get_X1(line):#红绿灯关闭,黄灯闪烁
pyb.LED(1).off()
pyb.LED(2).off()
Yellow()
time.sleep_ms(500)
def Get_X2(line):#蜂鸣器响,报警灯亮
pyb.LED(4).toggle()
my_beeper(chA)
def Green():#绿灯亮8s(9-1),灭1s(0)
j=i%10
z=9-j
f=str(z)
h='Next Red'
display.clear()#清屏
display.draw_text(30,30,f)
display.draw_text(60,30,h)
display.display()
pyb.LED(2).on()
def Red():#红灯亮8s(9-1),灭1s(0)
j=i%10
z=9-j
f=str(z)
h='Next Green'
display.clear()#清屏
display.draw_text(30,30,f)
display.draw_text(60,30,h)
display.display()
pyb.LED(1).on()
display = SSD1306(pinout={'sda': 'PB7','scl': 'PB6'},height=128,external_vcc=False)
display.poweron()#oled显示屏开机
display.init_display()#oled显示屏初始化
beeper=Pin('PA1')
timA=Timer(2,freq=1000)
chA=timA.channel(2,Timer.PWM,pin=beeper)
chA.pulse_width_percent(0)
while True:
s1 = ExtInt(Pin(Pin.cpu.B9), ExtInt.IRQ_FALLING, Pin.PULL_UP, Get_X2)#S1开关中断,实现蓝灯报警,蜂鸣器响0.2s
s2 = ExtInt(Pin(Pin.cpu.B8), ExtInt.IRQ_FALLING, Pin.PULL_UP, Get_X1)#S2开关中断,实现黄灯闪烁4次,间隔0.5s
for i in range(1,1000):#循环多次
if i%20<10:
Green()
if i%20==9:
pyb.LED(2).off()
time.sleep(1)
elif i%20>=10:
Red()
if i%20==19:
pyb.LED(1).off()
time.sleep(1)
二、定时器中断方式制作交通灯
利用定时器的方式主要要的重点就是两个,一个是你要设置的频率,一个是你要设置的回调函数,也就是我们的Run函数,这里我也多加了中断,而中断还加了一个蜂鸣器,在按键进入中断后闪烁黄灯,蜂鸣器发声,跳出中断进行下一个阶段的定时器回调,差不多,下附程序。
from pyb import Timer,LED,ExtInt,Pin
import time
def Run(t):
LED(1).toggle()
LED(2).toggle()
def Get_X1(line):
LED(1).off()
LED(2).off()
my_beeper(chA)
LED(3).on()
time.sleep_ms(2000)
LED(3).off()
LED(2).off()
LED(1).on()
def my_beeper(ch):
ch.pulse_width_percent(50)
#time.sleep(0.5)
time.sleep_ms(500)
ch.pulse_width_percent(0)
LED(1).on()
LED(2).off()
beeper=Pin('PA1')#
beeper
timA = Timer(2, freq=1000)
chA = timA.channel(2, Timer.PWM, pin=beeper)
chA.pulse_width_percent(0)
while True:
Tim=Timer(1,freq=0.1,callback=Run)
ext1 = ExtInt(Pin(Pin.cpu.B9), ExtInt.IRQ_FALLING, Pin.PULL_UP, Get_X1)
希望和大家一起进步,也请各位批评指正。
|