当前位置: 首页 > 科技观察

我如何使用CircuitPython和开源工具监控温室

时间:2023-03-23 01:48:57 科技观察

使用微控制器、传感器、Python和MQTT持续跟踪温室中的温度、湿度和环境光。CircuitPython提供了一种与微控制器板交互的革命性方式。本文介绍如何使用CircuitPython监测温室的温度、湿度和环境光,并使用CircuitPythonMQTT客户端将结果发布到MQTT中间代理。您可以订阅MQTT队列并在多个程序中进一步处理信息。本项目使用简单的Python程序运行web服务器,以Prometheus格式发布采集端点,并将监控指标拉取到Prometheus进行持续监控。关于CircuitPythonCircuitPython是由Adafruit创建的开源Python发行版,可在低成本微控制器开发板上运行。CircuitPython为与兼容的开发板交互提供了一种简单的开发体验。您可以在连接开发板以启动程序时安装的CIRCUITPYTHON根驱动器上创建一个code.py文件。CircuitPython还提供与开发板的串行连接,包括交互式解释器(REPL)会话,因此您可以使用Python代码与开发板进行实时交互。Adafruit的网站提供了大量文档来帮助您开始使用CircuitPython。首先,参考下面的《欢迎来到 CircuitPython》指南。本指南将帮助您开始使用CircuitPython在板上运行代码并与REPL交互。它还记录了如何安装Adafruit的CircuitPython库和示例集合,这些库和示例可用于其销售的许多电路板和传感器。接下来,阅读《CircuitPython 基础》指南以了解有关其功能的更多信息,以及有关在特定和兼容板上使用CircuitPython的信息的链接。最后,与所有开源软件一样,您可以深入研究CircuitPython的源代码、发布问题并做出贡献。微控制器设置微控制器系统非常简单。要完成此示例项目,您需要:RaspberryPi4:您需要一台计算机来对微控制器系统进行编程,我使用的是RaspberryPi4。CircuitPython兼容微控制器:我使用了AdafruitFeatherS2,内置WiFi、环境光传感器、Qwiic电缆输入。微控制器WiFi:FeatherS2具有内置WiFi。如果您的微控制器没有,您需要为您的电路板找一个WiFi屏蔽。传感器:FeatherS2内置了环境光传感器,所以我还需要一个温度和湿度传感器。有许多不同的制造商可供选择,包括Adafruit、SparkFun和亚马逊。我正在使用带有FeatherS2输入兼容Qwiic电缆的Adafruit传感器。虽然大多数SparkFun传感器都可以与Adafruit库一起使用,但如果您不是从Adafruit购买传感器,则可能需要自己为它找到一个与CircuitPython兼容的Python库。跳线和电缆:为避免试验板或焊接,我使用AdafruitQwiic电缆。它也可在SparkFun销售的包含不同长度的电缆套件中使用。在将微控制器连接到您的计算机之前,将传感器连接到微控制器。将传感器连接到微控制器现在您可以使用USB电缆将微控制器连接到您的计算机。MQTTBroker您可以使用此说明在RaspberryPi系统上安装MosquittoMQTT代理和Mosquitto客户端。如果您想将RaspberryPi用作长期服务器,请在您的网络上为RaspberryPi4提供一个静态IP地址。Mosquitto中介运行后,创建一个用户名/密码文件,并设置客户端向中介发布和订阅的认证信息。您可以在RaspberryPi上使用Mosquitto客户端测试MQTT代理。打开两个终端(如果没有界面运行则打开两个SSH会话):在终端一中输入:mosquitto_sub-hlocalhost-u$user-P$pass-t"mqtt/test"这个命令会启动一个持久化的运行进程监听发布到mqtt/test队列的消息。在终端二中输入:mosquitto_pub-hlocalhost-u$user-P$pass-t"mqtt/test"-mhello`此命令将向mqtt/test队列发布一条消息,该消息应显示在终端的输出中一个在里面。现在您可以中止在终端一中运行的子命令。Mosquitto中介允许客户端将消息发布到任何队列,甚至是没有任何订阅的队列。这些消息永久丢失,但这并不妨碍客户端继续发布消息。打开第三个终端,订阅以下队列(你的控制器会向这些队列发布消息):greenhouse/temperaturegreenhouse/lightgreenhouse/humidity系统被上传到在RaspberryPi4上运行的MQTT代理。Adafruit拥有出色的文档,可以引导您使用CircuitPython库集合将您的微控制器连接到WiFi路由器,并将指标发布到MQTT代理。将以下库安装到CIRCUITPYTHON/lib目录中,它们将被温室监控使用。Adafruit的CircuitPython库集合中提供了这些库:adafruit_bus_device:包含多个.mpy文件的Python包文件夹(.mpy是压缩的Python文件以节省空间)adafruit_requests:单个.mpy文件adafruit_register:包文件夹adafruit_minimqtt:包文件夹adafruit_si7021:单个.mpy文件,用于支持温湿度传感器库安装库后,在CIRCUITPYTHON文件夹下的code.py文件中写入如下代码:DigitalInOut,Direction,PullfromanalogioimportAnalogInimportadafruit_si7021#添加一个secrets.py到你的文件系统中,它有一个名为secrets的字典,带有“ssid”和#“withpassword”DO凭据你的WiFikeys文件或将其提交到Git或其他#源代码控制。#pylint:disable=no-name-in-module,wrong-import-ordertry:fromsecretsimportsecretsexceptImportError:print("WiFi机密保存在secrets.py中,请将它们添加到那里!")raiseprint("正在连接到%s&qu哦;%secrets["ssid"])wifi.radio.connect(secrets["ssid"],secrets["password"])print("Connectedto%s!"%secrets["ssid"])###Feeds###light_feed="greenhouse/light"temp_feed="greenhouse/temperature"humidity_feed="greenhouse/humidity"#定义事件发生时调用的回调方法#pylint:disable=unused-argument,redefined-outer-namedefconnected(client,userdata,flags,rc):#当客户端成功连接到代理时将调用此函数。print("ConnectedtoMQTT!")defdisconnected(client,userdata,rc):#当客户端断开连接时调用此方法print("DisconnectedfromMQTT!")defget_voltage(pin):return(pin.value*3.3)/65536#创建socketpoolpool=socketpool.SocketPool(wifi.radio)#设置MiniMQTTClientmqtt_client=MQTT.MQTT(broker=secrets["broker"],port=secrets["port"],username=secrets["aio_username"],password=secrets["aio_key"],socket_pool=pool,ssl_context=ssl.create_default_context(),)#设置上面的回调方法mqtt_client.on_connect=connectedmqtt_client.on_disconnect=disconnected#将客户端连接到MQTTbroker.print("ConnectingtoMQTT...")mqtt_client.connect()#使用我们的总线I2Cportsensor=adafruit_si7021.SI7021(board.I2C())light_pin=AnalogIn(board.IO4)whileTrue:#轮询消息队列mqtt_client.loop()#获取当前温度light_val=get_voltage(light_pin)temp_val=((sensor.temperature*9)/5)+32humidity_val=sensor.relative_humidity#发送新消息mqtt_client.publish(light_feed,light_val)mqtt_client.publish(temp_feed,temp_val)mqtt_client.publish(humidity_feed,humidity_val)time.sleep(0.5)保存你的代码然后连接到串行监视器并观察程序连接到您的MQTT代理。您还可以将RaspberryPi4上的终端切换到订阅其发布队列的终端以查看输出。处理监控指标像MQTT这样的发布/订阅工作流为微控制器系统提供了许多好处。您可以让多个微控制器+传感器报告同一系统的不同指标或并行报告同一指标的多个读数。您还可以让多个不同的进程订阅每个队列并并行响应这些消息。甚至可以有多个进程订阅同一个队列并对消息采取不同的操作,例如在值过高时发送通知电子邮件或将消息发送到另一个MQTT队列。另一种选择是让微控制器订阅一个外部队列,该队列可以向微控制器发出信号以采取行动,例如关闭或开始新会话。最后,发布/订阅工作流更适合低功耗微控制器系统(例如那些靠电池或太阳能运行的系统),因为这些设备可以在较长的延迟时间后批量发布监控指标,并在报告之间关闭电池密集型WiFi广播。为了处理这些指标,我创建了一个Python客户端,它使用PahoPythonMQTT客户端订阅指标队列。我还使用官方PrometheusPython客户端创建了一个Web服务器,它生成了一个Prometheus兼容的收集端点,使用这些指标作为仪表板。我在同一个RaspberryPi4上同时运行Prometheus服务器和MosquittoMQTT代理。从prometheus_clientimportstart_http_server,Gaugeimportrandomimporttimeimportpaho.mqtt.clientasmqttgauge={"greenhouse/light":Gauge('light','lightinlumens'),"greenhouse/temperature":Gauge('temperature','temperatureinfahrenheit'),"greenhouse/humidity":Gauge('humidity','relative%humidity')}try:frommqtt_secretsimportmqtt_secretsexceptImportError:print("WiFi秘密保存在secrets.py中,请将它们添加到那里!")raiseefon_connect(client,userdata,flags,rc):print("Connectedwithresultcode"+str(rc))#在on_connect()中订阅意味着如果我们失去连接并重新连接,那么订阅将被更新。client.subscribe("greenhouse/light")client.subscribe('greenhouse/temperature')client.subscribe('greenhouse/humidity')defon_message(client,userdata,msg):topic=msg.topic有效负载=msg.payload测量[至pic].set(payload)client=mqtt.Client()client.username_pw_set(mqtt_secrets["mqtt_user"],mqtt_secrets['mqtt_password'])client.on_connect=on_connectclient.on_message=on_messageclient.connect('localhost',1883,60)if__name__=='__main__':#启动服务器以公开指标。client=mqtt.Client()client.username_pw_set('london','abc123')client.on_connect=on_connectclient.on_message=on_message客户端.connect('localhost',1883,60)start_http_server(8000)client.loop_forever()然后我配置Prometheus服务器以将端点数据收集到localhost:8000。您可以在Github上访问温室MQTT微控制器项目的代码。该项目使用MIT许可下的许可。