ESP32(MicroPython) RGB点阵流水灯+滚动显示+同心矩形

ESP32 WS2812流水灯+滚动显示+同心矩形

 本程序实现了WS2812流水灯+滚动显示+同心矩形显示功能,延时和亮度可调。由于点阵的灯数不是3的倍数,在颜色选择上使用了类似于拜耳阵列排列,绿色像素数是红、蓝像素数之和。

在变量设定上,由于有渐变流水灯模式,本程序设定了较小的亮度用于确认渐变中每一级的亮度,又设定了另一个变量存储其它模式下的亮度以便使用。流水灯按灯的序号移动,分为渐变和非渐变两种模式。滚动显示在每次开始前要把起始的编号调到8的倍数以确保从一列的开头位置开始,每次起始位置序号加8以实现滚动。同心矩形显示先设定灯的颜色来绘制较大的矩形,在绘制较小的矩形覆盖大的矩形的中间部分,并对记录起始位置的变量取余以循环显示4种图案;绘制较小的矩形时每次到达一列中绘制位置的末端时把灯的编号加上相应数值以到达在下一列绘制的起始位置。

代码如下

#导入Pin模块
from machine import Pin
import time
from machine import PWM
from neopixel import NeoPixel
 
# 五向导航按键,COM引脚接GND
key1=Pin(12,Pin.IN,Pin.PULL_UP)
key2=Pin(14,Pin.IN,Pin.PULL_UP)
key3=Pin(26,Pin.IN,Pin.PULL_UP)
key4=Pin(25,Pin.IN,Pin.PULL_UP)
key5=Pin(33,Pin.IN,Pin.PULL_UP)
key6=Pin(32,Pin.IN,Pin.PULL_UP)
 
pin=13
rgb_num=64
rgb_led=NeoPixel(Pin(pin,Pin.OUT),rgb_num)

key_en=1
#按键扫描函数
def key_scan():
    global key_en
    if key_en==1 and (key1.value()==0 or key2.value()==0 or key3.value()==0 or key4.value()==0 or
                      key5.value()==0 or key6.value()==0  ):
        time.sleep_ms(10)
        key_en=0
        if key1.value()==0:
            return 1
        elif key2.value()==0:
            return 2
        elif key3.value()==0:
            return 3
        elif key4.value()==0:
            return 4
        elif key5.value()==0:
            return 5
        elif key6.value()==0:
            return 6
    elif (key1.value()==1 and key2.value()==1 and key3.value()==1 and key4.value()==1 and
          key5.value()==1 and key6.value()==1  ) :
        key_en=1
    return 0

brightness=2
delay=40
mode=1
sleep=0
def key_get(): #获取键值并改变变量的值
    global brightness
    global delay
    global mode
    key=key_scan()
    if key==1 and brightness<7 :
        brightness+=1
    elif key==2 and brightness>1 :
        brightness-=1
    elif key==3 and delay<90 :
        delay+=10
    elif key==4 and delay>10 :
        delay-=10
    elif key==5 and mode<4 :
        mode+=1
    elif key==6 and mode>0 :
        mode-=1     

