2つの異なるLEDの発光パターンを
制御する必要があるな。
M5StickC Plusに接続するコネクタを変えて
個別に制御しないとな。
ことが多い。。。
うまく組み合わせて製作していこう!
すけろく ううー行きたい。行きたい。 でも、時間がない~(泣) げんろく そんなに気落ちしてどうしたのだ? すけろく 仕事やら家事やら、忙しくて・・・ 行けそうでも天気が悪く[…]
今回はIKEAのマグネット缶「GRUNDTAL グルンドタール」を使ったお天気グッズのプログラミング製作過程について記載します。
どんな機能をプログラムするか
今回製作するプログラムは、以下の機能を盛り込みたいと思います。
- 1時間毎に、お天気情報をネット取得してディスプレイに表示する
- 時間帯(朝、昼、夜)によって、天井用LEDの色と発光数など変える
- 焚き火用LEDを、燃えているように見せる
1時間毎に天気情報を更新
天気情報を、「OpenWeather」というインターネットサイトから取得し、画面にアイコンと天気情報を表示させます。
プログラム方法については、下記の記事でご紹介していますので、そちらをご覧ください。
天気情報の取得、表示方法は、次の記事で紹介しています。
すけろく 前回作ったお天気表示プログラムは なかなか、評判が良いな。 げんろく うれしいな。 ただ、お天気情報は起動時のみ取得というところが 課題だ。 げんろく 今回は、1[…]
時間帯による天井LEDの発光制御
現在時刻を複数の時間帯に分けて、時間帯ごとに天井に取り付けたLEDの発光数、色を変化させます。
天井用LEDは、NeoPixelというAdafruit社のLEDを使ったLEDストラップになります。
ライブラリのインストールは、次の記事で紹介しています。
本記事は、Arduino IDE 1.8.xバージョンのライブラリ管理方法を紹介した記事です。 Arduino IDEは、より新しいバージョン「2.0.x」が発表されています。 機能がよりリッチになった「Ardu[…]
LEDストラップは、15個のLEDを実装していますので、時間帯ごとの発光パターンは以下のようにしました。
※1は点灯、0は消灯になります。
int Led_unit_0to6[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 0-6時:LED点灯状態 int Led_unit_7to8[] = {1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 7-8時:LED点灯状態 int Led_unit_9to10[] = {1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 9-10時:LED点灯状態 int Led_unit_11to12[] = {1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}; // 11-12時:LED点灯状態 int Led_unit_13to14[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}; // 13-14時:LED点灯状態 int Led_unit_15to16[] = {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0}; // 15-16時:LED点灯状態 int Led_unit_17to18[] = {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0}; // 17-18時:LED点灯状態 int Led_unit_19to20[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1}; // 19-20時:LED点灯状態 int Led_unit_21to22[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}; // 21-22時:LED点灯状態 int Led_unit_23[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; // 23時:LED点灯状態
また、発光色と輝度を以下のように時間帯によって変えています。
{"ORANGE", 212, 95, 17}, // 7-8時および17-18時用(朝焼け、夕焼け) {"YELLOW", 255, 245, 97}, // 9-16時までの時間帯向け {"DARCGRAY", 126, 126, 126}, // 19-23時までの時間帯向け(月明り) ※0時から6時までは点灯しない。
「Adafruit NeoPixel」ライブラリは次のように記載して使用します。
①宣言部
#include <Adafruit_NeoPixel.h> // LED 制御ライブラリ // M5 LED BAR 制御用 const uint8_t LED_BAR_PIN = 32; // LED制御信号用(G32):M5StickC Plus(HY2.0コネクタ時) const uint8_t LED_BAR_COUNT = 15; // 制御対象のLED数 Number of LEDs to be controlled. const uint8_t LED_BAR_BRIGHTNESS = 96; // 輝度 Adafruit_NeoPixel LED_BAR_pixels(LED_BAR_COUNT, LED_BAR_PIN, NEO_GRB + NEO_KHZ800); // LEDBAR制御インスタンス生成
②Setup関数部
// NeoPixel 初期化(M5 LED BAR) LED_BAR_pixels.begin(); LED_BAR_pixels.show(); // Turn OFF all pixels ASAP LED_BAR_pixels.setBrightness(96); // Set BRIGHTNESS to about 1/5 (max = 255)
③発光パターン指定時
LED_BAR_pixels.setPixelColor(LED番号, LED_BAR_pixels.Color(0, 0, 0)); // LED番号と色を指定 LED_BAR_pixels.setBrightness(0) // 輝度を指定 LED_BAR_pixels.show(); // LEへ制御信号送信
焚き火LEDの制御
焚き火用のLEDも、Adafruit社のLEDを使いますので、「Adafruit NeoPixel」ライブラリを使用できます。
ライブラリのプログラムの書き方については、前述の天井用LEDのものと同じように記述します。
※天井用のものとは別のインスタンスを生成して制御します。
焚き火は、火がちらちらと燃えるので、LEDをチカチカさせています。
やり方としては、Loop関数の中で、乱数を2つ発生させ、色と輝度をその乱数によって変更するようにしています。
天気情報の毎時更新と、LED制御プログラムを作る
それでは、実際にプログラミングしてみましょう。
これまで他の記事で紹介した、以下のライブラリを使います。
- 画面描画用ライブラリ:「Adafruit GFX Library」、「Adafruit ST7735 and ST7789 Library」
- LED点灯用ライブラリ:「Adafruit NeoPixel」
OpenWeatherからの天気情報取得を「M5StickC Plus」起動時および、毎時1回に取得します。
また、時間ごとに天井用LEDの発光パターンを変え、焚き火用LEDをチカチカさせます。
OpenWeatherのサブスクリプション条件によって、課金対象となる可能性があるので注意してください。
ライブラリを追加する
今回使うライブラリ「Adafruit ST7735 and ST7789 Library」と「Adafruit GFX Library」「Adafruit NeoPixel」をインストールします。
※当ブログでプログラムした際のバージョンは以下の通りです。
- 「Adafruit ST7735 and ST7789 Library」:「1.9.3」
- 「Adafruit GFX Library」:「1.11.1」
- 「Adafruit NeoPixel」:「1.10.5」
ライブラリのインストールは、次の記事で紹介しています。
本記事は、Arduino IDE 1.8.xバージョンのライブラリ管理方法を紹介した記事です。 Arduino IDEは、より新しいバージョン「2.0.x」が発表されています。 機能がよりリッチになった「Ardu[…]
時刻同期のためのWi-Fi接続設定
今回のプログラムではWi-Fi接続や時刻同期が必要です。Wi-Fiアクセスポイントへの接続方法や、時刻同期については次の記事で紹介している内容を使って行います。詳細は記事を参照してくださいね!
Wi-Fi接続の方法は、次の記事で紹介しています。
すけろく なんか、M5StickCが「在庫なし」になっている。 げんろく ああ、新しい「M5StickC Plus」が出たからな。 旧版は在庫限りになっているのだろう。 すけろく[…]
すけろく M5StickC Plusの大まかな違いは分かった。 WiFi接続をしてみるか。 げんろく そうだな。 M5StickCと同じように使えるのか確認してみよう。 この記事では、M5[…]
すけろく 前回はWiFi接続することができた。 次は時刻同期がしたいな。 げんろく たしかに。時刻同期は基本だからな。 以前M5StickCでやったプログラムをベースに 実装してみ[…]
OpenWeatherからJSONデータを取得する方法
今回のプログラムでは、天気情報の取得も必要になります。データ取得にはHTTP通信が必要になります。
OpenWeatherからの情報取得方法や、HTTP通信時の証明書を記載する方法については、次の記事で紹介しています。詳細は、記事を参照してください。
JSONデータの取得やHTTP通信の方法は、次の記事で紹介しています。
すけろく 普段、何気なくブラウザでインターネットサイトを 見ているが、URLの最初のHttpsとはなんだ? げんろく httpsはHttpの通信を暗号化して行うものだ。 ちょっと違いを押さえてみるか[…]
すけろく 前回の記事でJSON形式データは取り扱うことができた。 これでインターネットにあるサービスを活用できるな。 げんろく そうだな。 今回は天気情報を提供しているサイトからJSON形式データを[…]
天気毎時更新とLED制御プログラム
Arduino IDEを起動して、「ファイル」メニューから「新規ファイル」を選択し、表示されるスケッチに以下のように記述します。
Arduino IDE スケッチ例
(1)メインプログラム
①Wi-Fi接続のSSID、パスワード(Wi-Fi設定を「M5StickC Plus」へ保存済みの場合は編集不要)
②OpenWeatherのAPIキーと緯度、経度
③OpenWeatherのルート証明書(スケッチ例では、「”Please correct it to the value that suits your environment.”」と記載しています)
(2)アイコン画像定義ファイル
M5StickC Plusへの書き込み
- 「ファイル」メニューから「名前を付けて保存」で任意の名前を付けて保存します。
- 「ツール」メニューから「ボード」情報を確認し、M5StickC Plusであるか確認します。
この際、「シリアルポート」にマイコンを接続したCOMポートが指定されているかも確認します。 - 「ツール」メニューから「Patition Scheme」を「”No OTA(Large APP)”」にします。
※ここを変更しないと、スケッチが大きいというエラーになります。 - 「ツール」メニューから「シリアルモニタ」を選択してシリアルモニタを起動します。
- 「スケッチ」メニューから「マイコンボードに書き込む」を選択します。
プログラム実行結果
M5StickC Plusのディスプレイに以下のとおり表示され、LEDが制御されれば成功です。
※アイコン画像は、ご自身で設定したものになっています。
テストに使用している回路基板は、次の記事で紹介しています。
回路基板の製作方法は、次の記事で紹介しています。
すけろく CAMP-CANに搭載するLEDを光らせるためには、 電力と、制御信号が必要だな。 げんろく 冴えているな。 そのとおり。 すけろく M5StickC PlusでL[…]
また、シリアルモニタには次のように表示されます。
Connecting to ”Wi-Fi接続先のSSID” .... WiFi connected IP address: 192.xxx.xxx.xxx NTP : ntp.jst.mfeed.ad.jp RTC 2022-06-02 11:01:51 https://api.openweathermap.org/data/2.5/weather?lat=35.6828&lon=139.759&units=metric&lang=ja&appid=API-Key [HTTPS] begin... [HTTPS] GET... [HTTPS] GET... code: 200 {"coord":{"lon":139.759,"lat":35.6828},"weather":[{"id":803,"main":"Clouds","description":"曇りがち","icon":"04d"}],"base":"stations","main":{"temp":18.27,"feels_like":18.03,"temp_min":17.1,"temp_max":18.88,"pressure":1012,"humidity":72},"visibility":10000,"wind":{"speed":4.63,"deg":50},"clouds":{"all":75},"dt":1654654467,"sys":{"type":2,"id":268395,"country":"JP","sunrise":1654629905,"sunset":1654682101},"timezone":32400,"id":1861060,"name":"日本","cod":200}. Get OpenWeather json data 11:23:01 https://api.openweathermap.org/data/2.5/weather?lat=35.6828&lon=139.759&units=metric&lang=ja&appid=API-Key [HTTPS] begin... [HTTPS] GET... [HTTPS] GET... code: 200 {"coord":{"lon":139.759,"lat":35.6828},"weather":[{"id":803,"main":"Clouds","description":"曇りがち","icon":"04d"}],"base":"stations","main":{"temp":18.27,"feels_like":18.03,"temp_min":17.1,"temp_max":18.88,"pressure":1012,"humidity":72},"visibility":10000,"wind":{"speed":4.63,"deg":50},"clouds":{"all":75},"dt":1654654467,"sys":{"type":2,"id":268395,"country":"JP","sunrise":1654629905,"sunset":1654682101},"timezone":32400,"id":1861060,"name":"日本","cod":200}
編集後記
いかがだったでしょうか。
これで、キャンプ感のあるお天気グッズのプログラム部分は完成しました!
組み込むのが楽しみですね!今回の記事は以上になります。
最後までご覧いただきありがとうございました。
今回使用したマイコンはこちら!
Aruduino で開発できます。