雷モニター

AS3935雷センサを使った、雷モニターを作ってみました。

AS3935はAMS社の雷センサーで、落雷や雲間放電で発生した信号を小型バーアンテナで受信し、独自のアルゴリズムによって雷雲までの距離や雷のエネルギーを判定します。雷の発生を検知すると内部レジスタにデータが記録され、マイコンからデータを呼び出すことによって雷雲の発生や動きを知ることができます。雷雲までの距離は直上から40km、雷のエネルギーは相対値で得られます。

センサは、秋月電子通商から発売されている「雷センサーモジュール」を使用しました。

AS3935使用 雷センサーモジュール: 計測器・センサー・ロガー 秋月電子通商-電子部品・ネット通販
電子部品,通販,販売,半導体,IC,LED,マイコン,電子工作AS3935使用 雷センサーモジュール秋月電子通商 電子部品通信販売

このモニターを作るきっかけは、卓上に正確な時計が欲しいと思い、ESP32からWiFi経由でNTPと時刻を同期し、LCDに表示させようと思ったところから始まりました。
手元にあったLCDは、20文字×4行のタイプだったので、時計を表示しただけではスペースが余りました。このため、BME280を使って温湿度などの室内環境を表示させましたが、まだスペースが余っています。何か無いかとストックを探したところ、以前購入してお蔵入りしていたAS3935を発見!これを使ってみようということになりました。

BME280は、スイッチサイエンスさんの「BME280搭載 温湿度・気圧センサモジュール」を使いました。

BME280搭載 温湿度・気圧センサモジュール
BME280搭載の環境センサモジュール。温度、湿度と気圧を測定可能。

AS3935は、内蔵しているバーアンテナのチューニングが必要な様で、初期化の際にこれを実行するルーチンが必要になります。Arduinoのデモプログラムなどを参考に、初期化ルーチンを作りました。
評価用デモソフトウエアが秋月電子通商さんのHPにアップされています。)

この動画は、自動チューニングの様子をLCDに表示したところです。

インターフェイスはI2Cなので、BME280と一緒に接続しています。また、I2Cのプルアップ抵抗は雷センサーモジュール上に実装済なので、回路上には設けていません。
LCDは、秋月電子通商さんの3.3V動作版の「SC2004CSWB-XA-LB-G」を使っています。3.3V版なので、レベル変換無しで使えます。

3.3V動作LCDキャラクタディスプレイモジュール 20×4行 白色LEDバックライト付: オプトエレクトロニクス 秋月電子通商-電子部品・ネット通販
電子部品,通販,販売,半導体,IC,LED,マイコン,電子工作3.3V動作LCDキャラクタディスプレイモジュール 20×4行 白色LEDバックライト付秋月電子通商 電子部品通信販売

回路図、部品配置図は、以下のとおりです。回路上に、”UART”のソケットが2つありますが、ここでは使っていません。

回路図
部品配置図

雷センサーモジュールは、雷を検知すると「IRQ」のレベルがLからHに変わります。雷が検知されたことをESP32に知らせるため、ESP32の15番ピンに接続してプログラム中で監視しています。
IRQがHになると、reg3の値を見て雷なのかを判断しています。reg7が雷までの距離、reg4,reg5,reg6に相対エネルギーがセットされます。相対エネルギーは、21ビットで表現される様なので最大210万弱くらいの値になるかと思います。

Arduino IDEで作成したプログラムは、以下のリンクにアップしておきます。良かったら、試してみてください。
バグが残っているかもしれません。ご容赦ください。
(Thunder.zip ⇒ 解凍 ⇒ Thunder.txt ⇒ Arduino IDEにコピー)
https://drive.google.com/file/d/1ZHeHDCecaIepKsCfMcQNZagbR6Tb03Sh/view?usp=sharing

プログラムには、経時変化をグラフ化するため、RaspberryPiにUDPでデータを送信する機能を含んでいますが、RaspberryPiが無くても動くと思います。(ネットワークに多少の負荷はかかりますが…)


作成したデバイスでだけでも、現在時刻、温湿度・気圧、最新の雷の検知状況はモニターできますが、雷雲の接近状況、温湿度、気圧の変化はわかりません。
データを可視化するため、測定値をRaspberryPiに送りWevサーバー上でグラフ化することをやってみました。