count=0
#程序入口
while True:
    key_get()
    full_brightness=brightness*8
    if count>=63 :
        count=0
    if mode==0 : #关灯
        for i in range(rgb_num):
            rgb_led[i]=(0, 0, 0)
            rgb_led.write()
    if mode==1 : #流水灯
        temp=0
        i=count
        count+=1
        repeat=0
        while repeat<2 : #重复
            repeat+=1
            temp=0
            while temp<8 :
                if i>63 :
                    i-=63
                rgb_led[i]=(0, full_brightness, 0)
                i+=1
                temp+=1
            temp=0    
            while temp<8 :
                if i>63 :
                    i-=63
                rgb_led[i]=(full_brightness, 0, 0)
                i+=1
                temp+=1
            temp=0    
            while temp<8 :
                if i>63 :
                    i-=63
                rgb_led[i]=(0, full_brightness, 0)
                i+=1
                temp+=1
            temp=0    
            while temp<8 :
                if i>63 :
                    i-=63
                rgb_led[i]=(0, 0, full_brightness)
                i+=1
                temp+=1    
        rgb_led.write()    
        time.sleep_ms(delay)
    if mode==2 : #渐变流水灯
        temp=0
        i=count
        count+=1
        repeat=0
        while repeat<2 : #重复
            repeat+=1
            temp=0
            g=8*brightness
            r=0
            while temp<8 :
                if i>63 :
                    i-=63
                rgb_led[i]=(r, g, 0)
                g-=brightness
                r+=brightness
                i+=1
                temp+=1
            temp=0
            r=8*brightness
            g=0
            while temp<8 :
                if i>63 :
                    i-=63
                rgb_led[i]=(r, g, 0)
                r-=brightness
                g+=brightness
                i+=1
                temp+=1
            temp=0
            g=8*brightness
            b=0
            while temp<8 :
                if i>63 :
                    i-=63
                rgb_led[i]=(0, g, b)
                g-=brightness
                b+=brightness
                i+=1
                temp+=1
            temp=0
            b=8*brightness
            g=0
            while temp<8 :
                if i>63 :
                    i-=63
                rgb_led[i]=(0, g, b)
                b-=brightness
                g+=brightness
                i+=1
                temp+=1    
        rgb_led.write()    
        time.sleep_ms(delay)
    if mode==3 : #滚动显示
        sleep+=1
        if sleep==5:
            sleep=0
            if count%8!=0 : #确保从一列的顶端开始显示
                count=0   
            temp=0
            i=count
            count+=8
            repeat=0
            while repeat<4 : #重复
                repeat+=1
                temp=0
                while temp<4 :
                    if i>63 :
                        i-=63   
                    rgb_led[i]=(0, full_brightness, 0)
                    i+=1
                    if i>63 :
                        i-=63
                    rgb_led[i]=(full_brightness, 0, 0)
                    i+=1
                    temp+=1
                temp=0    
                while temp<4 :
                    if i>63 :
                        i-=63
                    rgb_led[i]=(0, 0, full_brightness)
                    i+=1
                    if i>63 :
                        i-=63
                    rgb_led[i]=(0, full_brightness, 0)
                    i+=1
                    temp+=1   
            rgb_led.write()    
        time.sleep_ms(delay)
    if mode==4 : #同心矩形
        sleep+=1
        if sleep==5:
            sleep=0
            count+=1
            if count%4==0 :
                i=0
                while i<64:
                    rgb_led[i]=(0, full_brightness, 0)
                    i+=1
                i=9    
                while i<55:
                    rgb_led[i]=(full_brightness, 0, 0)
                    i+=1
                    if i%8==7:
                        i+=2
                i=18        
                while i<46:
                    rgb_led[i]=(0, full_brightness, 0)
                    i+=1
                    if i%8==6:
                        i+=4
                i=27        
                while i<37:
                    rgb_led[i]=(0, 0, full_brightness)
                    i+=1
                    if i%8==5:
                        i+=6
            if count%4==1 :
                i=0
                while i<64:
                    rgb_led[i]=(full_brightness, 0, 0)
                    i+=1
                i=9    
                while i<55:
                    rgb_led[i]=(0, full_brightness, 0)
                    i+=1
                    if i%8==7:
                        i+=2
                i=18        
                while i<46:
                    rgb_led[i]=(0, 0, full_brightness)
                    i+=1
                    if i%8==6:
                        i+=4
                i=27        
                while i<37:
                    rgb_led[i]=(0, full_brightness, 0)
                    i+=1
                    if i%8==5:
                        i+=6
            if count%4==2 :
                i=0
                while i<64:
                    rgb_led[i]=(0, full_brightness, 0)
                    i+=1
                i=9    
                while i<55:
                    rgb_led[i]=(0, 0, full_brightness)
                    i+=1
                    if i%8==7:
                        i+=2
                i=18        
                while i<46:
                    rgb_led[i]=(full_brightness, 0, 0)
                    i+=1
                    if i%8==6:
                        i+=4
                i=27        
                while i<37:
                    rgb_led[i]=(0, full_brightness, 0)
                    i+=1
                    if i%8==5:
                        i+=6
            if count%4==3 :
                i=0
                while i<64:
                    rgb_led[i]=(0, 0, full_brightness)
                    i+=1
                i=9    
                while i<55:
                    rgb_led[i]=(0, full_brightness, 0)
                    i+=1
                    if i%8==7:
                        i+=2
                i=18        
                while i<46:
                    rgb_led[i]=(full_brightness, 0, 0)
                    i+=1
                    if i%8==6:
                        i+=4
                i=27        
                while i<37:
                    rgb_led[i]=(0, full_brightness, 0)
                    i+=1
                    if i%8==5:
                        i+=6               
            rgb_led.write()    
        time.sleep_ms(delay)

MicroPython是一种Python3的实现,可以运行在微控制器上。ESP32是一种基于ESP32芯片的开源硬件平台,它支持WiFi和蓝牙连接,并提供了很多GPIO引脚来连接传感器和执行器。声音传感器是一种检测环境噪声的传感器,可以用来检测声音的强度和频率。WS2812B是一种数字RGB LED,可以通过单一的数据引脚来控制多个的颜色和亮度。 在MicroPython中,可以通过内置的库来控制ESP32的GPIO引脚、WiFi和蓝牙连接。同时,也可以使用第三方库来连接和控制声音传感器和WS2812B。例如,可以使用pyaudio库来获取声音传感器的数据,使用neopixel库来控制WS2812B的颜色和亮度。 以下是一个示例代码,演示如何使用ESP32连接声音传感器和WS2812B: ```python import machine import neopixel import pyaudio # 设置GPIO引脚 LED_PIN = 19 MIC_PIN = 32 # 初始化WS2812B num_leds = 8 np = neopixel.NeoPixel(machine.Pin(LED_PIN), num_leds) # 初始化声音传感器 chunk = 1024 sample_rate = 44100 p = pyaudio.PyAudio() stream = p.open(format=pyaudio.paInt16, channels=1, rate=sample_rate, input=True, input_device_index=MIC_PIN, frames_per_buffer=chunk) # 循环获取声音传感器数据并控制WS2812B while True: data = stream.read(chunk) rms = audioop.rms(data, 2) # 将声音强度映射到的亮度上 brightness = int(rms / 1000) # 将RGB颜色设置为亮度的值 color = (brightness, brightness, brightness) # 将颜色应用到所有的上 for i in range(num_leds): np[i] = color np.write() ``` 需要注意的是,以上代码仅为示例,实际使用时需要根据具体情况进行修改和优化。同时,也需要考虑到MicroPython在资源限制方面的限制,例如内存和处理器速度等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路易斯720

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值