先日入手したWinsenのダストセンサーZH06を触ってみた。先日ZPH02というのを触ったけどそれより少し良い奴。ZPHはDuty比しか返してくれないので換算が面倒だけどこっちはI2Cでug/m3で返してくれる。ただしPWMは二つの値を順次返してくれるようでマイコンなしで扱うのは大変そう。
コネクタはオスオスのがついてきた。メスのコネクターはなかったので半分に切ってピンヘッダーに半田した。
UART接続
環境
- ArduinoNano互換機
- Arduino IDE1.8.13(Windows10)
- ブレッドボードとジャンパーケーブル少々
配線
NanoとPCはUSB接続
ZH06 | Nano |
#1 VDD | 5V |
#2 GND | GND |
#3 Reserved | 未接続 |
#4 RXD Serial receive pin | D3(スケッチで指定) |
#5 TXD Serial send pin | D2(スケッチで指定) |
#6 Reserved | 未接続 |
#7 Reserved | 未接続 |
#8 PWM output | 未接続 |
ソース
#include <SoftwareSerial.h>
SoftwareSerial mySerial(3, 2);
#define LED_PIN 13
#define BUFFER_SIZE 31
#define START_BIT 0x42
unsigned char inBuffer[BUFFER_SIZE];
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
mySerial.setTimeout(1500);
}
void loop() {
bool readFlg = false;
int bufIndx = 0;
if(mySerial.find(START_BIT)){
mySerial.readBytes(inBuffer,BUFFER_SIZE);
}
if (checkSum()) {
writeData();
}
delay(100);
}
bool checkSum() {
int dataSum = 0;
for ( int i = 0; i < (BUFFER_SIZE-2) ; i++) {
dataSum += inBuffer[i];
}
dataSum += START_BIT;
Serial.print("calc=");
Serial.print(dataSum, HEX);
Serial.print(" checksum=");
Serial.print( (inBuffer[29] << 8) + inBuffer[30], HEX);
Serial.print(" ");
bool isGoodChecksum = (dataSum == ((inBuffer[29] << 8) + inBuffer[30]));
if(!isGoodChecksum){
Serial.println("チェックサムエラー");
}
return isGoodChecksum;
}
void writeData() {
for ( int i = 0; i < BUFFER_SIZE; i++ ) {
Serial.print(inBuffer[i], HEX);
Serial.print(",");
}
Serial.print("[pm1.0 ");
Serial.print((inBuffer[9] << 8) + inBuffer[10]);
Serial.print("]");
Serial.print("[pm2.5 ");
Serial.print((inBuffer[11] << 8) + inBuffer[12]);
Serial.print("]");
Serial.print("[pm10 ");
Serial.print((inBuffer[13] << 8) + inBuffer[14]);
Serial.print("]");
Serial.println("");
}
問い合わせモードにするコマンドもあるけど試していない。データシートのリンクないけどこれで動いた