DSM501A ホコリセンサーモジュール 1

我が家のほこりはどうなのか?ということでホコリセンサーモジュールを購入

XIAO ESP32C6 を使い表示は ST7735 に結果を表示させたいと思います。そこで AI にコードを作ってもらいました。

#include <Adafruit_GFX.h>    // コアグラフィックライブラリ
#include <Adafruit_ST7735.h> // ST7735用のハードウェアライブラリ
#include <SPI.h>

// --- ST7735 ディスプレイピン設定 ---
#define TFT_CS     D0  // D1 (GPIO1)
#define TFT_RST    D1  // D2 (GPIO2)
#define TFT_DC     D2  // D3 (GPIO3)
// ※ MOSIはD10(GPIO10)、SCLKはD8(GPIO8)に自動割り当てされます

// ST7735のインスタンス作成
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

// --- DSM501A ホコリセンサーピン設定 ---
#define DUST_PIN   D3  // D4 (GPIO4) - DSM501AのVout2に接続

// --- 測定用変数 ---
unsigned long duration;
unsigned long starttime;
unsigned long sampletime_ms = 30000; // 30秒ごとに集計
unsigned long lowpulseoccupancy = 0;
float ratio = 0;
float concentration = 0;

void setup() {
  Serial.begin(115200);
  
  // センサーピンの設定
  pinMode(DUST_PIN, INPUT);

  // ST7735 ディスプレイの初期化 (1.8インチ一般的な黒タブ/緑タブの場合)
  tft.initR(INITR_BLACKTAB); 
  tft.setRotation(1); // 画面を横向きに設定
  tft.fillScreen(ST7735_BLACK);

  // 初期画面表示
  tft.setTextColor(ST7735_WHITE);
  tft.setTextSize(1);
  tft.setCursor(10, 10);
  tft.print("DSM501A Dust Sensor");
  tft.setCursor(10, 30);
  tft.print("Warming up (30s)...");

  starttime = millis(); // 計測開始時間の記録
}

void loop() {
  // パルスがLOW(粒子を検知している間)の時間を計測(マイクロ秒)
  duration = pulseIn(DUST_PIN, LOW);
  lowpulseoccupancy = lowpulseoccupancy + duration;

  // 30秒(sampletime_ms)経過したら結果を計算・表示
  if ((millis() - starttime) >= sampletime_ms) {
    // 占有率(%)の計算
    ratio = lowpulseoccupancy / (sampletime_ms * 10.0); 
    
    // 特性曲線に基づく粒子濃度の計算(概算式 pcs/283ml または pcs/0.01cf)
    concentration = 1.1 * pow(ratio, 3) - 3.8 * pow(ratio, 2) + 520 * ratio + 0.6; 

    // シリアルモニターへの出力
    Serial.print("Low Pulse Occupancy: ");
    Serial.print(lowpulseoccupancy);
    Serial.print(" | Ratio: ");
    Serial.print(ratio);
    Serial.print("% | Concentration: ");
    Serial.print(concentration);
    Serial.println(" pcs/0.01cf");

    // --- ディスプレイの更新 ---
    tft.fillScreen(ST7735_BLACK); // 画面クリア
    
    // タイトル表示
    tft.setTextColor(ST7735_GREEN);
    tft.setTextSize(1);
    tft.setCursor(10, 10);
    tft.print("AIR QUALITY MONITOR");

    // 比率(Ratio)の表示
    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(10, 40);
    tft.print("Ratio: ");
    tft.setTextSize(2);
    tft.print(ratio, 2);
    tft.setTextSize(1);
    tft.print(" %");

    // 濃度(Concentration)の表示
    tft.setTextSize(1);
    tft.setCursor(10, 75);
    tft.print("Dust Conc:");
    tft.setCursor(10, 90);
    tft.setTextSize(2);
    tft.setTextColor(ST7735_YELLOW);
    tft.print(concentration, 1);
    tft.setTextSize(1);
    tft.print(" pcs/0.01cf");

    // 次の計測のために変数をリセット
    lowpulseoccupancy = 0;
    starttime = millis();
  }
}

モジュールの接続がよくわかりませんので表示テストをしてみました。。

それらしい表示がされています。次はモジュールの接続方法を調べテストをしてみます。

コメント