800円で買えるESP32搭載マイコン、ESP-32S NodeMCUを買ってみました!
時代はIoTというのも今更な気がしますが、ラズパイやObnizなどの「手軽なIoTマイコン」は5,000円超えのものが多いですよね…
そこで、ArduinoIDEで開発できて、Wi-FiやBluetoothにも対応したなんでもありなマイコンESP-32S NodeMCUを使ってGETをするという記事をご紹介します!
0. パーツ
今回私自身が購入したのは以下のパーツになります。(アフィリエイトリンクなので、購入される方はこちらから購入してくださると嬉しいです…!)
別途USB microBのケーブルが必要になりますが、データのやり取りができるケーブルであれば家にあるものや家電量販店で購入できるモノで問題ないです。
一応私は以下のAnkerのケーブルを使用していますが、高いのでもっと安いので問題ないです。
1. 環境
まずは環境構築から。
1-1. Arduino IDEのインストール
ArduinoIDEがインストールされていない方はインストールしてください。
1-2. Arduino IDEへボードマネージャーを追加
ボードマネージャー、つまりはESP-32S NodeMCUを使えるようにしてくれるパッケージのインストールをします。
Arduino IDEを開いて、 ファイル>環境設定 で環境設定を開いてください。
続いて、 追加のボードマネージャのURL へ以下のJSONファイルのURLを追加してください。
1 |
https://dl.espressif.com/dl/package_esp32_index.json |
1-3. ボードマネージャーの追加確認
ツール>ボード>ESP32 Arduino が追加されていることを確認してください。
1-4. USBで接続
USBケーブルで接続してください。
この時、上手く認識されない場合はドライバが入っていない可能性があるので、壊れていると思わずドライバのインストールを試してみることをお勧めします。
2. Wi-Fiへの接続
プロジェクトの作成をします。
2-1. SSID / PASSWORDを指定
Wi-FiのSSID / パスワードを指定します。
注意点ですが、2.5GHzにしか対応していません。5GHzのWi-Fiを指定してもモジュール自体が対応していないためエラーが発生してしまいます。ちなみに、スマホのテザリングとかは2.5GHzが大半かと思います。
今回はひとまず1個指定できるようにします。
1 2 3 4 5 6 7 |
// ヘッダ読み込み #include <WiFi.h> #include <HTTPClient.h> // Wi-Fi関係 #define WIFI_SSID "SSID" #define WIFI_PASS "PASSWORD" |
2-2. 接続関数の作成
Wi-Fiに接続するための関数を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// Wi-Fi接続関数 void connectWiFi(char* ssid, char* passwd) { // 接続開始 WiFi.begin(ssid, passwd); Serial.print("WiFi connecting..."); // 接続成功までループ while(WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(100); } Serial.println("."); // 接続完了 Serial.print("connected : "); Serial.println(WiFi.localIP()); } |
中身は単純で WiFi.begin(ssid, passwd); を用いてWi-Fiに接続します。
その後、 WiFi.status() が WL_CONNECTED 、つまりは接続が成功していた場合は自身のローカルIPを出力して終了。失敗していた場合は100mSec置いて再度接続という流れです。
2-3. プロトタイプ宣言と関数の呼び出し
プロトタイプ宣言と実際に作成した関数を呼び出してみます。
プロトタイプ宣言とは?という方はざっくり解説すると、コンパイラに予め「こんな自作関数がコード内で書かれています!」と予め宣言してあげることです。スクリプト言語ではあまりないと思うのですが、C言語は関数が定義されている部分より前に関数を呼び出すと関数が動作しないんです(ArduinoIDEのコンパイラではコンパイルエラーにならないので気付きにくい)
では、実際のコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// プロトタイプ宣言 void connectWiFi(char* ssid, char* passwd); // セットアップ void setup() { // ボーレート設定 Serial.begin(115200); // Wi-Fi接続 connectWiFi(WIFI_SSID, WIFI_PASS); // 必要があれば(機種判別とか) // uint64_t chipid = ESP.getEfuseMac(); // Macアドレス取得 // IPAddress ipAddress = WiFi.localIP();// ローカルのIPアドレス取得 } // メイン処理 void loop() { // 接続失敗時に再接続 if ( WiFi.status() == WL_DISCONNECTED) { connectWiFi(WIFI_SSID, WIFI_PASS); } delay(5000); } |
ここで、 void setup() と void loop() が登場します。これはおまじないのように覚えてもらって構わないのですが、
- void setup() は最初に1回だけ呼ばれる関数
-
void loop() は処理をずっとループ
- void setup() の終了後からArduinoの電源が切れるまで
- 要はメイン処理
と言った感じです。
2-4. コードの全体像
コードの全体像はこんな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
// ヘッダ読み込み #include <WiFi.h> #include <HTTPClient.h> // Wi-Fi関係 #define WIFI_SSID "SSID" #define WIFI_PASS "PASSWORD" // プロトタイプ宣言 void connectWiFi(char* ssid, char* passwd); // セットアップ void setup() { // ボーレート設定 Serial.begin(115200); // Wi-Fi接続 connectWiFi(WIFI_SSID, WIFI_PASS); // 必要があれば(機種判別とか) // uint64_t chipid = ESP.getEfuseMac(); // Macアドレス取得 // IPAddress ipAddress = WiFi.localIP();// ローカルのIPアドレス取得 } // メイン処理 void loop() { // 接続失敗時に再接続 if ( WiFi.status() == WL_DISCONNECTED) { connectWiFi(WIFI_SSID, WIFI_PASS); } delay(5000); } // -------------------- // 自作関数 // -------------------- // Wi-Fi接続関数 void connectWiFi(char* ssid, char* passwd) { // 接続開始 WiFi.begin(ssid, passwd); Serial.print("WiFi connecting..."); // 接続成功までループ while(WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(100); } Serial.println("."); // 接続完了 Serial.print("connected : "); Serial.println(WiFi.localIP()); } |
2-5. 実行してみる
まずは、ツールから以下のような感じで設定してみてください。
シリアルポート の部分は接続しているポートを選択するのですが、どれかわからない時の一番簡単な調べ方は、ESP32をパソコンに接続する前と後で増えたポートがESP32のポートです。
さて、実行。右矢印のボタンを押せば大丈夫です。
書き込みには少し時間がかかりますが、以下のように表示されたら書き込み完了です。
出力結果が見れるように右上の虫眼鏡のボタンからシリアルモニタを表示してください。
シリアルモニタを開くとWi-Fiに接続ができたことが確認できるかと思います。
接続ができない場合はSSID・パスワードを試してみてください。
3. GETしてみる
さて、やっと本題のGETです。
3-1. URLの指定
まずはGET先のURLを指定します。
今回はGETなので、HTMLにアクセスしてHTMLソースを取ってくるだけでもいいので、そうしてみます。
1 2 |
// GET先 const char URL[] = "http://reerishun.com/"; |
3-2. GET関数
GETをする関数を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// GET関数 void getWebLink(const char* API_URL){ // HTTPのインスタンス作成 HTTPClient http; // GET http.begin(API_URL); int httpCode = http.GET(); // 結果表示 Serial.printf("Response: %d", httpCode); Serial.println(); if (httpCode == HTTP_CODE_OK) { String body = http.getString(); Serial.print("Response Body: "); Serial.println(body); } } |
GETを行い http.GET() が HTTP_CODE_OK 、つまりは200番が返ってきた場合はBodyを表示します。
3-3. コードの全体像
先程のWi-Fi接続処理と合わせて、全体像はこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
// ヘッダ読み込み #include <WiFi.h> #include <HTTPClient.h> // Wi-Fi関係 #define WIFI_SSID "SSID" #define WIFI_PASS "PASSWORD" // GET先 const char URL[] = "http://reerishun.com/"; // プロトタイプ宣言 void connectWiFi(char* ssid, char* passwd); void getWebLink(char*); // セットアップ void setup() { // ボーレート設定 Serial.begin(115200); // Wi-Fi接続 connectWiFi(WIFI_SSID, WIFI_PASS); // 必要があれば(機種判別とか) // uint64_t chipid = ESP.getEfuseMac(); // Macアドレス取得 // IPAddress ipAddress = WiFi.localIP();// ローカルのIPアドレス取得 } // メイン処理 void loop() { // 接続失敗時に再接続 if ( WiFi.status() == WL_DISCONNECTED) { connectWiFi(WIFI_SSID, WIFI_PASS); } // GET getWebLink(URL); delay(5000); } // -------------------- // 自作関数 // -------------------- // Wi-Fi接続関数 void connectWiFi(char* ssid, char* passwd) { // 接続開始 WiFi.begin(ssid, passwd); Serial.print("WiFi connecting..."); // 接続成功までループ while(WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(100); } Serial.println("."); // 接続完了 Serial.print("connected : "); Serial.println(WiFi.localIP()); } // GET関数 void getWebLink(const char* API_URL){ // HTTPのインスタンス作成 HTTPClient http; // GET http.begin(API_URL); int httpCode = http.GET(); // 結果表示 Serial.printf("Response: %d", httpCode); Serial.println(); if (httpCode == HTTP_CODE_OK) { String body = http.getString(); Serial.print("Response Body: "); Serial.println(body); } } |
3-4. 実行してみる
実行方法は上と同じなので割愛。
実行して見ると、こんな感じでHTMLが表示されたらOKです。
これでURLを指定してGETできることが確認できたので自身で開発したAPIへGETすることも可能かと思います!
最後に
今回の内容はGETのみでしたが、今後はPOSTの記事もかけたら書きたいなと思います。
また、Wi-Fiの認証情報部分も define から二次元配列に変えてfor文で回すことで複数のWi-Fiの登録も可能になります。
そのあたりの拡張性を持たせたり、API側の実装などもブログに書いていければと思います。
また、質問等がありましたら私のTwitterDMへご質問ください(何回か対応済み)
参考にした記事
- ESP32 で無線LANを使う – Qiita
- 【( ..)φメモメモ】HiLetgo® ESP32 ESP-32S NodeMCU開発ボード2.4GHz WiFi + Bluetoothデュアルモード【安いなぁ】
今回のブログ曲
今回投稿中に聴いていた曲はこちら