本帖最后由 方老师好 于 2022-9-2 17:33 编辑
【行空板】自制炫酷灯光控制系统
我们在KTV进行K歌的时候都有炫酷的灯光,让我们更加沉浸的制造美妙的音乐。这些灯光时而激烈,时而温婉,使我们投入其中。
我们在家里能不能按照自己的意愿设置炫酷的灯光呢?
行空板是一个非常强大的工具,我们可以通过其结合其他传感器实现日常生活中很多的创意作品,让我们一起来看一下吧。
我们通过一个行空板,LED灯带,来实现一个炫酷灯光控制系统。
演示视频
任务目标
使用行空板控制灯光,根据自己的需要选择相应的模式
知识点
1、认识LED灯带
2、学习使用Pinpong库控制LED灯带
3、了解行空板GUI显示方法
4、学习使用行空板GUI制作界面
5、学习使用pingpong库初始化引脚
6、学习使用行空板自带按钮
7、学习使用多线程控制函数结束或者切换函数
材料清单
硬件清单:行空板X1,LED灯带X1
软件清单:mind+编程软件X1
知识储备
1、什么是LED灯带?
LED灯带是由很多个小灯组成,每一个小灯可以里面有RGB三原色灯光,可以通过编程组合成各种颜色。也可以独立控制每一个灯的点亮时间。
2、如何使用行空板的按钮模块?
- gui=GUI() #实例化GUI类
- gui.add_button(x=120, y=110, w=100, h=60, text="气氛模式", origin='center', onclick=函数名())
复制代码
首先实例化GUI类,再利用GUI的自带函数生成按钮,再将回调函数放在“onclick=”之后写上回调函数的名称
3、如何设定每个灯的颜色、时间等?
- from pinpong.board import NeoPixel #导入灯带控制模块
复制代码
np1[0] = (255,255,255) #灯带的第[0]个等的颜色RGB值为(255,255,255)
#利用循环语句控制多个灯的颜色
for I in range(0, 8):
np1[I] =(0,255,255)
time.sleep(0.5)
4、如何切换或结束?
因为本次需要用到行空板的按钮模块,在翻阅行空板文档的时候我发现以下问题:
行空板的回调函数不能使用循环语句,所以在使用按钮切换模式时遇到了不能切换的问题,那我们应该怎么解决呢?这里我用到了多线程来处理配合全局变量来处理。
- #全局变量,控制
- boss=0
-
- # 事件回调函数
- def QiFenMoShi():
- global boss #引入全局变量
- boss=1 #设置为1
- thread1=gui.start_thread(u_thread1_function) #启动线程1
-
-
-
- #当线程1启动时
- def u_thread1_function():
- np1 = NeoPixel(pin1,8)
- while True:
- if boss==1:
- for I in range(0, 8):
- np1[I] = random.choice(light_mode1)
- else:
- break
- gui.stop_thread(thread1)
- time.sleep(0.5)
复制代码
以上代码通过运用全局变量与多线程结合可以实现按下按钮之后进行回调函数的切换。如果大家有更好的方法,可以在评论区进行讨论。
完整代码
-
- import time
- from unihiker import GUI #导入包
- import paho.mqtt.client as mqtt
- import random
- from pinpong.board import NeoPixel
- from pinpong.board import Board
- #https://github.com/eclipse/paho.mqtt.python
- #https://pypi.org/project/paho-mqtt/
- from pinpong.board import Pin
-
- Board().begin()
- pin1 = Pin(Pin.P12)
-
- #灯光模式列表
- light_mode1=[(255,0,0),(255,255,255),(0,0,255),(238,114,240),(0,250,0)]#红白蓝紫绿
- light_mode2=[(0,0,255),(255,255,255),(236,184,247)]#蓝白粉
-
-
- #全局变量,控制
- boss=0
-
- def QiFenMoShi():
- global boss
- boss=1
-
- thread1=gui.start_thread(u_thread1_function)
-
-
-
-
- # 事件回调函数
- def u_thread1_function():
- np1 = NeoPixel(pin1,8)
- while True:
- if boss==1:
- for I in range(0, 8):
- np1[I] = random.choice(light_mode1)
- else:
- break
- gui.stop_thread(thread1)
- time.sleep(0.5)
-
-
-
- def ShanShuoMoShi():
- global boss
- boss=2
-
- thread2=gui.start_thread(u_thread2_function)
-
-
-
-
- # 事件回调函数
- def u_thread2_function():
- np1 = NeoPixel(pin1,8)
- while True:
- if boss==2:
- cur_light=random.choice(light_mode1)
- for I in range(0, 8):
- np1[I] = cur_light
- else:
- break
- gui.stop_thread(thread2)
- time.sleep(0.5)
-
- def WenYiMoShi():
- global boss
- boss=3
- thread3=gui.start_thread(u_thread3_function)
-
-
-
-
- # 事件回调函数
- def u_thread3_function():
- np1 = NeoPixel(pin1,8)
- while True:
- if boss==3:
- for I in range(0, 8):
- np1[I] = random.choice(light_mode2)
- else:
- break
- gui.stop_thread(thread2)
- time.sleep(0.5)
-
- def NormalMoShi():
- global boss
- boss=4
-
- thread4=gui.start_thread(u_thread4_function)
-
-
-
-
- # 事件回调函数
- def u_thread4_function():
- np1 = NeoPixel(pin1,8)
- while True:
- if boss==4:
- for I in range(0, 8):
- np1[I] = (255,255,255)
- else:
- break
- gui.stop_thread(thread2)
- time.sleep(0.5)
-
- #制作行空板控制端界面
- gui=GUI() #实例化GUI类
- gui.draw_digit(x=120, y=60, text='灯光控制系统', origin = "center",color="red",font_size=15)
- gui.add_button(x=10, y=110, w=100, h=60, text="气氛模式", origin='left', onclick=lambda: QiFenMoShi())
- gui.add_button(x=10, y=170, w=100, h=60, text="闪烁模式", origin='left', onclick=lambda: ShanShuoMoShi())
- gui.add_button(x=120, y=110,w=100, h=60, text="文艺模式", origin='left', onclick=lambda: WenYiMoShi())
- gui.add_button(x=120, y=170,w=100, h=60, text="正常模式", origin='left', onclick=lambda: NormalMoShi())
- #设置主程序
-
- while True:
- #增加等待,防止程序退出和卡住
- time.sleep(1)
复制代码
|
-
|