Pico2W × OpenWeatherAPI で天気情報をLCDに表示してみた

# 目次
1. [概要](#1-概要)
1. [デモ動画](#2-完成品デモ動画)
1. [GitHub](#3-github)
1. [回路図](#4-回路図)
1. [環境](#5-環境)
1. [who are you？](#6-who-are-you)
1. [今回の作成の経緯](#7-今回の作成の経緯)
1. [環境構築](#8-環境構築)
    1. [Raspberry Pi Pico 2 wにArduino IDEからプログラムを書き込むためのセットアップ](#81-raspberry-pi-pico-2-wにarduino-ideからプログラムを書き込むためのセットアップ)
    1. [OpenWeatheAPIのAPIキー取得](#82-openweatheapiのapiキー取得)
1. [プログラムについて](#9-プログラムについて)
1. [最後に](#10-最後に)

# 1. 概要
本記事は、[Raspberry Pi Pico 2 W](https://akizukidenshi.com/catalog/g/g130330/)と[OpenWeatherAPI](https://openweathermap.org/api)を用いて、[LCD](https://akizukidenshi.com/catalog/g/g101623/)に天気情報を表示するものになります。
pico2wじゃなくても、Arduinoが書き込めれば使えます。
本記事は、[3. GitHub](#3-github)まで読んでいただければ、コード等はご使用できます。
[3. GitHub](#3-github)より後の項は説明になります。

# 2. 完成品デモ動画
<iframe width="560" height="315" src="https://www.youtube.com/embed/Av_Wy9Dt-k4?si=NgX_WedIAseXafy1" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# 3. GitHub
今回のソースコードが置いてあるgithubです

https://github.com/wadoyoka/pico2w/tree/main/weather_station

# 4. 回路図
ユニバーサル基盤を用いて、LCDモジュールを拡張？したので、その回路図を頑張って書いてみました。以下はpdfファイルのスクリーンショットになります。元のpdfファイルはgithubに上げてます。[こちら](https://github.com/wadoyoka/pico2w/blob/main/weather_station/circuit_diagram/weather_station.pdf)です。
間違ってそうなら、ぜひ教えてほしいです！

![circuit_diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944784/20926a29-d05e-4990-90a2-0b5faa258a66.png)

# 5. 環境
- Arduino
- [Raspberry Pi Pico 2 W](https://akizukidenshi.com/catalog/g/g130330/)
- [LCD](https://akizukidenshi.com/catalog/g/g101623/)
- [OpenWeatherAPI](https://openweathermap.org/api)

# 6. who are you？
自己紹介がまだでした…。
Wadoyoka(ワドヨカ)といいます。
普段は、Next.jsを使ってWebアプリを作っている学生です。今年(2025年)の1月ごろから、電子工作に触れだして、楽しく工作してます。
何気にこれがQiita初記事になります。
よろしくお願いします。

# 7. 今回の作成の経緯
電子工作をする中で、Rasberry Pi Pico に興味を持っていたとことろ、丁度、秋月電子通商で[Raspberry Pi Pico 2 W](https://akizukidenshi.com/catalog/g/g130330/)が発売したので、購入しました。また、同時期に[SHARPキャラクターディスプレイモジュール(16×2行バックライト有)LM162AT1](https://akizukidenshi.com/catalog/g/g101623/)が長期保存品で1000円→300円と安くなっていて、購入しました。
どちらも、せっかく買ったので何かに使いたいと思い、この度このプログラムを作成いたしました。
Pico2wに関してはまだまだ色々使えそうなので、今後はWebアプリとの連携もしていきたいですね。AWS IoT Core等と連携させたいですね。何か面白い使い方が思いついたらまた、作ります。

# 8. 環境構築
環境構築！頑張ろう！

## 8.1 Raspberry Pi Pico 2 wにArduino IDEからプログラムを書き込むためのセットアップ
基本的に以下記事と同じことを説明します。


https://logikara.blog/raspi-pico-arduinoide/

まずは、ファイル→基本設定をクリック

![construct_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944784/30084083-69c3-44c7-ae96-b03204a4dd21.png)

次に、「追加のボードマネージャのURL」をクリック

![construct_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944784/75b32438-aade-4d0f-b3f0-63413b9079ca.png)

以下のURLを追加しましょう！
```
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
```
![construct_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944784/ee1b51bd-106f-4994-90e9-826bf9d5a943.png)

インストールが完了したら、次はボードマネージャに「Pico2」と入力して。「Raspberry Pi Pico/RP2040/RP2350」を追加しましょう。

![construct_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944784/93b7f837-431b-403d-885f-b38f877a6b55.png)

次に、COMとボードを対応付けましょう！
左上から、「他のボードとポートを選択」を押します。

![construct_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944784/6584a39e-55f2-4ac4-94fc-415882b085d2.png)

「pico2w」と入力して検索します。
また、対応するCOM番号を選択してOKを押します。

![construct_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944784/b36f3e6b-54c4-40ad-a416-a092f4e76acb.png)


最後に、プログラム用に「ライブラリマネージャ」から「ArduinoJson」を追加します。
![ArduinoJson.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944784/d579a0ec-9adc-441a-b879-7912c4be45f7.png)

以上でArduinoIDE側では完了です。

## 8.2 OpenWeatheAPIのAPIキー取得
以下記事を参考にOpenWeatheAPIキーを取得してください。

https://dev.classmethod.jp/articles/openweather_-pyowm/

# 9. プログラムについて
今回、プログラムについては、ほとんどChatGPTとV0に書いて貰ったのですが、要点だけ説明します。
色々改善したいですね。

<details>
<summary>weather_station.ino(メインファイル)</summary>

本プロジェクトのメインファイルです。TODO部分を書き換えて使用してください。
Todoの以下部分は、ご使用するGPIOピンによって変わります。LCDモジュールの使い方は以下記事を参考にしました。

[Arduinoで遊ぼう(17,LCDモジュール)](https://mecha-norimaki.com/arduino_start_17/)


```cpp

// LCDピン設定（ご自身の接続に合わせて変更してください）
const int rs = 0;
const int en = 1;
const int d4 = 2;
const int d5 = 3;
const int d6 = 4;
const int d7 = 5;

```

#### 文字が左に流れる部分

```cpp
for (int positionCounter = 0; positionCounter < 36; positionCounter++) {
    // scroll one position left:
    lcd.scrollDisplayLeft();
    // wait a bit:
    delay(600);
}

```

`lcd.scrollDisplayLeft();`で、文字が1文字左に流れます。これを0.6秒間隔で36回やってます。
これにより、文字が左に移動していきます。


</details>

<details>
<summary>OpenWeatherClient.ino</summary>
このファイルは、OpenWeatherとの接続等を担っています。
以下の部分で、取得した天気の名前を英語→カタカナに変換して、LCDで表示できるようにしています。

```cpp

String OpenWeatherClient::getWeatherInKatakana(String weather) {
    if (weather == "Thunderstorm") return "	\xd7\xb2\xb3";//ライウ
    if (weather == "Drizzle") return "\xb7\xd8\xbb\xd2";//キリサメ
    if (weather == "Rain") return "\xb1\xd2";//アメ
    if (weather == "Snow") return "\xd5\xb7";//ユキ
    if (weather == "Clear") return "\xca\xda";//ハレ
    if (weather == "Clouds") return "\xb8\xd3\xd8";//クモリ
    if (weather == "Mist") return "\xd3\xd4";//モヤ
    if (weather == "Smoke") return "\xb9\xd1\xd8";//ケムリ
    if (weather == "Haze") return "\xb6\xbd\xd0";//カスミ
    if (weather == "Dust") return "\xce\xba\xd8";//ホコリ
    if (weather == "Fog") return "\xb7\xd8";//キリ
    if (weather == "Sand") return "\xbd\xc5";//スナ
    if (weather == "Ash") return "\xca\xb2";//ハイ
    if (weather == "Squall") return "\xbd\xba\xb0\xd9";//スコール
    if (weather == "Tornado") return "\xc4\xd9\xc8\xb0\xc4\xde";//トルネード

    return "\xcc\xd2\xb2"; // 該当なしの場合
}

```

</details>

# 10. 最後に
ここまで、読んでいただきありがとうございます。自宅の経度緯度を入力して、天気情報を表示させて流しとくと外の気温や状態が簡単に把握できるのに加えて、可愛いのでお勧めです。
Pico2Wを使って色々と遊びたいですね。主にWeb連携……
またね。