本文摘要:接线方面,你需要用杜邦线连两组:蜂鸣器:板子上 BEEP 排针 → GPIO25 排针数码管:板子上 CLK 排针 → GPIO14,DIO 排针 → GPIO27。这几个引脚如果板子排针上没有标数字,你就看看板子附带的使用手册或原理图,确认一下数码管和蜂鸣器实际接的 GPIO 号,然后把代码前几行的引脚数字改一下就行。运行效果:开机双响两声提示启动,数码管从 01:00 开始每秒递减。正常运行时...
接线方面,你需要用杜邦线连两组:蜂鸣器:板子上 BEEP 排针 → GPIO25 排针数码管:板子上 CLK 排针 → GPIO14,DIO 排针 → GPIO27。这几个引脚如果板子排针上没有标数字,你就看看板子附带的使用手册或原理图,确认一下数码管和蜂鸣器实际接的 GPIO 号,然后把代码前几行的引脚数字改一下就行。运行效果:开机双响两声提示启动,数码管从 01:00 开始每秒递减。正常运行时每秒短响一下,最后 10 秒响声加长,最后 5 秒急促连响,到 0 时数码管闪烁 + 长鸣 5 次结束。
`from machine import Pin, PWM
import time
========== 配置区(根据板子排针实际接线修改)==========
BEEP_PIN = 25 # 蜂鸣器 GPIO
CLK_PIN = 14 # 数码管 CLK
DIO_PIN = 27 # 数码管 DIO
COUNTDOWN = 60 # 倒计时秒数(最大 99:59)
=====================================================
----- TM1637 数码管驱动 -----
SEG = [0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71]
class TM1637:
def __init__(self, clk, dio):
self.clk = Pin(clk, Pin.OUT, value=1)
self.dio = Pin(dio, Pin.OUT, value=1)
def _start(self):
self.dio.value(0)
time.sleep_us(5)
self.clk.value(0)
time.sleep_us(5)
def _stop(self):
self.dio.value(0)
time.sleep_us(5)
self.clk.value(1)
time.sleep_us(5)
self.dio.value(1)
time.sleep_us(5)
def _byte(self, b):
for _ in range(8):
self.clk.value(0)
self.dio.value(b & 1)
time.sleep_us(5)
self.clk.value(1)
time.sleep_us(5)
b >>= 1
# ACK
self.clk.value(0)
self.dio.value(1)
time.sleep_us(5)
self.clk.value(1)
time.sleep_us(5)
self.clk.value(0)
time.sleep_us(5)
def _cmd(self, c):
self._start()
self._byte(c)
self._stop()
def show(self, h, m, colon=True):
"""显示 HH:MM 或 MM:SS"""
d = [SEG[h // 10], SEG[h % 10], SEG[m // 10], SEG[m % 10]]
if colon:
d[1] |= 0x80 # 冒号亮
self._cmd(0x40)
self._start()
self._byte(0xC0)
for x in d:
self._byte(x)
self._stop()
def clear(self):
self._cmd(0x40)
self._start()
self._byte(0xC0)
for _ in range(4):
self._byte(0)
self._stop()
def bright(self, level=7):
self._cmd(0x88 | (level & 7))
----- 蜂鸣器 -----
class Buzzer:
def __init__(self, pin):
self.pwm = PWM(Pin(pin), freq=1000, duty=0)
def on(self):
self.pwm.duty(512)
def off(self):
self.pwm.duty(0)
def beep(self, sec=0.15):
self.on()
time.sleep(sec)
self.off()
----- 倒计时主程序 -----
disp = TM1637(CLK_PIN, DIO_PIN)
disp.bright(5)
disp.clear()
buzz = Buzzer(BEEP_PIN)
total = COUNTDOWN
print("倒计时开始:", total, "秒")
开机短响提示
buzz.beep(0.3)
time.sleep(0.2)
buzz.beep(0.3)
while total >= 0:
m, s = divmod(total, 60)
disp.show(m, s)
# 最后 5 秒急促提示音
if total <= 5 and total > 0:
buzz.beep(0.1)
# 最后 10 秒每秒响一下
elif total <= 10 and total > 0:
buzz.beep(0.2)
# 正常每秒短响
elif total > 0:
buzz.beep(0.1)
# 倒计时结束
if total == 0:
# 数码管闪烁 + 长响
for _ in range(5):
disp.show(0, 0)
buzz.on()
time.sleep(0.4)
disp.clear()
buzz.off()
time.sleep(0.3)
print("倒计时结束!")
break
print("剩余:", total, "秒")
total -= 1
time.sleep(1)
结束后清理
disp.clear()
buzz.off()
print("程序结束")
`
觉得内容不错?我要