2021-07-25

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)


希望和大家一起进步,也请各位批评指正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值