RaspberryPiにWebサーバーをインストールして、CGIなどを使える様に設定する部分はここでは割愛させていただきます。色々なサイトでご紹介されていますので、参考にされてください。
このサイトでも公開したいと思いますので、少しお待ちください。

全体のブロック図は、以下のとおりです。
RaspberryPiには、固定IPアドレスを設定してあります。ESP32は、RaspberryPiの固定アドレスに向けて、UDPでデータを送ります。データ形式は、扱いが簡単になるので、JSON形式にしています。
RaspberryPi上のWebサーバー(Apache2)にPC、スマホなどからアクセスすることで、データをグラフ化して閲覧できます。

おそらく、データの受信からHTMLの作成までをPython、Javaなどのプログラムで一本化できるのだと思いますが、知識が乏しいのでそれぞれの機能を色々な言語を駆使して作っています。

まず、ESP32から送られてくるデータを受信して、Webサーバーでグラフ化できるようにデータをCSV形式で保存する部分です。言語は、Pythonで書いています。ディレクトリ、ファイルなどのパーミッションの設定に気を付けてください。

import socket
import time
from contextlib import closing
import json
from datetime import datetime

UDP_IP = '0.0.0.0'
UDP_PORT = 9000  # 受信ポート
Json_File_Path ="/home/pi/weather/DATA"
Data_File_Path ="/var/www/html/weather/data"

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
sock.bind((UDP_IP, UDP_PORT))

with closing(sock):
    while True:
        data, addr = sock.recvfrom(1024)
        str_data = data.decode("utf-8", errors="ignore")
        json_data = json.loads(str_data)
        dt_now = datetime.now()
        print (str_data)
        File_Name = Json_File_Path + "/" + dt_now.strftime('%Y-%m-%d') + ".dat"
        Csv_File = Data_File_Path + "/" + dt_now.strftime('%Y-%m-%d') + ".csv"
        save_data ="{0},{1},{2},{3},{4},{5},{6}\n".format(json_data['DATE'], json_data['TIME'], float(json_data['TEMP']), float(json_data['HUM']), int(json_data['PRESS']), int(json_data['DISTANCE']), int(json_data['ENERGY']))
        file = open(File_Name, 'a')
        file.write(str_data+"\n")
        file.close()
        file = open(Csv_File, 'a')
        file.write(save_data)
        file.close()
        #if json_data['ID'] != "Server":
        time.sleep(1)

ここでは、UDPのポートに”9000″を使っています。ESP32のプログラムでも、24行目で”9000″を設定しています。このポート番号が一致しないとデータを受信できないので、同じ番号を指定してください。また、他の機器でポートを使っている場合は、重複しないように気を付けてください。
ESP32から送られて来るデータは、念のためディレクトリ”/home/pi/weather/DATA”に保存しています。グラフ化に必要なデータは、ディレクトリ”/var/www/html/weather/data”にCSV形式(カンマ区切り)で保存します。

データの閲覧は、SSIを埋め込んだページにアクセスします。このため、拡張子が”.shtml”になります。このページには、cssと現在時刻を表示するためのJavaプログラムが書いてある程度で、ほとんど何もしていません。
最後の方にある”<!–#exec cgi=”./cgi-bin/weather.cgi”–>”で、perlで書いたCGIを呼び出しています。

http://192.168.0.200/weather.shtml

perlで書いたCGIでは、CSV形式で出力されたデータを読込み、グラフ毎のデータファイルを出力します。その後、HTML文を順次出力する内容です。
ページ上段には、雷の検出状況のほか、最新データを数値と、ゲージ形式で表示します。ゲージは、”Google Charts”を使っています。下段には、温度、湿度、気圧、雷(距離、相対エネルギー)の推移をグラフで表示します。グラフは、Dygraphを使っています。

HTML、CGIなどは長くなるので、セットでこちらにアップします。良かったら、お使いください。3日間推移、7日間推移、データ検索のリンクがありますが、プログラム類のアップは割愛させて頂きます。個別に対応しますので、興味のある方はご連絡ください。
手元の環境では問題なく動作していますが、バグなどについてはご容赦ください。

自分は、落雷による無線機の破損が怖いので、アンテナケーブルを外す目安に活用したいと思いますが、ゴルフや、キャンプ、農作業など、屋外の作業にも役に立つかもしれません。もし良かったら、作ってみてはいかがでしょうか

動画もアップしていますので、ご覧いただけると嬉しいです。

コメント

PAGE TOP