樹莓派 激光pm2.5傳感器模塊SDS011 Modbus RTU

現在我們的樹莓派需要連接激光傳感器測量室內的空氣質量。
買回來之後發現是通過USB連接通過Modbus RTU 進行傳輸的。
然後網上查了下: python modbus 實現RTU 通信
測試了一下代碼,發現怎麼更改端口號都找不到設備,查了一下樹莓派USB端口設置, 然後發現需要對USB串口進行固定: 樹莓派USB端口綁定
首先多次插拔確定USB端口:

lsusb

在這裏插入圖片描述

sudo gedit /etc/udev/rules.d/99-com.rules
#文末添加
KERNEL=="ttyUSB*",ATTRS{idVendor}=="1a86",ATTRS{idProduct}=="7523", MODE:=“0777”, SYMLINK+="device0"
//然後重啓 udev
sudo /etc/init.d/udev restart

然後重新插拔設備

ls /dev/device*
->/dev/device0

然後再測試之前的腳本,可以找到設備了。
但是每次都返回Invalid CRC in response. 估計是自帶的校驗碼有什麼鬼毛病,沒辦法查錯。。然後換了種方式:
如何使用樹莓派測定顆粒物(PM 2.5)
發現他們家的代碼僅支持Python2.7以下的版本,python3跑的時候什麼都不返回。
測試分析後發現在於python3對返回方式的處理不同,更改代碼如下可以正常讀取數據:

import serial,  time

ser = serial.Serial()
ser.port = "/dev/device0"

ser.baudrate = 9600

ser.open()
ser.flushInput()

while True:
   ser.write("AAB4FE010300000000000000000000FFFF00AB".encode())
   byte = -1

   while byte != b'\xaa':
       byte = ser.read(size=1)

   d = ser.read(size=9)

   if d[0] == 192:
       pm_25 = (d[1] + 256*d[2]) / 10.0
       pm_10 = (d[3] + 256*d[4]) / 10.0       
       print("Current pm2.5: ", pm_25, " pm10: ", pm_10)
   else:
       print("Not a correct request for PM reading.")
       
   time.sleep(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章