AE-AS3935+Raspberry PI Picoを使用した実用レベルの雷検知器を作成

まえがき
家に雷が落ちたことありますか? 私はあります。正確には、隣家のテレビアンテナに落雷しました。それだけで、家の中の電気機器がいくつも壊れ、大変な散財となったことがあります。
興味深いのは、壁コンセントに直接差し込んだ電子機器(テレビ、インタフォンなど)の多くは壊れましたが、あまり良くないと言われている、タップによる分岐を行っているものは壊れませんでした。
また、ACアダプタなどは壊れましたが、その先にある機器は壊れませんでした。また、壁コンセントに接続してあるTVとHDMIケーブルで接続してあるAVアンプは、接続先のHDMIが壊れてしまいました。
今では、コンセントに雷サージのおまじないを付けて、さらに雷が鳴るとコンセントを抜くという生活です。
そんな時、秋月電子で雷センサー(AE-AS3935)を見つけたので購入しましたが、ずっと放置したままになっていました。重い腰を上げて作ってみることにしました。
この記事について
この記事は自分の備忘録ですが、この記事をもとに同じものを作成することもできるようにしてあります。
AS3935のサンプルプログラムや作例としての参考としてだけでなく、丸コピーして作成してみるのも良いと思います。
システム全体の概要
機能
- 雷雲を検出し、発見したら時刻と雷雲までの距離を表示します
- 起動時に、SNTPに対して日時を問い合わせ、時刻の設定を行います。

特徴
- 時計が表示されるので常時電源ONでも違和感がない
通常は時計を表示し、時計として動作するようにします。レトロなムードとして、時計の文字盤はパタパタ時計にするなど、多少は見た目を気にしています。パタパタ時計なので秒針はありませんが、ランプの数で15秒単位の秒はわかるようにしました。 - 自己完結している
設定画面を持ち、設定などでPCへの接続などを不要にしました。SSIDなどの文字入力時は、画面にソフトウェアキーボードを表示します。 - パラメータの調整可能
AS3935のパラメータを設定可能にします。調整などでPCとの接続やコンパイルなどを不要にしました。各種キャリブレーションも、PCなどがなくても実行可能です。
システム構成図
システムの概要は次の通りです。TFT液晶(表示とタッチスクリーン)はSPIで接続されています。雷センサはI2Cで接続されています。
雷センサーは割り込み要求ピンが1つ用意されており、雷の発生があると割り込みでマイコン側に伝えます。

ハードウェア
AS-AE3935について
AS-AE3935は、AMS社のAS3935雷センサーICを搭載したモジュールで、雷の発生を検知し、雷雲までの距離や雷のエネルギーを推定できるデバイスです。秋月電子で販売されており、I2Cを使用して外部に情報を送信します。
主な特徴:
- 検出範囲:最大約40km先の雷を検知
- インターフェース:I²C(秋月電子のモジュールではSPIは未実装)
- 出力:雷検出時にIRQ信号を出力
- 電源電圧:2.4V〜5.5V
- 消費電流:待機時 約70μA、検出時 約350μA
- ノイズ除去機能:人工ノイズと自然雷を区別
- 距離推定:14段階で雷雲までの距離を出力
周辺回路について
今回のハードウェアは、Raspberry pi PICO Wをコントローラにして、AE-AS3935と、ILI9341搭載の2.8インチSPITFT液晶、MSP2807を使用した、雷センサーのプログラムです。
回路図とガーバーデータ
基本的には、各モジュール部品をRaspberry PI Picoにそのままポン付けしただけです。回路図ではI2Cに複数のデバイスを接続するためのピンソケットなどがありますが、実装する必要はありません。
- 電源はUSBもしくはVSYSに接続された、POWER_J1から供給します。USBは5Vを供給しますが、VSYSでは(仕様上)3.3Vでも動作可能です。
- SDカードは今回使用していませんが、結線はされています。詳細なドキュメントが無いのですが5Vを供給するとSDカードが動作しない、という情報があります。SDカードを使用する場合、POWER_J1から3.3Vを供給してください。
- 4つのスイッチは、現在使用していません。
- I2C_J1、I2C_J2、I2C_J3は、使用していません。

