[作品提交] 【得捷电子Follow me第2期】 任务5:通过网络控制WS2812B

MoJing   2023-8-17 14:37 楼主

【得捷电子Follow me第2期】 任务5:通过网络控制WS2812B


任务要求:结合任务123,在手机上通过网络控制板载Neopixel LED的显示和颜色切换,屏幕同步显示状态

 

实现方案


原本想要试试看直接用wifi或者蓝牙连接板子来实现控制,但本人一个软件工程的大三生之前实在是没碰过硬件和物联网,折腾了半天没能实现,只好用互联网的思想曲线救国了。有大佬愿意指导的话,小弟虚心求教
实现步骤

  1. 将LED状态保存在服务器Redis中
  2. 控制端发起修改请求,服务器中保存的LED状态被修改
  3. 板子从服务器同步LED状态

 

控制平台设计


这部分和硬件关系不大就不详细介绍了,主要就是用SpringBoot写个简单的Redis服务然后前端调用就行,每个板子的LED可以对应一个token,这样也可以实现分别控制不同的板子

a044bcad9.png   f1d9f75cef13.png  

 

远程控制WS2812B


使用上面写好的控制平台直接将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的开关状态,rgb分别代表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
演示gif 点击上图查看Gif动图
 
 

演示视频


 

615c4b67aaded48db3b05a44abc7809a

 

总结


后面还是会继续学习,看看能不能不走服务器直接通过wifi连接板子来进行控制,也希望各位大佬不吝赐教。

如果大家感兴趣的话控制平台我也可以再改改开放出来。

 

 

 

本帖最后由 MoJing 于 2023-8-17 14:37 编辑

回复评论 (2)

厉害了,大神
点赞  2023-8-17 14:42

主要就是用SpringBoot写个简单的Redis服务然后前端调用就行,每个板子的LED可以对应一个token,这样也可以实现分别控制不同的板子

用spring,感觉高大上呀

点赞  2023-8-20 21:38
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复