本帖最后由 麦壳maikemaker 于 2024-4-9 21:28 编辑
幸运的获得了试用名额,正好最近在上micropython+APP inventor的课程,所以做一个APP通过MQTT远程控制彩灯的小实验。
硬件:FireBeetle 2 ESP32 C6,WS2812灯环
程序语言:micropython
APP开发环境:APP inventor2
电路图:
C6代码:
- '''
- 实验名称:自建APP控制RGB灯
- 20240409
- '''
- import network,time
- from umqtt.simple import MQTTClient #导入MQTT板块
- from machine import Pin,Timer
- import neopixel #导入ws2812彩灯库
- import urandom #导入随机数库
-
-
- RGBIO = Pin(5) # 彩灯控制引脚
- LED_NUM = 12 # 彩灯的数量
-
- LED = neopixel.NeoPixel(pin=RGBIO, n=LED_NUM, timing=1) # 创建控制对象
-
- LED.fill((0, 0, 0)) # GRB填充数据(RGB顺序, 0为不亮,255为全亮)
- LED.write() # 写入数据(生效)
-
-
- #WIFI连接函数
- def WIFI_Connect():
-
- WIFI_LED=Pin(15, Pin.OUT) #初始化WIFI指示灯
-
- wlan = network.WLAN(network.STA_IF) #STA模式
- wlan.active(True) #激活接口
- start_time=time.time() #记录时间做超时判断
-
- if not wlan.isconnected():
- print('connecting to network...')
- wlan.connect('waoo2111280', 'waoo2111280') #输入WIFI账号密码
-
- while not wlan.isconnected():
-
- #LED闪烁提示
- WIFI_LED.value(1)
- time.sleep_ms(300)
- WIFI_LED.value(0)
- time.sleep_ms(300)
-
- #超时判断,15秒没连接成功判定为超时
- if time.time()-start_time > 15 :
- print('WIFI Connected Timeout!')
- break
-
- if wlan.isconnected():
- #LED点亮
- WIFI_LED.value(1)
- #串口打印信息
- print('network information:', wlan.ifconfig())
- LED.fill((0, 255, 0)) #联网成功显示绿色
- LED.write()
- return True
-
- else:
- LED.fill((255, 0, 0))#联网失败显示红色
- LED.write()
- return False
- #控制全部灯珠
- def allled(msg):
- #{200,200,200}数据结构RGB
- print(msg[3 : (len(msg) - 2)])
- RGB = msg[3 : (len(msg) - 2)].split(',')
- LED.fill((int(RGB[0]), int(RGB[1]), int(RGB[2])))
- LED.write()
- #控制单个灯珠
- def oneled(msg):
- #{200,200,200,11}数据结构RGB,灯珠位置
- print(msg[3 : (len(msg) - 2)])
- RGB = msg[3 : (len(msg) - 2)].split(',')
- LED[int(RGB[3])]=((int(RGB[0]), int(RGB[1]), int(RGB[2])))
- LED.write()
-
- #设置MQTT回调函数,有信息时候执行
- def MQTT_callback(topic, msg):
- print('topic: {}'.format(topic))
- print('msg:{}'.format(msg))
- #根据TOPIC调用相应函数,并传入msg
- if "b'dfrobot/fire/beetle/all'"== '{}'.format(topic):
- allled('{}'.format(msg))
- elif "b'dfrobot/fire/beetle/one'"== '{}'.format(topic):
- oneled('{}'.format(msg))
-
- #接收数据任务
- #300MS检查一次消息
- def MQTT_Rev(tim):
- client.check_msg()
-
-
- #执行WIFI连接函数并判断是否已经连接成功
- if WIFI_Connect():
-
- SERVER = 'broker.emqx.io'#MQTT服务器
- PORT = 1883 #端口
- CLIENT_ID = '8b7562984asdfg' # 客户端ID
- #全部灯
- TOPIC = 'dfrobot/fire/beetle/all' # TOPIC名称
- #单个灯
- TOPIC1 = 'dfrobot/fire/beetle/one' # TOPIC名称
-
- client = MQTTClient(CLIENT_ID, SERVER, PORT) #建立客户端对象
- client.set_callback(MQTT_callback) #配置回调函数
- client.connect()#连接服务器
- print('connect')
- client.subscribe(TOPIC) #订阅主题
- client.subscribe(TOPIC1) #订阅主题
- print('subscribe')
- #开启RTOS定时器,编号为-1,周期300ms,执行socket通信接收任务
- #C6定时器编号0
- tim = Timer(0) #创建定时器
- tim.init(period=300, mode=Timer.PERIODIC,callback=MQTT_Rev)
-
复制代码
APP界面设计:
APP程序设计:
效果:
附:
FireBeetle 2 ESP32 C6: https://www.dfrobot.com.cn/goods-3825.html
彩灯: https://www.dfrobot.com.cn/goods-3472.html
固件:https://mc.dfrobot.com.cn/thread-318231-1-1.html
APPinventor2:http://ai2.17coding.net/?locale=zh_CN
|