控制36个二级管亮灭的声控流水灯程序

跟着视频学会写流水灯程序了
但是不知道怎么写声控的,想知道声控流水灯程序怎么写。

实现声控流水灯大致可以分为以下几个步骤:

  1. 初始化设置

首先,需要对声音传感器进行初始化,包括 GPIO 引脚的设置和一些模拟配置参数的调整。例如,使用 Raspberry Pi 上的 python RPi.GPIO 库进行初始化:

import RPi.GPIO as GPIO

# 设置 GPIO 引脚编号
SENSOR_PIN = 18
LED_PINS = [23, 24, 25]

# 初始化 GPIO 引脚
GPIO.setmode(GPIO.BCM)
GPIO.setup(SENSOR_PIN, GPIO.IN)
for pin in LED_PINS:
    GPIO.setup(pin, GPIO.OUT)
  1. 获取传感器的输出

在进入循环之前,需要一直监听传感器的输出:如果检测到声音信号,则控制 LED 灯闪烁。

while True:
    if GPIO.input(SENSOR_PIN):
        # 声音检测成功,执行 LED 灯的闪烁操作
        pass
    else:
        # 没有声音或声音信号太弱,不采取任何动作
        pass

这里可以利用以上已经完成的流水灯代码,加入 2 种闪烁方式来让 LEDs 以特定模式闪烁。

  1. 实现声控逻辑

当监测到声音信号时,会触发闪烁操作。具体实现可以根据不同的需求进行不同的优化,例如:

  • 关键字声音检测:定义一个关键字列表(如 "on" 或者 "off"),当声音含有这些关键字的特定频率或强度时,则将LED开/关。实现方式可以采用语言模型、基于频率的信号处理等技术。

  • 基于声音峰值的闪烁:检测传感器感受到的最高音量,将其转换为均匀加速递减的 LED 闪烁次数,从而产生一种 "随声光" 的效果。可以调节闪烁的次数和延迟时间等参数。

    def light_blink_by_voice():
        ratio = 0.3 # 调整音量与灯光闪烁次数之间的比例系数
        duration_sec = 0.1 # 调整每次闪烁所占用的时间
        sample_rate = 44100 # 声音采样率,默认使用 44.1kHz
        scale = 10 # 调整每个灯泡独立闪烁的时间比例
    
        # 计算需要闪烁的次数(等于音量 * 系数)
        max_amplitude = get_max_amplitude()
        num_of_blinks = int(max_amplitude * ratio)
    
        if num_of_blinks > 0:
            # 计算每次闪烁需要占用的时间
            delay_sec = duration_sec / (num_of_blinks + 1) 
    
            # 计算每个灯泡独立闪烁的时间比例
            states = []
            for i in range(len(LED_PINS)):
                n = int((i + 1) * scale)
                s = [True] * n + [False] * (num_of_blinks - n)
                states.append(s)
    
            # 执行闪烁操作
            for i in range(num_of_blinks):
                for j, pin in enumerate(LED_PINS):
                    state = states[j][i]
                    GPIO.output(pin, state)
                time.sleep(delay_sec)
    

上述代码展示了一种利用最大振幅控制闪烁模式的实现。使用该函数来替代流水灯中的固定频率和时长即可。