M5Atomでミニ犬吠埼灯台を作ろう

プログラム生成アプリ

https://gpt.ichika.net/

LEDを光らせよう

ブーザーとLEDを接続した基板のプログラムを動かそう

#include <M5Unified.h>
#include <Adafruit_NeoPixel.h>

#define BUZER_PIN 21   // ブザー接続ピン
#define LED_PIN    25   // フルカラーLED接続ピン

// 1個のNeoPixel(GRB, 800KHz)を使用
Adafruit_NeoPixel led(1, LED_PIN, NEO_RGB + NEO_KHZ800);

void setup() {
  M5.begin();
  Serial.begin(115200);
  
  // ブザー用ピンを出力モードに設定
  pinMode(BUZER_PIN, OUTPUT);
  
  // LEDの初期化
  led.begin();
  led.show();
}

void loop() {
    // tone()で指定周波数の音を100ms鳴らす
  tone(BUZER_PIN, 440, 100);
  delay(120);  // 音が鳴り終わるまで待機
  
  // ブザー出力を0にしてノイズを消す
  digitalWrite(BUZER_PIN, 0);
  // 0~255まで値を増加させる
  for (int value = 0; value <= 255; value++) {
    updateDisplay(value);
  }
  // 255~0まで値を減少させる
  for (int value = 255; value >= 0; value--) {
    updateDisplay(value);
  }
}

// 値に応じたLED色とブザー音を更新する関数
void updateDisplay(int value) {
  // LED色の決定
  // 値が低いと青(0,0,255)、高いと赤(255,0,0)になるよう線形補間
  uint8_t red   = map(value, 0, 255, 0, 255);
  uint8_t blue  = map(value, 0, 255, 255, 0);
  uint8_t green = 0;
  led.setPixelColor(0, led.Color(red, green, blue));
  led.show();
  
  delay(50);  // 色と音の変化が見やすいように少し待機
}

土壌センサを取り付けて見よう

土壌センサーを使ってミニ犬吠埼灯台をパワーアップさせよう!

#include <M5Unified.h>
#include <Adafruit_NeoPixel.h>

#define BUZER_PIN 21   // 圧電ブザー接続ピン
#define LED_PIN    25   // フルカラーLED接続ピン
#define ADC_PIN    32   // ADC入力ピン(静電容量式土壌センサ)

// ユーザ定義の閾値(実測値に合わせて調整してください)
// 例:水中に入れたときの値(very wet)と空気中の値(dry)から設定
const int veryWetThreshold = 1200;  // very wet時のADC閾値(低い値)
const int dryThreshold     = 2500;  // dry時のADC閾値(高い値)

// 1個のNeoPixel(GRB、800KHz)を使用
Adafruit_NeoPixel led(1, LED_PIN, NEO_RGB + NEO_KHZ800);

void setup() {
  M5.begin();
  Serial.begin(115200);
  
  // 起動時にブザーで通知(1000Hzの音を100ms出力)
  tone(BUZER_PIN, 1000, 100);
  delay(120);  // ブザー音が終了するまで待機
  digitalWrite(BUZER_PIN, 0);
  
  // LEDの初期化
  led.begin();
  led.show();
}

void loop() {
  // ADC値の取得
  int adcValue = analogRead(ADC_PIN);
  Serial.println(adcValue);

  uint8_t red = 0;
  uint8_t blue = 0;
  
  // very wet: センサ値が veryWetThreshold 以下なら青色
  if(adcValue <= veryWetThreshold) {
    red = 0;
    blue = 255;
  }
  // dry: センサ値が dryThreshold 以上なら赤色
  else if(adcValue >= dryThreshold) {
    red = 255;
    blue = 0;
  }
  // wet: 閾値の間なら、値に応じて線形補間(青→赤)
  else {
    // 閾値間での正規化(0.0〜1.0)
    float norm = float(adcValue - veryWetThreshold) / (dryThreshold - veryWetThreshold);
    red = norm * 255;            // norm=0で0、norm=1で255
    blue = (1.0 - norm) * 255;     // norm=0で255、norm=1で0
  }
  
  // LED色の設定(今回は緑は使用しないため0固定)
  led.setPixelColor(0, led.Color(red, 0, blue));
  led.show();
  
  delay(200); // 約200msごとに更新
}

Arduino IDEのセットアップを使用

Arduino IDEをセットアップは下記の記事を参考にインストールを行いましょう

Arduino IDEを使って、M5Atomに書き込めるように設定を行おう。