ESP32-蜂鸣+数码管倒计时

本文摘要:接线方面,你需要用杜邦线连两组:蜂鸣器:板子上 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("程序结束")
`

觉得内容不错?我要

打赏杯咖啡或蜜雪冰城吧
微信扫一扫
微信赞赏码
支付宝扫一扫
支付宝赞赏码
评论 暂无评论
暂无评论,快来抢沙发吧~