偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

我如何用 CircuitPython 和開(kāi)源工具監(jiān)控溫室

開(kāi)發(fā) 后端 開(kāi)源
CircuitPython 提供了一種和微控制器板進(jìn)行交互的革命性方式。這篇文章介紹了如何使用 CircuitPython 來(lái)監(jiān)測(cè)溫室的溫度、濕度以及環(huán)境光,并且使用 CircuitPython MQTT 客戶(hù)端將結(jié)果發(fā)布到一個(gè) MQTT 中介。

[[406443]]

使用微控制器、傳感器、Python 以及 MQTT 持續(xù)追蹤溫室的溫度、濕度以及環(huán)境光。

CircuitPython 提供了一種和微控制器板進(jìn)行交互的革命性方式。這篇文章介紹了如何使用 CircuitPython 來(lái)監(jiān)測(cè)溫室的溫度、濕度以及環(huán)境光,并且使用 CircuitPython MQTT 客戶(hù)端將結(jié)果發(fā)布到一個(gè) MQTT 中介broker。你可以在若干個(gè)程序中訂閱 MQTT 隊(duì)列并進(jìn)一步處理信息。

這個(gè)項(xiàng)目使用一個(gè)簡(jiǎn)單的 Python 程序來(lái)運(yùn)行 Web 服務(wù)器,它發(fā)布一個(gè) Prometheus 格式的采集端點(diǎn),拉取監(jiān)控指標(biāo)到 Prometheus 進(jìn)行不間斷的監(jiān)控。

關(guān)于 CircuitPython

CircuitPython 是一個(gè)由 Adafruit 創(chuàng)建的開(kāi)源 Python 發(fā)行版,用于運(yùn)行在低成本微控制器開(kāi)發(fā)板上。CircuitPython 為與 兼容的開(kāi)發(fā)板 的交互提供了簡(jiǎn)單的開(kāi)發(fā)體驗(yàn)。你可以在連接你的開(kāi)發(fā)板時(shí)掛載的 CIRCUITPYTHON 根驅(qū)動(dòng)器上創(chuàng)建一個(gè) code.py 文件來(lái)啟動(dòng)你的程序。CircuitPython 還為開(kāi)發(fā)板提供了一個(gè)串行連接,包含一個(gè)交互式解釋器(REPL)會(huì)話(huà),你可以使用 Python 代碼實(shí)時(shí)和開(kāi)發(fā)板進(jìn)行交互。

Adafruit 的網(wǎng)站提供了大量的文檔,可以幫助你開(kāi)始使用 CircuitPython。首先,參考下《歡迎來(lái)到 CircuitPython》指南。這份指南能夠幫助你開(kāi)始使用 CircuitPython 在開(kāi)發(fā)板上運(yùn)行代碼以及和 REPL 交互。它還記錄了如何安裝 Adafruit 的 CircuitPython 庫(kù)合集和范例,可以用在它出售的許多開(kāi)發(fā)板和傳感器上。接下來(lái),閱讀《CircuitPython 基礎(chǔ)》指南來(lái)學(xué)習(xí)更多關(guān)于其功能的信息,里面還有鏈接指向在特定及兼容的開(kāi)發(fā)板上使用 CircuitPython 的相關(guān)信息。最后,就如所有開(kāi)源軟件一樣,你可以深入 CircuitPython 的源碼,發(fā)布議題,以及做出貢獻(xiàn)。

微控制器設(shè)置

微控制器系統(tǒng)非常簡(jiǎn)單。要完成這個(gè)示例項(xiàng)目,你會(huì)需要:

  • 樹(shù)莓派 4:你需要一臺(tái)電腦來(lái)給微控制器系統(tǒng)編程,我用的是樹(shù)莓派 4。
  • CircuitPython 兼容的微控制器:我用的是 Adafruit Feather S2,帶有內(nèi)置 WiFi,環(huán)境光傳感器,Qwiic 線纜輸入。
  • 微控制器 WiFi:Feather S2 內(nèi)置了 WiFi。如果你的微控制器沒(méi)有,你需要給開(kāi)發(fā)板找個(gè) WiFi 擴(kuò)展板。
  • 傳感器:Feather S2 有個(gè)內(nèi)置的環(huán)境光傳感器,所以我還需要一個(gè)溫濕度傳感器。有很多不同廠商的產(chǎn)品可以選擇,包括 Adafruit、SparkFun、亞馬遜。我用的是一個(gè) Adafruit 傳感器,帶有 Feather S2 輸入兼容的 Qwiic 線纜。盡管多數(shù) SparkFun 傳感器可以在 Adafruit 庫(kù)下工作,但如果你不是從 Adafruit 購(gòu)買(mǎi)的傳感器,你可能還是需要自己去找到它兼容 CircuitPython 的 Python 庫(kù)。
  • 跳線和線纜:為了避免使用面包板或焊接,我使用 Adafruit Qwiic 線纜。SparkFun 銷(xiāo)售的包含不同長(zhǎng)度的線纜套裝中也有它。

