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

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();
}
}
モジュールの接続がよくわかりませんので表示テストをしてみました。。

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

コメント