简介
在前几篇文章中我们已经成功的使用了开发板读取到AHT20传感器的数据,并且通过Scikit-learn来训练了一个模型对环境的舒适度进行分类。 那么在本篇文章中,我们将把上述的程序通过接入到MQTT中,并且勇于后续的处理。由于这个开发板可以运行完整的Python环境,因此接入MQTT也是一个非常方便的事情。
首先确认MQTT服务已经正常启动。并且使用MQTTX进行连接性测试。
在确认无误后,在开发板的虚拟环境中安装MQTT的连接包。
pip install paho-mqtt
修改程序原本的代码并且连接到MQTT服务器。
from smbus2 import SMBus import time import pandas as pd import joblib import paho.mqtt.client as mqtt # I2C 配置 I2C_BUS = 2 AHT20_ADDR = 0x38 bus = SMBus(I2C_BUS) # 初始化 AHT20 bus.write_i2c_block_data(AHT20_ADDR, 0xBE, [0x08, 0x00]) time.sleep(0.01) # 加载模型 loaded_model = joblib.load("comfort_model.pkl") # MQTT 配置 MQTT_BROKER = "192.168.1.153" MQTT_PORT = 1884 MQTT_USER = "root" MQTT_PASS = "123456" MQTT_TOPIC = "sensors/comfort" client = mqtt.Client() client.username_pw_set(MQTT_USER, MQTT_PASS) client.connect(MQTT_BROKER, MQTT_PORT, 60) client.loop_start() # 开启后台线程,保持心跳 while True: # 触发一次测量 bus.write_i2c_block_data(AHT20_ADDR, 0xAC, [0x33, 0x00]) time.sleep(0.08) # 读取 6 个字节的数据 data = bus.read_i2c_block_data(AHT20_ADDR, 0x00, 6) # 转换湿度和温度 humidity_raw = ((data[1] << 16) | (data[2] << 8) | data[3]) >> 4 temperature_raw = ((data[3] & 0x0F) << 16) | (data[4] << 8) | data[5] humidity = humidity_raw / (1 << 20) * 100 temperature = temperature_raw / (1 << 20) * 200 - 50 # 构造模型输入 x_predict = pd.DataFrame([[temperature, humidity]], columns=["temperature", "humidity"]) # 模型预测 y_pred = loaded_model.predict(x_predict) # 打印 print(f"Humidity: {humidity:.2f}%") print(f"Temperature: {temperature:.2f}°C") print(f"Predicted Comfort Level: {y_pred[0]}\n") # 发送 MQTT 消息 payload = { "temperature": round(temperature, 2), "humidity": round(humidity, 2), "comfort": str(y_pred[0]) } client.publish(MQTT_TOPIC, str(payload)) time.sleep(1)
观察程序输出
程序输出无误,接下来便可以在MQTTX中对对应的数据进行查看。
数据正确无误。
后续
原本是打算将这个MQTT的数据整合进HA的,后来发现这样实际做的意义不是很大。因为这快开发板不带无线功能,且每次联网的话都是需要在MAC上配置网卡的中转。或者在开发板中进行设置,并且必须要连接一根数据线到可以联网的电脑上才行。所以对于HA的应用场景目前我真的感觉不是很多,且大材小用。它似乎更适合被用于作为一个核心板通过下面的排母嵌入到某一个需要高性能处理的项目中。比较适合于离线场景的应用。就目前的开发体验上来看,运行ML的小型模型没有一点点问题。在不考虑供电和发热的情况下。像类似桌面相册,或者驱动屏幕一类的比较适合它。