在將微控制器連接到你的電腦之前,將傳感器連接到微控制器上。

 

將傳感器連接到微控制器上

現(xiàn)在你可以將微控制器用 USB 數(shù)據(jù)線連接到你的電腦。

MQTT 中介

你可以使用 這份說(shuō)明 來(lái)在樹(shù)莓派的系統(tǒng)上安裝 Mosquitto MQTT 中介 和 Mosquitto 客戶(hù)端。如果你想把樹(shù)莓派做為長(zhǎng)期服務(wù)器使用,在你的網(wǎng)絡(luò)上給樹(shù)莓派 4 設(shè)置一個(gè)靜態(tài) IP 地址。Mosquitto 中介運(yùn)行起來(lái)之后,創(chuàng)建一份 用戶(hù)名/密碼文件,設(shè)置客戶(hù)端向中介發(fā)布和訂閱消息時(shí)用的認(rèn)證信息。

你可以用樹(shù)莓派上的 Mosquitto 客戶(hù)端來(lái)測(cè)試 MQTT 中介。打開(kāi)兩個(gè)終端(如果你是無(wú)界面運(yùn)行的話(huà)打開(kāi)兩個(gè) SSH 會(huì)話(huà)):

在終端一輸入:

  1. mosquitto_sub -h localhost -u $user -P $pass -t "mqtt/test"

這條命令會(huì)啟動(dòng)一個(gè)持續(xù)運(yùn)行的進(jìn)程,監(jiān)聽(tīng)發(fā)布到 mqtt/test 隊(duì)列的消息。

