注目キーワード

Case:03-CAMPCAN- IKEAのマグネット缶と3Dプリンタでキャンプ感あふれるお天気グッズを製作(Arduino:M5StackC Plus)

すけろく
今回作っているお天気グッズには、
2つの異なるLEDの発光パターンを
制御する必要があるな。
げんろく
たしかに。
M5StickC Plusに接続するコネクタを変えて
個別に制御しないとな。
すけろく
他にもお天気表示などやらねばらない
ことが多い。。。
げんろく
他の記事で紹介してきたプログラムの作り方を
うまく組み合わせて製作していこう!
この記事は、「-CAMPCAN- キャンプ感あふれるお天気グッズ」の製作記事です。
まとめと概要は次の記事で掲載しています。
関連記事

すけろく ううー行きたい。行きたい。 でも、時間がない~(泣) げんろく そんなに気落ちしてどうしたのだ? すけろく 仕事やら家事やら、忙しくて・・・ 行けそうでも天気が悪く[…]

今回はIKEAのマグネット缶「GRUNDTAL グルンドタール」を使ったお天気グッズのプログラミング製作過程について記載します。


IKEA GRUNDTAL 小物入れ 3 ピース
IKEAで販売されているステンレスの缶です。上蓋が透明になっていて、中が見えます。裏側にはマグネットがついていて、冷蔵庫などの金属部分にピタッと引っ付きます。いろいろ使えて便利です。
Amazonで確認

 

 

製作する「お天気グッズ」のデザインは次の通りです。
中央の下部にあるディスプレイにお天気情報を毎時表示すること、天井と焚き火のLEDを個別に制御するためのプログラムを作る必要があります。

どんな機能をプログラムするか

今回製作するプログラムは、以下の機能を盛り込みたいと思います。

  • 1時間毎に、お天気情報をネット取得してディスプレイに表示する
  • 時間帯(朝、昼、夜)によって、天井用LEDの色と発光数など変える
  • 焚き火用LEDを、燃えているように見せる

1時間毎に天気情報を更新

天気情報を、「OpenWeather」というインターネットサイトから取得し、画面にアイコンと天気情報を表示させます。

プログラム方法については、下記の記事でご紹介していますので、そちらをご覧ください。

天気情報の取得、表示方法は、次の記事で紹介しています。

関連記事

すけろく 前回作ったお天気表示プログラムは なかなか、評判が良いな。 げんろく うれしいな。 ただ、お天気情報は起動時のみ取得というところが 課題だ。 げんろく 今回は、1[…]

 

時間帯による天井LEDの発光制御

現在時刻を複数の時間帯に分けて、時間帯ごとに天井に取り付けたLEDの発光数、色を変化させます。

天井用LEDは、次のものを使用します。

M5Stack用NeoPixel互換 LEDテープ 10 cm
10㎝の長さのLEDストラップです。LEDが15個実装されています。
商品には10㎝の他にも、20㎝、50㎝、100㎝、200㎝があります。10㎝のものはかなり短めのものです。両端にGroveコネクタ(HY2.04P)のメスがついているものになります。
(写真は10㎝以上の長さの商品のイメージです。)
Amazonで確認
NeoPixelというAdafruit社のLEDを使ったLEDストラップになります。
Arduinoでプログラムする際には、Adafruit社が提供している「Adafruit NeoPixel」ライブラリを使用します。

ライブラリのインストールは、次の記事で紹介しています。

関連記事

本記事は、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サービスへのアクセスが1時間に1回と定期的に実行されます。
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への書き込み

  1. 「ファイル」メニューから「名前を付けて保存」で任意の名前を付けて保存します。
  2. 「ツール」メニューから「ボード」情報を確認し、M5StickC Plusであるか確認します。
    この際、「シリアルポート」にマイコンを接続したCOMポートが指定されているかも確認します。
  3. 「ツール」メニューから「Patition Scheme」を「”No OTA(Large APP)”」にします。
    ※ここを変更しないと、スケッチが大きいというエラーになります。
  4. 「ツール」メニューから「シリアルモニタ」を選択してシリアルモニタを起動します。
  5. 「スケッチ」メニューから「マイコンボードに書き込む」を選択します。

 

 プログラム実行結果

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}

編集後記

いかがだったでしょうか。

これで、キャンプ感のあるお天気グッズのプログラム部分は完成しました!

組み込むのが楽しみですね!今回の記事は以上になります。

最後までご覧いただきありがとうございました。

 

今回使用したマイコンはこちら!

M5StickC Plus
画面付きで小型のマイコンです。旧版のM5StickCから、ディスプレイサイズ、バッテリ容量が変更になっています。ブザーも実装されました。通信(WiFi/Bluetooth)機能、6軸加速度センサーも搭載されています。
Aruduino で開発できます。Amazonで確認