Arduinoを使って、ESP32-C3とAS3935雷センサーを接続し、OLEDディスプレイに雷の情報を表示するプロジェクトを進めているときに、コードにエラーや問題が発生することがあります。この記事では、Arduino ESP32-C3とAS3935雷センサーの接続方法や、コード修正のためのヒントを詳しく解説します。
ESP32-C3とAS3935雷センサーの接続方法
まず、ESP32-C3とAS3935雷センサーを接続するために必要なピン配置について理解しておきましょう。AS3935はI2C通信を使用しますので、I2Cピン(SDA、SCL)をESP32-C3に接続する必要があります。通常、SDAはGPIO8、SCLはGPIO9に接続します。さらに、IRQピンをGPIO3に接続して、雷センサーからの割り込み信号を受け取ります。
接続が完了したら、コード内でこれらのピン設定を反映させる必要があります。ESP32-C3では、`Wire.begin(SDA_PIN, SCL_PIN)`のようにI2Cの設定を行います。
コードの基本構成とライブラリの設定
Arduinoのコード内で使用するライブラリとして、AS3935センサー用の`AS3935I2C`、OLEDディスプレイ用の`U8g2lib`をインクルードします。これらのライブラリは、センサーからデータを取得し、OLEDディスプレイに情報を表示するために必要です。
コードの冒頭で、各ライブラリをインクルードし、I2C通信のためのピン設定を行い、ディスプレイの初期化を行います。次に、`as3935.begin(Wire)`を使って雷センサーを初期化し、問題がなければセンサーが準備完了となります。
雷センサーの割り込み処理と表示の方法
雷センサーからの割り込み信号は、`IRQ_PIN`ピンで受け取ります。このピンがLOWになると、雷センサーが何らかのイベントを検出したことを意味します。例えば、雷の距離やノイズ、干渉源などです。
コードでは、`as3935.readInterruptSource()`を使用して、どのイベントが発生したかを確認します。例えば、雷が検出された場合には、その距離(キロメートル単位)をOLEDディスプレイに表示します。
コードの修正点と注意点
Arduinoのコード内で特に注意すべき点は、ディスプレイの描画処理です。ディスプレイに文字を表示する際、`u8g2.clearBuffer()`でバッファをクリアし、`u8g2.drawStr()`で文字を描画します。表示内容が更新されるたびに、`u8g2.sendBuffer()`でディスプレイに送信することを忘れないようにしましょう。
また、`delay(200)`を入れることで、割り込み処理後に少し待機することができますが、これを適切に設定しないと、ディスプレイが頻繁に更新されすぎて、視認性が悪くなることもあります。
具体的なコード修正例
以下のコードでは、割り込み信号を受け取った後、イベントタイプに応じて異なるメッセージをOLEDディスプレイに表示します。雷が検出された場合は、その距離を表示します。
if (digitalRead(IRQ_PIN) == LOW) {
uint8_t intType = as3935.readInterruptSource();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB08_tr);
switch (intType) {
case AS3935I2C::INT_NOISE:
u8g2.drawStr(0, 20, "Noise detected");
break;
case AS3935I2C::INT_DISTURBER:
u8g2.drawStr(0, 20, "Disturber detected");
break;
case AS3935I2C::INT_LIGHTNING: {
uint8_t dist = as3935.getLightningDistanceKm();
char msg[32];
snprintf(msg, sizeof(msg), "Lightning: %u km", dist);
u8g2.drawStr(0, 20, msg);
break;
}
default:
u8g2.drawStr(0, 20, "Unknown interrupt");
break;
}
u8g2.sendBuffer();
delay(200);
}
まとめ
ESP32-C3とAS3935雷センサーを使ったArduinoプロジェクトでは、正しいピン配置とライブラリの設定が重要です。コード内で雷センサーからの割り込み信号を処理し、その情報をOLEDディスプレイに表示することができます。この記事で紹介した修正方法を参考に、雷センサーの動作やディスプレイ表示を確認しながら、プロジェクトを進めていきましょう。


