任务要求:结合任务123,在手机上通过网络控制板载Neopixel LED的显示和颜色切换,屏幕同步显示状态
原本想要试试看直接用wifi或者蓝牙连接板子来实现控制,但本人一个软件工程的大三生之前实在是没碰过硬件和物联网,折腾了半天没能实现,只好用互联网的思想曲线救国了。有大佬愿意指导的话,小弟虚心求教。
实现步骤:
这部分和硬件关系不大就不详细介绍了,主要就是用SpringBoot写个简单的Redis服务然后前端调用就行,每个板子的LED可以对应一个token,这样也可以实现分别控制不同的板子
使用上面写好的控制平台直接将LED的状态同步过来就可以了。
配置信息
将需要用到的配置信息存放在secrets.py中。
# This file is where you keep secret settings, passwords, and tokens!
# If you put them in the code you risk committing that info or sharing it
secrets = {
'ssid' : 'xxxx',
'password' : 'xxxxxxxx',
'timezone' : "Asia/Shanghai",
'led_url' : "http://xxxxxxxxxxxxxxxxxxxxxxxxxx"
}
连接wifi
# 连接wifi
while not wifi.radio.ipv4_address:
try:
wifi.radio.connect(secrets["ssid"], secrets["password"])
except ConnectionError as e:
print("Connection Error:", e)
print("Retrying in 3 seconds")
time.sleep(3)
gc.collect()
print("Connected!\n")
同步LED状态
通过写好的接口获取LED状态并同步,获取到的状态信息有status表示LED的开关状态,r、g、b分别代表RGB的色值。
# 请求URLs
RGB_URL = secrets['led_url']
pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())
current_rgb = [0,0,0]
# 获取数据
def get_data():
try:
response = requests.get(RGB_URL)
except ConnectionError as e:
print("Connection Error:", e)
print("Retrying in 60 seconds")
global current_rgb
if(response.json()['status']):
current_rgb[0] = response.json()['r']
current_rgb[1] = response.json()['g']
current_rgb[2] = response.json()['b']
else:
current_rgb = [0, 0, 0]
print(current_rgb)
return current_rgb
屏幕显示数据
将获取到的LED状态同步显示在屏幕上。
display = board.DISPLAY
board.DISPLAY.brightness = 0.5
# 刷新屏幕
def refresh_screen():
print_text = "RGB("+str(current_rgb[0])+" ,"+str(current_rgb[1])+" ,"+str(current_rgb[2])+")"
text_area = label.Label(font, text=print_text, scale=2)
text_area.x = 10
text_area.y = 10
board.DISPLAY.show(text_area)
每秒刷新一次状态
pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
pixel.brightness = 0.5
while True:
get_data()
pixel.fill(current_rgb)
refresh_screen()
time.sleep(1)
pass
演示视频
总结
后面还是会继续学习,看看能不能不走服务器直接通过wifi连接板子来进行控制,也希望各位大佬不吝赐教。
如果大家感兴趣的话控制平台我也可以再改改开放出来。
本帖最后由 MoJing 于 2023-8-17 14:37 编辑
主要就是用SpringBoot写个简单的Redis服务然后前端调用就行,每个板子的LED可以对应一个token,这样也可以实现分别控制不同的板子
用spring,感觉高大上呀