日別アーカイブ: 2022年10月8日

ZH02を触ってみた

先日入手したWinsenのダストセンサーZH06を触ってみた。先日ZPH02というのを触ったけどそれより少し良い奴。ZPHはDuty比しか返してくれないので換算が面倒だけどこっちはI2Cでug/m3で返してくれる。ただしPWMは二つの値を順次返してくれるようでマイコンなしで扱うのは大変そう。

コネクタはオスオスのがついてきた。メスのコネクターはなかったので半分に切ってピンヘッダーに半田した。

UART接続

環境

  • ArduinoNano互換機
  • Arduino IDE1.8.13(Windows10)
  • ブレッドボードとジャンパーケーブル少々

配線

NanoとPCはUSB接続

ZH06Nano
#1 VDD5V
#2 GNDGND
#3 Reserved未接続
#4 RXD Serial receive pinD3(スケッチで指定)
#5 TXD Serial send pinD2(スケッチで指定)
#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("");
}

問い合わせモードにするコマンドもあるけど試していない。データシートのリンクないけどこれで動いた