在終端二輸入:

  1. mosquitto_pub -h localhost -u $user -P $pass -t "mqtt/test" -m hello`

這條命令會(huì)向 mqtt/test 隊(duì)列發(fā)布一條消息,它應(yīng)該會(huì)顯示在終端一的輸出里。

現(xiàn)在你可以中止終端一運(yùn)行的 sub 命令了。

Mosquitto 中介允許客戶(hù)端發(fā)布消息到任何隊(duì)列,甚至沒(méi)有任何訂閱的隊(duì)列也可以。這些消息會(huì)永久丟失,但這不會(huì)阻止客戶(hù)端繼續(xù)發(fā)布消息。

打開(kāi)第三個(gè)終端,訂閱下列隊(duì)列(你的控制器會(huì)發(fā)布消息到這些隊(duì)列上):

  • greenhouse/temperature
  • greenhouse/light
  • greenhouse/humidity

給微控制器編碼

現(xiàn)在你已經(jīng)準(zhǔn)備好給微控制器編碼,發(fā)布它的監(jiān)測(cè)指標(biāo)到樹(shù)莓派 4 上運(yùn)行的 MQTT 中介上了。

Adafruit 有 出色的文檔,指導(dǎo)你使用 CircuitPython 庫(kù)合集 的庫(kù)來(lái)將你的微控制器連接到 WiFi 路由器,并發(fā)布監(jiān)測(cè)指標(biāo)到 MQTT 中介上。

安裝下列庫(kù)到 CIRCUITPYTHON/lib 目錄,溫室監(jiān)控會(huì)用到它們。這些庫(kù)在 Adafruit 的 CircuitPython 庫(kù)合集中都有提供:

  • adafruit_bus_device:一個(gè)帶有多個(gè) .mpy 文件的 Python 包文件夾(.mpy 是經(jīng)過(guò)壓縮的 Python 文件,用以節(jié)省空間)
  • adafruit_requests:?jiǎn)蝹€(gè) .mpy 文件
  • adafruit_register:一個(gè)包文件夾
  • adafruit_minimqtt:一個(gè)包文件夾
  • adafruit_si7021:?jiǎn)蝹€(gè) .mpy 文件,用來(lái)支持溫濕度傳感器

庫(kù)裝好了之后,將以下代碼寫(xiě)入 CIRCUITPYTHON 文件夾的 code.py 文件中:

  1. import time
  2. import ssl
  3. import socketpool
  4. import wifi
  5. import adafruit_minimqtt.adafruit_minimqtt as MQTT
  6. import board
  7. from digitalio import DigitalInOut, Direction, Pull
  8. from analogio import AnalogIn
  9. import adafruit_si7021
  10.  
  11. # Add a secrets.py to your filesystem that has a dictionary called secrets with "ssid" and
  12. # "password" keys with your WiFi credentials. DO NOT share that file or commit it into Git or other
  13. # source control.
  14. # pylint: disable=no-name-in-module,wrong-import-order
  15. try:
  16.         from secrets import secrets
  17. except ImportError:
  18.         print("WiFi secrets are kept in secrets.py, please add them there!")
  19.         raise
  20.  
  21. print("Connecting to %s" % secrets["ssid"])
  22. wifi.radio.connect(secrets["ssid"], secrets["password"])
  23. print("Connected to %s!" % secrets["ssid"])
  24. ### Feeds ###
  25. light_feed = "greenhouse/light"
  26. temp_feed = "greenhouse/temperature"
  27. humidity_feed = "greenhouse/humidity"
  28.  
  29. # Define callback methods which are called when events occur
  30. # pylint: disable=unused-argument, redefined-outer-name
  31. def connected(client, userdata, flags, rc):
  32.         # This function will be called when the client is connected
  33.         # successfully to the broker.
  34.         print("Connected to MQTT!")
  35.  
  36. def disconnected(client, userdata, rc):
  37.         # This method is called when the client is disconnected
  38.         print("Disconnected from MQTT!")
  39.  
  40.  
  41. def get_voltage(pin):
  42.         return (pin.value * 3.3) / 65536
  43.  
  44. # Create a socket pool
  45. pool = socketpool.SocketPool(wifi.radio)
  46.  
  47. # Set up a MiniMQTT Client
  48. mqtt_client = MQTT.MQTT(
  49.         broker=secrets["broker"],
  50.         port=secrets["port"],
  51.         username=secrets["aio_username"],
  52.         password=secrets["aio_key"],
  53.         socket_pool=pool,
  54.         ssl_context=ssl.create_default_context(),
  55. )
  56.  
  57. # Setup the callback methods above
  58. mqtt_client.on_connect = connected
  59. mqtt_client.on_disconnect = disconnected
  60.  
  61. # Connect the client to the MQTT broker.
  62. print("Connecting to MQTT...")
  63. mqtt_client.connect()
  64.  
  65. # Create library object using our Bus I2C port
  66. sensor = adafruit_si7021.SI7021(board.I2C())
  67. light_pin = AnalogIn(board.IO4)
  68.  
  69. while True:
  70.         # Poll the message queue
  71.         mqtt_client.loop()
  72.  
  73.         # get the current temperature
  74.         light_val = get_voltage(light_pin)
  75.         temp_val = ((sensor.temperature * 9)/5) + 32
  76.         humidity_val = sensor.relative_humidity
  77.  
  78.         # Send a new messages
  79.         mqtt_client.publish(light_feed, light_val)
  80.         mqtt_client.publish(temp_feed, temp_val)
  81.         mqtt_client.publish(humidity_feed, humidity_val)
  82.         time.sleep(0.5)

保存你的代碼。然后連接到串行監(jiān)視器,看程序連接到你的 MQTT 中介。你還可以將樹(shù)莓派 4 上的終端切換到訂閱了它的發(fā)布隊(duì)列的終端來(lái)查看輸出。

處理監(jiān)測(cè)指標(biāo)

像 MQTT 這樣的發(fā)布/訂閱工作流給微控制器系統(tǒng)提供了諸多好處。你可以有多個(gè)微控制器 + 傳感器來(lái)回報(bào)同一個(gè)系統(tǒng)的不同指標(biāo)或并行回報(bào)相同指標(biāo)的若干讀數(shù)。你還可以有多個(gè)不同進(jìn)程訂閱各個(gè)隊(duì)列,并行地對(duì)這些消息進(jìn)行回應(yīng)。甚至還可以有多個(gè)進(jìn)程訂閱相同的隊(duì)列,對(duì)消息做出不同的動(dòng)作,比如數(shù)值過(guò)高時(shí)發(fā)送通知郵件或?qū)⑾l(fā)送到另一個(gè) MQTT 隊(duì)列上去。

另一個(gè)選項(xiàng)是讓一個(gè)微控制器訂閱一個(gè)外部隊(duì)列,可以發(fā)送信號(hào)告訴微控制器做出動(dòng)作,比如關(guān)閉或開(kāi)始一個(gè)新會(huì)話(huà)。最后,發(fā)布/訂閱工作流對(duì)低功耗微控制器系統(tǒng)更佳(比如那些使用電池或太陽(yáng)能的系統(tǒng)),因?yàn)檫@些設(shè)備可以在更長(zhǎng)的延遲周期后批量發(fā)布監(jiān)測(cè)指標(biāo),并在回報(bào)的間隔期間關(guān)閉大量消耗電量的 WiFi 廣播。

要處理這些監(jiān)測(cè)指標(biāo),我創(chuàng)建了一個(gè) Python 客戶(hù)端,使用 Paho Python MQTT 客戶(hù)端 訂閱監(jiān)測(cè)指標(biāo)隊(duì)列。我還使用官方的 Prometheus Python 客戶(hù)端 創(chuàng)建了一個(gè) Web 服務(wù)器,它產(chǎn)生一個(gè)符合 Prometheus 標(biāo)準(zhǔn)的采集端點(diǎn),使用這些監(jiān)測(cè)指標(biāo)作為面板信息。Prometheus 服務(wù)器和 Mosquitto MQTT 中介我都是運(yùn)行在同一個(gè)樹(shù)莓派 4 上的。

  1. from prometheus_client import start_http_server, Gauge
  2. import random
  3. import time
  4. import paho.mqtt.client as mqtt
  5.  
  6. gauge = {
  7.   "greenhouse/light": Gauge('light','light in lumens'),
  8.   "greenhouse/temperature": Gauge('temperature', 'temperature in fahrenheit'),
  9.   "greenhouse/humidity": Gauge('humidity','relative % humidity')
  10. }
  11.  
  12. try:
  13.         from mqtt_secrets import mqtt_secrets
  14. except ImportError:
  15.         print("WiFi secrets are kept in secrets.py, please add them there!")
  16.         raise
  17.  
  18. def on_connect(client, userdata, flags, rc):
  19.         print("Connected with result code "+str(rc))
  20.         # Subscribing in on_connect() means that if we lose the connection and
  21.         # reconnect then subscriptions will be renewed.
  22.         client.subscribe("greenhouse/light")
  23.         client.subscribe('greenhouse/temperature')
  24.         client.subscribe('greenhouse/humidity')
  25.  
  26. def on_message(client, userdata, msg):
  27.         topic = msg.topic
  28.         payload = msg.payload
  29.         gauge[topic].set(payload)
  30.  
  31. client = mqtt.Client()
  32. client.username_pw_set(mqtt_secrets["mqtt_user"],mqtt_secrets['mqtt_password'])
  33. client.on_connect = on_connect
  34. client.on_message = on_message
  35. client.connect('localhost',1883,60)
  36.  
  37. if __name__ == '__main__':
  38.         # Start up the server to expose the metrics.
  39.  
  40.         client = mqtt.Client()
  41.         client.username_pw_set('london','abc123')
  42.         client.on_connect = on_connect
  43.         client.on_message = on_message
  44.         client.connect('localhost',1883,60)
  45.  
  46.         start_http_server(8000)
  47.         client.loop_forever()

然后我配置 Prometheus 服務(wù)器采集端點(diǎn)數(shù)據(jù)到 localhost:8000

你可以在 Github 上訪問(wèn) 溫室 MQTT 微控制器 這個(gè)項(xiàng)目的代碼,項(xiàng)目采用 MIT 許可證授權(quán)。 

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2013-03-04 11:14:24

云服務(wù)監(jiān)測(cè)云安全監(jiān)測(cè)云安全

2011-03-23 09:05:40

Nagios監(jiān)控

2020-12-02 13:19:47

Shell監(jiān)控文件Linux

2022-02-25 11:51:11

KubeScrape開(kāi)源監(jiān)控工具

2023-04-14 08:21:55

2016-04-18 10:45:22

Dr. ElephanHadoop性能監(jiān)控

2017-06-13 16:07:21

開(kāi)源網(wǎng)絡(luò)監(jiān)控服務(wù)器

2020-05-03 12:50:19

開(kāi)源監(jiān)控工具網(wǎng)絡(luò)監(jiān)控開(kāi)源

2023-08-20 16:51:28

Kubernetes開(kāi)源工具

2009-03-31 16:41:38

網(wǎng)絡(luò)性能網(wǎng)絡(luò)監(jiān)控開(kāi)源

2019-11-01 09:00:00

Kubernetes開(kāi)源監(jiān)控工具

2020-04-13 09:34:24

開(kāi)源監(jiān)控工具

2011-09-02 09:51:21

2010-06-28 13:35:15

ITIL監(jiān)控工具

2015-04-14 09:26:13

網(wǎng)絡(luò)流量監(jiān)控vnStatvnStati

2017-05-02 13:38:51

CSS繪制形狀

2020-11-09 06:51:46

開(kāi)源工具開(kāi)源

2021-07-09 05:24:24

云監(jiān)控工具開(kāi)源云平臺(tái)

2020-09-01 10:40:11

K8SDocker開(kāi)源

2013-12-18 17:16:29

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)