コメント
始めまして、三平ともうします。
早速、ESP32-C3とAS3935雷センサーの組み合わせでプログラミングをしておりますがAS3935の初期化に失敗したりと苦戦しております。
どうか、ご教授お願いできないでしょうか?
<当方のシステム>
ESP32-C3
AS3935(秋月電子)のI2Cアドレス(0x03)、3.3V
AS3935用ライブラリは、「AS3935」 by Austrian Microsystems
I2Cピン:SDA=GPIO8、SCL=GPIO9
IRQピン:GPIO10
U8g2ライブラリでSH1106 OLEDを使用
<以下コード>
#include
#include
#include
#include
// OLED用インスタンス(I2C接続、SH1106, U8g2使用)
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
// AS3935インスタンス
AS3935 lightningSensor;
// ピン定義
const uint8_t SDA_PIN = 8;
const uint8_t SCL_PIN = 9;
const uint8_t IRQ_PIN = 10; // IRQピンをGPIO10に変更
// 割り込みフラグ
volatile bool lightningDetected = false;
// IRQ割り込みハンドラ
void IRAM_ATTR irqHandler() {
lightningSensor.interruptHandler();
lightningDetected = true;
}
void setup() {
Serial.begin(115200);
delay(500); // シリアル安定化待ち
// OLED初期化
u8g2.begin();
u8g2.setFont(u8g2_font_ncenB08_tr);
u8g2.clearBuffer();
u8g2.drawStr(0, 12, “AS3935 Lightning”);
u8g2.drawStr(0, 28, “Initializing…”);
u8g2.sendBuffer();
// I2C初期化(←これが必要!)
Wire.begin(SDA_PIN, SCL_PIN);
// AS3935初期化
bool ok = lightningSensor.initialise(SDA_PIN, SCL_PIN, 0x03, 0x0A, true); // tunCap=0x0A, 室内モード
if (!ok) {
Serial.println(“AS3935 init failed!”);
u8g2.clearBuffer();
u8g2.drawStr(0, 12, “AS3935 Init Fail”);
u8g2.sendBuffer();
while (1) delay(1000);
} else {
Serial.println(“AS3935 init OK”);
}
// 割り込み設定
pinMode(IRQ_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(IRQ_PIN), irqHandler, RISING);
// センサー開始
lightningSensor.start();
// OLED表示更新
u8g2.clearBuffer();
u8g2.drawStr(0, 12, “AS3935 Lightning”);
u8g2.drawStr(0, 28, “Waiting for IRQ…”);
u8g2.sendBuffer();
}
void loop() {
if (lightningDetected) {
if (lightningSensor.process()) {
uint8_t flags = lightningSensor.getInterruptFlags();
uint8_t dist = lightningSensor.getDistance();
Serial.print(“IRQ flags: “);
Serial.print(flags);
Serial.print(“, Distance: “);
Serial.println(dist);
u8g2.clearBuffer();
if (flags & AS3935::intLightningDetected) {
u8g2.drawStr(0, 12, “Lightning!”);
char buf[20];
sprintf(buf, “Distance: %d km”, dist);
u8g2.drawStr(0, 32, buf);
} else if (flags & AS3935::intDisturberDetected) {
u8g2.drawStr(0, 12, “Disturber!”);
} else if (flags & AS3935::intNoiseLevelTooHigh) {
u8g2.drawStr(0, 12, “Noise High”);
} else {
u8g2.drawStr(0, 12, “Unknown IRQ”);
}
u8g2.sendBuffer();
}
lightningDetected = false;
}
delay(50);
}
以上のコードを実行すると、OLED表示が Initializing… で止まります。また、I2Cスキャン(OLED表示)やAS3935のアドレス、I2C接続も問題なしです。
誠に勝手なお願いですが、ESP32-C3用の場合でお勧めのAS3935用ライブラリと全コードが有りましたらご教授お願いします。