玩 MakeCode Adafruit 積木讓 [Adafruit Circuit Playground Express + PMSA003] 可抓空污pm數據

動機:想要運用 MakeCode Adafruit 的積木(JavaScript)讓 Adafruit Circuit Playground EXpress(以下簡稱CPX) 搭配 攀藤PMSA003 pm2.5 粉塵感測器 來抓取pm數據(原廠僅提供Arduino範例碼) ,可能辦得到嗎?!

準備環境
1.Windows 10(舊Windows 7驅動安裝請參攷[1])
2.安裝 Microsoft MakeCode for Circuit Playground Express(Windows Store app--https://www.microsoft.com/zh-tw/p/makecode-for-adafruit/9pgzhwsk0pgd?activetab=pivot:overviewtab) 或使用網頁版(https://makecode.adafruit.com/)

實作步驟
1.翻看了 MakeCode Adafruit 提供的 blocks 及 help,沒有相關說明如何去接收外部 UART或 Serial 的資訊
2.查看了原廠的 PMSA003傳輸協議(如參攷[2]),瞭解了 baud rate=9,600, 起始符1=0x42(ASCII='B'), 起始符2=0x4d(ASCII='M')
3.參攷了原廠的 Arduino範例程式碼(如參攷[3]),也試run了,可以執行無誤...
4.重頭戲來了,開始在 MakeCode Adafruit 亂試 JavaScript的程式 (因為無此積木,只能自己刻黑積木),終於在試了19版不同的方法中找到了一線龧光,可利用 Buffer 來擷取 PMSA003廣播的封包數據,並進行高、低位元組的組合及NumberFormat的轉換運算,程式如下:

  function getPmValue(buf: Buffer, high: number, low: number) {  
      let pmValue = ((buf.getNumber(NumberFormat.UInt16BE, high) << 8)  
          + buf.getNumber(NumberFormat.UInt16BE, low)) >> 9  
      return pmValue  
  }  

5.再利用原廠手冊提供的資料格式-欄位位置,就可以正確抓取 pm1.0pm2.5pm10 的數據了,相關積木圖示如下:


致謝:萬分感謝高師大潘正育教授大力贊助~CPX + PMSA003 + 轉接板(參攷[4]) 及 相關coding經驗傳授!!

心得:(不知道筆者的理解是否正確?!)
1.需注意的基本觀念是IP傳輸協議規定是 Big-endian的位元組順序,而在MCU/CPU則是 Little-endian
2.利用 Bitwise Shift Operators 來移動高位bits再與低位bits相加,才能解開這神秘的transfer bits...(運用此巧妙的bytes順序,即可達成傳輸數據的秘密封裝,惟有可以逆向反推順序才能一窺究竟)
3.就好比傳送方將一組數字拆成兩部分來傳輸,接收方要先將收到的兩部分順序排對,再將高位元移位並併入低位元數字,才能解開密室內的圈套逃脫原廠的桎梏:-)

後記
1.對於此次的debug, 筆者是利用 MP759 USB轉TTL序列傳輸線(參攷[5]) 來查看結果,也可以利用 Console積木(需安裝App才能顯示)
2.可將上述 JS程式利用 MakeCode 開放的 Add custom blocks? 包入 CUSTOM.TS 做出 [自訂積木](參攷[6]) 來友善要學習的 users

參攷
1.Windows Driver Installation, https://learn.adafruit.com/adafruit-circuit-playground-express/adafruit2-windows-driver-installation
2.PMSA003數據手冊,https://gitlab.melroy.org/melroy/air-quality-meter/blob/765f2832de2cdc7fa3485651c28fe2d7c166d1c8/doc/PMSA003.pdf
3.Arduino Code, https://learn.adafruit.com/pm25-air-quality-sensor/arduino-code
4.新款 PMS7003 PMSA003 轉接板 連接器 G7 G10, https://goods.ruten.com.tw/item/show?21703152682658
5.MP759 USB轉TTL序列傳輸線, https://24h.pchome.com.tw/prod/DSAJ2B-A9009BJ6X
6.自訂積木, https://makecode.adafruit.com/blocks/custom 及 https://makecode.com/defining-blocks

留言