Kicadの回路図、ボードデータとガーバーデータはgithubのプロジェクトページからダウンロードできます。
今回はブレッドボードの次、テスト用の片面基板などは作成せず、最初から両面基板で作りJLCPCBに発注しました。ボードは、10cmx10cmで作ってあります。ガーバーデータを使用してそのままPCBを発注することもでき、価格は5枚で$10未満だと思います。 githubのプロジェクトページには、Gerber.zip という名前で発注に使用したガーバーデータをアップロードしてあります。
使用部品
使用している部品は次の通りです。型番、価格などは秋月電子のものです。(この中には、開発に使用するPCや、デバッグプローブなどは含まれていません。
場所 | 名前 | 型番 | 個数 | 単価 | 備考 |
---|---|---|---|---|---|
A1 | Raspberry pi PICOW | SC0918 | 1 | ¥1,200 | PICO 2W も可だが、再コンパイル必要 |
U1 | ILI9341搭載2.8インチSPI制御タッチパネル付TFT液晶 MSP2807 | AA317 | 1 | ¥1,450 | |
U2 | 雷センサー | AE-AS3935 | 1 | ¥2,280 | |
A1 | ピンヘッダ 1x20 | PH-1x20SG | 2 | ¥20 | Raspberry Pi Picoに使用 |
U1 | ピンヘッダ 1x40(※3) | PH-1x40SG | 1 | ¥35 | 14ピンと4ピンに割ってTFT液晶に取り付け |
I2C_J1~J3 | ピンソケット1x5(※2) | FH-1x5SG/RH | 3 | ¥25 | |
POWER_J1 | ピンソケット1x2 | FH-1x2SG/RH | 1 | ¥15 | |
PROBE_J1 | ピンソケット1x3 | FH-1x3SG/RH | 1 | ¥15 | |
U1 | ピンソケット1x14、1x4(※3) | FH-1x14SG、FH-1x4SG/RH | 各1 | ¥50、¥20 | |
R1,2,3,4 | カーボン抵抗 3.3KΩ(※1) | CF25J3K3B | 1 | ¥140 | 100個140円 |
C1~6 | 積層セラミックコンデンサ 0.1μF | RDER72A104K1K1H03B | 1 | ¥120 | 10個120円 |
SW1~4、RESET1 | タクトスイッチ(※1) | DTS-63-N-V-BLK(TS-0606-F-N-BLK | 5 | ¥15 | 代替品(DTS-63-F-N-V-RED(TS-0606-F-N-Rなど)でも可 |
U1 | ZIFソケット 40ピン | ULO-ZS431-40P1G | 1 | ¥250 | なくても可 |
(※1) 4つのタクトスイッチは使用していない。接続しない場合は不要
(※2) I2C_J1,I2C_J2,I2C_J3は、拡張用なので使用しない場合は不要
(※3) 液晶の下に部品が配置されるので、高さ調整のため必須
PCBを発注すると、その代金もあわせて¥7,000円くらいあれば、おつりが来ます。
スペックから察するに、おそらく、雷探くん が、同じシステムで動いていると思われます。こちらは¥15,306します。雷をLEDとビープ音で知らせるようです。
・・・しまった、ブザーくらいつけられるようにしておけばよかった・・・
ソフトウェアの導入
Raspberry PI に、githubのbuildフォルダにある、AS3935APP.uf2を書き込んでください。
デバッグプローブを使用しても、USBから書き込んでも構いません。
書き込みが終わったらソフトウェアが起動しますが、初期状態では正しく動作しません。起動が完了したら、タイトルバー部分をタップし、設定画面に入り、次の設定を変更してください。
- I2Cアドレス デフォルトは3です。秋月電子のモジュールは、I2Cアドレスが0のものと、3のものがあります。使用しているモジュールにあわせて変更します。
- ネットワーク設定 WIFIを有効にし、SSIDとパスワードを環境にあわせて変更してください。
変更方法の詳細は、ソフトウェア詳細を参照してください。
ソフトウェア詳細
使用しているライブラリ
グラフィック液晶ライブラリ
Rapberry PI Pico 用 ILI9341 TFT液晶 日本語ライブラリ
使用方法
プログラムが起動すると、初期化画面⇒監視画面へと進みます。監視画面から操作を行うと設定画面に移行します。
初期化画面
起動すると、最初に初期化画面が表示され、初期化の状況が表示されます。初期化が終わると自動的に次に進みます。
初期化される項目は次の通りです。初期化中の状態を確認し、×がある場合には問題を確認してください。
- AS3935
- WIFI初期化
- WIFI接続
- タイムゾーン取得
- AS3935 のキャリブレーション
初期化中に、スクリーンをタッチし続けると、設定を初期化できます。設定がわからなくなってしまった時などに使用します。
監視画面
監視画面では時計が表示されます。雷を検知すると、画面に時刻、発生源と雷雲までの概算距離が表示されます。
画面最上部の、Wifiアイコンをタップすると、設定画面に移動します。

表示される内容
時刻
時刻が12時間表記/24時間表記で表示されます。右側には、秒を示す赤いランプが表示され、動作中であることを示して点滅します。15秒ごとに1/4ずつ点灯するので、大まかな秒数がわかります。12時間表示にしたときは、その上にAM/PMを示すランプが点灯します。
最新の検出情報
検出した日時、発生源、距離、強さが表示されます。
発生源は次のいずれかになります。
- なし … 信号が存在しません。予期しない誤検出です
- 雷 … 雷雲を検出しました。雷雲までの距離が表示されます
- 距離超 … 雷雲を検出しましたが距離が遠すぎます
- 距離0 … 雷雲を検出しましたが距離がゼロです
- 誤信号 … 蛍光灯やモーターなどにより誤検出が発生しました。距離はーーーとなり表示されません
- 雑音多 … ノイズが多すぎて発生源を特定できません。NOISEFLR ノイズ下限水準を調整してください
距離は実際に落雷があった場所までの距離示すものではありません。統計的に、雷雲の先端と現在位置の距離を算出したもの、だそうです。算出方法についてはドキュメントに記述がありません。
強さは、AS3935モジュールが内部で計算に使用した値で、単位を持たない数字です。
検出履歴
最新の検出結果が8件まで表示されます。表示される内容は時刻、距離、強さです。
設定画面
設定画面では、アプリケーションの各種設定を行うことができます。メニューは階層に別れています。
メインメニュー
├── システム設定
├── AS3935設定
├── ネットワーク設定
└── タッチパネルの調整
├── タッチの調整
└── タッチのテスト
メインメニュー

- システム設定 … 時刻表示や現在日時の設定を行います
- AS3935設定 … AS3935の各種パラメータを変更します。変更した後は再起動が必要になります。
- ネットワーク設定 … WIFIの設定を行います。
- タッチパネルの調整 … タッチパネルのキャリブレーションを行います。タッチ位置がずれていると感じたときに調整を行ってください。
システム設定

- 時刻表示 … 12H/24Hの切り替え。タップすると12時間表示と24時間表示が切り替わります。
- 日時 … YYYYMMDDHHmmSS の形式で、現在時刻を指定します。たとえば2025/7/1 20:05:00 の場合、20250701200500 と入力します。
- デバッグ … ターミナル(TERM)となし(----)、を切り替えます。ターミナルを指定すると、実行状況がシリアル出力されます。シリアルポートはUART0で、GPIO0がTX、GPIO2がRX、ボーレートは115200です。
AS3935設定
ここでは、雷センサーに関する設定を行います。i2Cアドレスと読み込み方法の他は、主に雷センサーの感度調整や、ノイズの除去に関する設定です。

- I2C addr … I2Cアドレスを指定します。1~3が指定できます。デフォルトは3です。秋月電子のAE-AS3935は初期ロットは0、後期ロットは3です。
- ReadMode … Single/Blockが指定できます。デフォルトはSingleです。SingleはI2Cリードを必要な場所ごとに分けて発行します。Blockは、すべてのレジスタを一回の読み込みで読み込みます。どちらを指定しても結果は同じです。Singleリードで正しく読み込めない場合、ブロックリードを指定します。ブロックリードをサポートしていないデバイスの場合Singleを指定します。
- GAINBOOST … AFE(アナログフロントエンド)のゲインブースト値を0~31で指定します。デフォルトは18(屋内)です
- NOISEFLR … ノイズ下限水準(ノイズフロアレベル)を0~7で指定します。デフォルト値は2です
- WATCHDOG … ウオッチドッグ閾値を0~10で指定します。デフォルトは2です
- MINLIGHT … 雷の最小検出数を、1、5、9、16で指定します。デフォルトは1です
- SPIKEREJ … スパイク除去設定を、0~11で指定します。デフォルトは2です
設定するパラメータの詳細は、AS3935のパラメータについてを参照してください。
ネットワーク設定
- WIFI … 有効/無効を切り替えます。デフォルトは有効です。無効にするとネットワーク機能が動作しなくなります。WIFIで接続エラーが出た場合、自動的にこの設定は「無効」に設定されます。
- SSID … 2.5GHzのSSIDを指定します。最大18文字です。
- PASSWORD … 指定されたSSIDのパスワードです。
タッチパネルの調整
タッチパネルのタッチ位置と、実際にポイントされる位置がずれている場合、このメニューから調整します。

- タッチスクリーンの調整 … タッチスクリーンの調整モードに入ります。調整モードに入ると終了するまで抜けることはできません。画面の左上、右上、右下、左下をそれぞれ10回ずつタップします。タップした位置に丸が表示されます。調整モード中は以前の「ズレた状態」で動作しています。結果として、タップした丸も「ズレ」て表示されますが、気にせずにタップを続けてください。
- タッチスクリーンのテスト ... タッチスクリーンのテストモードに入ります。タッチした位置に丸が表示されます。タッチ位置の調整後などに使用し、ずれている場合タッチスクリーンの調整を行ってください。
設定画面での文字入力
設定画面は、タップすると順番に切り替わっていく項目のほか、スクリーンにキーボードが表示される入力項目もあります。

文字入力
文字入力では、画面にQWERTY配列のキーボードが表示されます。また、入力する部分にはブロックの点滅(挿入モード)/下線(上書きモード)のカーソルが表示されます。カーソルの初期位置は文字列の末尾です。
キーボードの切り替え
キーボード右下にある、"aA@" と書かれたキーをタップすると、入力する文字を切り替えることができます。
特殊キー
キーボードにはいくつか特別な動作をするキーがあります。
- ENTERキー。曲がった矢印のキーです。入力内容を決定するときに使用します
- DELキー。カーソルのある位置の文字を削除し右側にある文字を詰めます
- BSキー。カーソルのある位置の前の文字を削除します
- ESCキー。入力を中止します
- INSキー。挿入モードと上書きモードを切り替えます
- 左右キー。カーソルを左右に移動させます
数字入力
日時の入力や、AS3935のパラメータなど、数字だけを受け付ける場合、テンキーパッドが表示されます。
テンキーパッドが表示される場合、入力は常に上書きモードになり、カーソルは最初の1文字に配置されます。例えば、02という値を03にしたい場合、そのまま「0」「3」と値を上書き入力してください。
AS3935のパラメータについて
AS3935では、環境にあわせて設定可能なパラメータが複数存在します。下の図は、AS3935のブロックダイアグラム(データシート3Page/Fig 2) です。

INP・INNから入った信号は、①AFE(アナログフロントエンド)で増幅され、②でノイズ下限のチェックを行います。同時に、③のウオッチドッグは信号を監視し、条件を満たすと④の信号評価に伝えます。 信号評価では、評価アルゴリズム(非公開)に基づき、信号が本当に雷かを判断します。
AS3935では、制御レジスタを通じて、この①~④までで使われる値を調整できます。
AFEゲインブースト
①のAFE(アナログフロントエンド)のゲインブースト値を0~31で指定します。デフォルトは18(屋内)です。屋外で使用する場合は14を指定します。
AFEは、雷検知のためのアンテナから受信した500KHz±33Khzの狭い帯域の信号を増幅します。AFEの増幅は、このバンド幅の範囲において一定とみなせるようになっています。
値として、は、0~31が指定できますが、14と18で動作するように最適化されています。これ以外の値は指定しないほうが良いようです。
ノイズ下限水準
②の、ノイズ下限評価で使用される、ノイズ下限水準(ノイズフロアレベル)を0~7で指定します。デフォルト値は2です。
AS3935は、入力された信号からノイズの出力を測定し、ノイズ下限水準と比較します。入力信号のノイズレベルが、ノイズ下限水準を超えると、IRQを使用して、ユーザーに通知します。今回のプログラムでは、画面に「雑音多」と表示されます。
ノイズフロアレベルを0~7に指定すると、実際はAFEの設定に依存して次のように決定されます。
ノイズフロアレベル値 | 屋内(AFE=18) μVrms | 屋外(AFE=18) μVrms |
---|---|---|
0 | 28 μVrms | 390 μVrms |
1 | 45 μVrms | 630 μVrms |
2 | 62 μVrms | 860 μVrms |
3 | 78 μVrms | 1100 μVrms |
4 | 95 μVrms | 1140 μVrms |
5 | 112 μVrms | 1570 μVrms |
6 | 130 μVrms | 1800 μVrms |
7 | 146 μVrms | 2000 μVrms |
ウオッチドッグ閾値
ウオッチドックが雷検出信号と判断する強さの閾値を、0~10で指定します。デフォルト値は2です。
③のウオッチドッグは、①のAFEから出力された信号を監視し、ウオッチドッグ閾値で指定された強さを超えたとき、内部的に、その信号を「雷検出の候補」として④の信号検証システムに通知します。ここで指定するウォッチドッグ閾値は、単位を持たない値です。
データシートの29ページ、Figure40に、ウオッチドッグ閾値と雷の距離の関係がグラフとして示されています。(スパイク除去設定が0の場合)
この値を小さくすると、雑音に対して弱くなりますが、遠くの雷のように、弱い信号に対して鋭敏になります。多きすると、雑音に対して強くなり誤検出が減りますが、遠くの雷には反応しなくなります。
たとえば、デフォルト値の2(0010)の場合グラフ上では水色の線で、40km離れた雷に対して約15%程度の反応を示します。これが最大値の10になるとグラフ上では赤い線となり、40km離れたの雷に対しては反応しなくなります。
スパイク除去設定
④の、信号検証では、スパイクの除去と最小検出数のチェックが行われます
スパイク除去設定では、人工的に起こされたランダムな衝撃波(ディスターバー)と、雷の波形をチェックして人工的な衝撃波を排除します。この時にチェックする厳密さを0~11で指定します。デフォルト値は2です。
データシートの32ページ、Figure42に、スパイク除去設定(SREJ)と雷の距離の関係がグラフとして示されています。(ウオッチドッグが0の場合)

この値を小さくすると、検出能力は高くなりますが、ディスターバーの除去性能は下がり、誤検出が多くなります。
値を大きくすると、逆に遠くの雷の検出能力は下がりますが、ディスターバーの除去性能は上がります。
デフォルト値の2の場合、40kmの雷に対して検出効率は約10%になっています。
最小検出数
④の、信号検証でのもう一つの要素が、最小検出数です。
最小検出数は、センサーが反応するのに必要な最小の検出数で、1,5,9,16が指定できます。(AS3935のレジスタ上では0~4に対応)
信号検証で雷が発生したと判断されても、過去15分間にここで指定された数以上のイベントが発生した場合にのみ、割り込み信号を発生させてコントローラ(今回の場合はRaspberry Pi PICO)に伝えます。
過去15分間に、ここで指定した数を超えると、それ以降は連続して割り込み処理が開始されます。たとえば、時刻0:00から、イベントが1分おきに発生したとします。最初のイベントは0:00です。その場合、次のようになります。
最小検出数の値 | 最初に割り込みが通知される時刻 | それ以降のイベントが発生する時刻 |
---|---|---|
1 | 00:00 | 00:01, 00:02, 00:03 … |
5 | 00:05 | 00:06, 00:07, 00:08 … |
9 | 00:09 | 00:09, 00:10, 00:11 … |
16 | なし | なし |
最小検出数が16の場合には割り込みが通知されないことに注意が必要です。イベントの発生間隔が1分おきの場合、どの時点をとっても、過去15分間に発生したイベントの数は高々15です。そのため、割り込みとして雷の発生が通知されることはありません。
それ以外の場合は、最初に割り込みが発生する時刻は異なりますが、それ以降の割り込み発生間隔はどれも一分間です。直近の15分間以内に、所定のイベント数が発生していれば、それ以降の動作はどれも変わりません。
プログラムの詳説
プログラムの入手
プログラムは GithubのAS3935APPプロジェクトページで公開されています。
重要なクラス名とファイル
プログラムを読む上で、重要な機能を持つクラスとファイルは次の通りです。
メインプログラムと管理
main 関数(AS3935APP.cpp)
システムのメインループです。初期化処理を行った後、メインループに入り、AS3935の信号を監視したり、画面のタッチを監視し、適切な処理に振り分けます。
Settings (Settings.h / Settings.cpp)
設定値を保存してプログラム全体からアクセスさせます。また、設定画面の処理ループを持ち、設定画面の表示もここで行います。
雷センサー関連
AS3935クラス(AS3935.h / AS3935.cpp)
雷センサーの制御やパラメータ調整、割り込み発生時の処理が行われます。初期化時にはキャリブレーション処理も行っています。このクラスは、I2CBaseクラスを親に持ち、I2C関連の処理は親クラスのI2CBaseで行っています。
I2CBase(I2CBase.h / I2CBase.cpp)
雷センサーの親クラスで、I2C通信の処理を行います。今後、I2Cデバイスが増えたらこのクラスのサブクラスとして実装していきます。
表示関連
mainDisplay関数 (AS3935APP.cpp)
メインループから呼びだされる、画面表示に関する関数です。状況にあわせて、時計を表示したり検出結果を表示したりします。
DispClock(DispClock.h / DispClock.cpp)
時計表示のためのビットマップ描画などを行っています。
ユーザーインタフェース
GUIEditBox (GUIEditBox.h / GUIEditBox.cpp)
画面にエディットボックスを表示し、ソフトウェアキーボードを有効にして表示されている文字列を編集可能にします。
GUIMsgBox(GUIMsgBox.h / GUIMsgBox.cpp)
ダイアログボックスを表示します。
ScreenKeyboard(ScreenKeyboard.h / ScreenKeyboard.cpp)
画面にキーボードを表示し、タッチされている場合はその文字を返します。キーボードは数字キーパッドと、QWERTYキーパッドがあります。
ネットワーク関連
InetAction (InetAction.h / InetAction.cpp)
Wifiアクセスポイントの接続から、SNTPの時刻取得など、ネットワーク関連の処理をここに集めています。
ヘルパー関数
FreqCounter(FreqCounter.h / FreqCounter.cpp)
指定したGPIOピンに入ってくるパルスの周波数を測定します。汎用性を持つプログラムで、特別なアプリケーション専用ではありません。
RingBuffer (RingBuffer.h)
FIFOの構造を持つリングバッファです。std::で実装したのですが、何かの理由で手書きに変えました。期待した操作が行われなかったためですが、理由を忘れました。
FlushMem (FlushMem.h / FlushMem.cpp)
PICOのプログラム領域の未使用部分を使って、そこにデータを書き込む関数です。設定値が書き込まれます。
プログラムの詳細
プログラムの詳細は、githubのDoxygen ドキュメントを参照してください。
右上の Rawボタンをクリックしてダウンロードし、解凍してから中にあるindex.htmlをダブルクリックします。

ライセンス
本プログラムはMITライセンスおよびAdafruitライブラリのライセンスに準拠します。