使用 Adafruit Circuit Playground Bluefruit 連接 PMSA003 及 SGP30 做空氣品質感測(MakeCode版本)

動機:對於空氣品質的感測,是否可以利用 Adafruit Circuit Playground Bluefruit (nRF52840) 這塊好炫的板子及 Adafruit SGP30(VOC) 和 PMSA003 來搭配 MakeCode積木 開發使用呢?!


準備環境
1.Adafruit Circuit Playground Bluefruit 開發板(以下簡稱CPB)
2.Adafruit SGP30 感測板(以下簡稱 VOC)
3.Plantower PMSA003 傳測器(以下簡稱 PMS)
4.PMSA003 轉接板 及 專用連接線 1.25mm 轉 2.54mm(杜邦頭)
5.麵包板專用電源模塊 5V、3.3V 輸出
6.數條杜邦線
7.麵包板
8.Windows 10 (筆電)
9.USB PL2303HX/TA USB轉串口模組傳輸線
10.Xshell 6


執行步驟
1.首先,請依照以下接線圖來連接 SGP(4條線) 及 PMS(3條線) 等 sensor 及 USB PL2303(2條線)與 CPB開發板(6條線)
2.其次,進入 MakeCode 官網 (https://maker.makecode.com/) 按下 New Project,如下圖
再輸入 Project name 按下 Create,如下圖
再於 Boards CPB,如下圖
再於 MakeCode 編輯區按下 JavaScript,如下圖
2.接下來,輸入以下的程式碼
//程式開始//
function ctrlLED () {
    let SerialNum = 0
    if (SerialNum >= 0 && SerialNum <= 35) {
        light.setPixelColor(9, 0x00ff00)
    } else if (SerialNum >= 36 && SerialNum <= 53) {
        light.setPixelColor(9, 0xff8000)
    } else if (SerialNum >= 54 && SerialNum <= 70) {
        light.setPixelColor(9, 0xff0000)
    } else {
        light.setAll(light.rgb(75, 0, 108))
    }
    pause(500)
    light.clear()
}

function getSGP (eco2: number) {
    return (eco2 >> 8) & 0xff
}

serial.onEvent(SerialEvent.RxBufferFull, function () {
    pins.LED.digitalWrite(true)
    pause(200)
})

let magicIdentifier = ""
let sValue = 0
let pm100 = 0
let buffer: Buffer = null
let pm10 = 0
let pm25 = 0
let eco2 = 0

function getPM (buf: Buffer, high: number, low: number) {
    let pmValue = 0
    pmValue = ((buf.getNumber(NumberFormat.UInt16BE, high) << 8) + buf.getNumber(NumberFormat.UInt16BE, low)) / 512
    return pmValue    
}

light.setBrightness(20)
serial.redirect(pins.TX, pins.RX, BaudRate.BaudRate9600)
serial.setRxBufferSize(32)
serial.writeLine("Begin PMSA003 testing")

forever(function () {
    pins.LED.digitalWrite(false)
    pause(200)
    eco2 = getSGP(pins.i2cReadNumber(
    88,
    NumberFormat.Int8LE,
    false
    ))
    serial.writeValue("sgp30", eco2)
    buffer = serial.readBuffer()
    let buflen = buffer.length
    if (buflen > 0) {
        magicIdentifier = buffer.toString().substr(0, 2)
        if (magicIdentifier == "BM") {
            pm10 = getPM(buffer, 4, 5)
            serial.writeValue("pm10", pm10)
            pm25 = getPM(buffer, 6, 7)
            serial.writeValue("pm25", pm25)
            pm100 = getPM(buffer, 8, 9)
            serial.writeValue("pm100", pm100)
        }
    }
    ctrlLED()
})


再於編輯區上方按下 Blocks,如下圖,就可以看見 MakeCode 自動生成相關的積木,同時左方的CPB模擬器也開始亮綠燈(#9)
3.最後,為了查看 SERIAL 積木傳送的資料(筆電已插好PL2303HX/TA USB轉串口模組傳輸線),打開 Xshell 6 (或 PuTTY)軟體,新增一個新的連線,設定,如下圖
請注意上圖的 COMx 需至Win10的 裝置管理員 中查看 連接埠 的 編號,如下圖
就可以看到 PMS(TX) 傳送到 CPB(RX) 的空氣數據了,如下圖(可方便做程式 Debug)
後面附上筆者雜亂的實物接線照片三張,如下




心得
1.若是買 PL2303HX舊款(建議買正品新款)無法在Windows 10使用者,可參攷1.解決之
2.因 SGP30 係以 I2C 傳輸資料,而 MakeCode I2C相關積木沒有更細部的功能,致使無法正常收到數據,尚待解決
3.筆者好奇的是,Adafruit官網(如參攷2.3.)竟然沒有 MakeCode 的相關說明???


參攷
1.USB PL2303HX 在 Win8 Win8.1 Win10 無法使用解決辦法, https://www.ez2o.com/Blog/Post/PL2303HX-Win8-Win8.1-Win10
2.Adafruit Circuit Playground Bluefruit Overview, https://learn.adafruit.com/adafruit-circuit-playground-bluefruit?view=all

留言