ラズパイPICO W_NTP_BME280_WBGT

iot

Raspberry pi pico W

ゴールデンウイークに突入し、まとまった時間ができたので、以前から構想を練り、ブレッドボードで試運転まで行っていた、多機能時計を完成させました。

実装した機能は以下の通りです

  • raspberry pi pico W でインターネットに接続
  • NTPサーバより時刻取得し、正確な時計機能
  • センサーBME280より、気温(室温)、湿度、気圧を表示
  • 取得した気温、湿度より、暑さ指数(WBGT)を近似式で計算
  • 暑さ指数(WBGT)に閾値を決め、閾値以上で赤色LEDが光る
KAZUHO
KAZUHO

多機能かな?市販の置き時計でもありそうだけど・・・

備忘録 & Githubに初めてコードをUploadしたので来歴補助簿に記します。

開発動機

同様の時計は以前、RTC DS1307を使って作成していましたが、結構時刻のずれが結構あり、あとは完全にバグフィックスができず、時計にも関わらず止まってしまうので(笑)、新たな多機能時計作成を以前より検討していました。

やはり、時計なので正確な時刻は欲しいので、GPSを使うか、NTPを使うかで悩んでいましたが、WiFiモジュールを積んだ、PICO W が発売されたので、手軽く作れそうなNTPを使う方法を選択。

Network Time Protocol(ネットワーク・タイム・プロトコル、NTP)は、パケット交換による遅延時間が変動するネットワーク上のコンピュータシステム間で時刻同期させるための通信プロトコルである。1985年以前から運用されており、現在使用されている中で最も古いインターネットプロトコルの1つである。

wikipediaより引用

構成

出来上がりは、以下の見た目です。

右下の縦に刺さっているセンサーがBME280です。

回路図らしき図面は以下の通り。Drawioで書きました。

Raspberry pi pico W

Raspberry pi pico Wは2023年3月ごろ発売され、以前秋葉原で購入していました。WiFiでLチカできること確認したら、ずっとお蔵入りしていました。もちろん技適マーク付きを購入しています。

ネットワークにつなげることができるので、時刻をNTPサーバから取得することをもくろみ、先ずはWebを読み漁り、先人のお知恵を拝借して、MicroPythonでコードを書き、ブレッドボードで試作品を作成しました。

ブレッドボードで仮組した試作品
KAZUHO
KAZUHO

コードを書いたぁ?そんな高度なことはしていないでしょ!!

拝借して、つなぎ合わせただけだろ!!

BME280

今回センサーで用いた、BME280はベランダ百葉箱でも使っており、なじみのあるセンサーです。

ただ今回はつまずきました。理由は不明ですが、ベランダ百葉箱では、BME280基板のJ3をジャンプせずとも、I2Cで使えたのですが、今回はちゃんとJ3をジャンプしないとI2Cでは通信できませんでした。あと、J1(SDA) / J2(SCL)もジャンプをしてプルアップしないと、I2C通信が不安定な状態になり、まれにETIMEDOUTが発生して止まってしまいます。
J1 – J3のはんだジャンプですが、めちゃくちゃ小さい箇所にはんだをするので、老眼の目では全く見えませんでした(笑)

BME280の製品詳細は以下のリンク参照。

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

LCD2004A

液晶キャラクターディスプレイでラズパイ工作では、16文字X2行の 1602Aが定番です。今回は時刻や気温、暑さ指数(WBGT)を表示させたく、20文字X4行の2004Aを用いました。I2Cで使いたかったので、I2CシリアルIFモジュール (PCF8574T)でI2C通信しています。

ただ、本来は5V駆動のLCDをPICO Wの3V3(OUT)を使って駆動させていますので、電圧不足の状態で使っていますが、何とか普通に動いています。本来はダメな使い方とは思いますが、動いているので目をつぶっています(笑)

正しい使い方は、秋月電子等で購入できる、3.3V/5VのレベルコンバータモジュールPCA9306使う必要があるようです。図面に起こすと、以下の通りかな?

LCD1602A / LCD2004Aの詳しい解説は以下のページ参考にさせてもらいました。

赤&緑 LED

赤 / 緑のLEDはWBGT(暑さ指数)が28を超えたら、熱中症注意の意味を込めて、赤が光るようにしています。WBGTが28未満であれば、緑が光ります。

220Ωの抵抗は、LEDの明るさを落とすために入れています。

コード

コードはいつも通り、MicroPythonを使っています。

初めて、Githubにコードを上げてみましたので、興味のある方は以下ご覧ください。

GitHub - KazuEgu/NTP_BME280_WBGT
Contribute to KazuEgu/NTP_BME280_WBGT development by creating an account on GitHub.

動作解説

コードの解説ですが、自分で書こうと思いましたが、chatgptにコードを読ませて、”解説して”とお願いをしたら、以下の説明が生成されました。(若干加筆しています)

KAZUHO
KAZUHO

もしかして、要件定義を正しく、簡潔に書ければ、chatgptのほうが美しいコード書いてくれそうですね。

このコードは、マイコンを用いて、温度、湿度、気圧、WBGT(暑さ指数)を計測し、LCD画面に表示するためのものです。以下に各部分の概要を説明します。

1. 必要なモジュールをインポートします。
2. LEDの設定を行います。
3. BME280センサーの設定を行います。
4. LCDディスプレイの設定を行います。
5. ネットワーク接続のクラスを作成します。SSIDとパスワードを指定し、ネットワークに接続します。
6. HTTPリクエストを送信するメソッドを作成します。
7. NTPサーバーから時刻を取得するメソッドを作成します。
8. ネットワークに接続します。
9. オープニングメッセージをLCDに表示します。
10. NTPサーバーから時刻を取得し、RTCに設定します。
11. カウンターをリセットします。
12. 温度、湿度、気圧を読み取り、WBGTを計算し、LCDに表示します。
13. 時刻と日付を表示します。
14. JSTの秒数が30の倍数になったら、温度、湿度、気圧、WBGTを更新します。
15. WBGTに基づいて、赤色または緑色のLEDを制御します。
16. LEDを点滅させます。
17. カウンターが100になったら0にします。
18. カウンターをインクリメントします。(カウンターを一つ増やす)

このコードは、温度、湿度、気圧、WBGTを計測し、LCDに表示するためのものです。ネットワークに接続して、NTPサーバーから時刻を取得し、RTCに設定します。温度、湿度、気圧を定期的に読み取り、WBGTを計算して、LCDに表示します。また、WBGTの値に応じて、LEDを制御します。

ちょっとchatgptの解説にちょっと補足。

9. オープニングメッセージをLCDに表示します。
オープニングメッセージにはPICO W の IPアドレスを表示するようにしています。

10. NTPサーバーから時刻を取得し、RTCに設定します
時刻は、UTCとJSTの両方を取得しています。表示もJST / UTCの両方をLCDに表示させています。
また、曜日も計算しており、LCDの日付には曜日表示も行っています(JST)。

16. WBGTに基づいて、赤色または緑色のLEDを制御します。
閾値は28にしています。28以上で赤色LEDが点灯します。28未満の場合、緑色LEDが点灯します。

17. LEDを点滅させます。
PICO W 本体のLEDで点滅させることにより、動作表示灯の代わりにしています。

カウンターを使っているのは、Thonny の Shellで動き続けていること見た目で確認するためです。

実は、Bug Fixは今回はchatgptに頼りました。サクサク直してくれるので、驚きでした。

NTPサーバ

NTPサーバは国立研究開発法人情報通信研究機構 の ” ntp.nict.jp ” を使わせてもらっています。定時にアクセスして自動的に時刻補正もできますが、公共のNTPであることも鑑み、時計の電源を入れた際に一回だけ、NTPサーバより時刻情報を取得する方法としました。

すなわち時刻補正は、時計の電源を一回切る必要があります(笑)

まとめ / 雑感

久々に電子工作してみました。何を感じたかというと、やはり老眼の進行です。はんだ付けする際は老眼鏡必須であること、再認識しました。

あとchatgptの偉大さを今回改めて感じました。webから集めた先人の知恵を拝借しコード書きましたが、TYPO、Bug Fixや追加機能の実装等は、定義を明確に書けば、すらすらとコードを生成&修正してくれる点に脱帽でした。

コードを見てもらうと、似たようなコードの部分の表記が違う点が多々あります。美しいコードの部分がchatgptが直してくれて部分になります。

生成AIとは、仕事でも、趣味でも上手に付き合うことは、今後必須になりそうですね。

コメント

タイトルとURLをコピーしました