データを送受信をするIoTデバイスの作り方 [ESP-WROOM-02版]
USBシリアル変換モジュールを使用してArduinoスケッチを「ESP-WROOM-02」に書き込んで「Wifi接続」「ネット上のファイルの取得」「GET/POST」を実行する方法です。
スケッチの書き込み後は「ESP-WROOM-02」だけで動作します。
やること
1. 動的IPアドレスでWifi接続(DHCP有効)
2. 静的IPアドレスでWifi接続(DHCP無効)
3. URLにアクセスしてファイルを取得する
4. URLにアクセスする(HTTP GET)
5. URLにアクセスする(HTTP POST)
使用部品・材料
総額で約1980円です。(Arduinoは使用しません)
| 部品/材料 | 値段 | 備考 |
|---|---|---|
| ブレッドボード | ¥270 | 秋月電子の通販コード(P-00315) |
| Wi-Fiモジュール ESP-WROOM-02 DIP化キット | ¥650 | 秋月電子の通販コード(K-09758) |
| FT232RL USBシリアル変換モジュール | ¥950 | 秋月電子の通販コード(K-01977) |
| USBケーブル Aオス-ミニBオス 1.5m A-miniB | ¥110 | パソコンとFT232RLを接続するUSBケーブル。 秋月電子の通販コード(C-07606) |
| カーボン抵抗器 | 数円 | 10kΩ(4個)を使用 |
配線図
ESP-WROOM-02を左右どちらかに差し込むだけです
事前準備
| 準備作業 | 内容 |
|---|---|
| はんだ付け | 秋月電子で購入した「ESP-WROOM-02」には細ピンヘッダが付属していますので、ご自分で「はんだ付け」をする必要があります。![]() |
| Arduino IDEを1.8.2以降にアップグレードする | 最新のArduino IDEは公式からダウンロード可能です。 ※サンプルコードでは日本語(UTF8)を使用していますので、UTF8に対応しているArduino IDE 1.8.2以降をお使いください。 |
| 各種ファイルのダウンロード | オープンソースコミュニティのGitHubにあるTESP8266から次のサンプル用のファイルをダウンロードします。(TESP8266ライブラリは使用しません。) iot.inc file.txt get.php post.php t_example.sql ※前回(Arduino版)、使用したファイルの再利用です。 |
| Webサーバー | 最初にPHPをサーバー側で実行できるようにします。 次に「t_example.sql」以外の4つのファイルをWebサーバーに設置します。iot.incはDBのパスワードなどの設定ファイルですので、外部からアクセスできないユーザーディレクトリに設置します。その他の3つのファイルは外部からアクセス可能なディレクトリに設置します。 UserDir/iot.inc UserDir/public_html/iot/file.txt UserDir/public_html/iot/get.php UserDir/public_html/iot/post.php URLに変換すると次のようになります。 www.example.com/iot/file.txt www.example.com/iot/get.php www.example.com/iot/post.php ※Webサーバーや環境によっては設置方法が異なりますので適宜、変更して下さい。 |
| DBサーバー | 今回はMySQLを使用します。 データベースを作成後に「t_example.sql」をデータベース上で実行してテスト用のテーブル(t_example)を作成します。 次にさきほどの「iot.inc」をメモ帳などで開いてデータベースにアクセスする為の設定を書き込みます。 |
お疲れ様です。これで事前準備は完了です。
1. 動的IPアドレスでWifi接続(DHCP有効)
ssid、passwordを各自の環境に設定します。
#include <ESP8266WiFi.h>
const char* ssid = "xxx";
const char* password = "xxx";
void setup() {
Serial.begin(115200);
// WIFI_AP, WIFI_STA, WIFI_AP_STA or WIFI_OFF
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFiに接続しました。");
Serial.print( "IPアドレス: ");
Serial.println( WiFi.localIP());
Serial.print( "ゲートウェイ: ");
Serial.println(WiFi.gatewayIP());
Serial.print( "サブネットマスク: ");
Serial.println(WiFi.subnetMask());
}
void loop() {
// none
}
※スマートフォンのテザリングによるソフトウェアルータの場合は接続に3-5分ぐらいかかる事があります。
2. 静的IPアドレスでWifi接続(DHCP無効)
ssid、password、ip、gateway、netmaskを各自の環境に設定します。
#include <ESP8266WiFi.h>
const char* ssid = "xxx";
const char* password = "xxx";
// 文字列ではなく、数値配列です。
IPAddress ip(192, 168, 1, 33 );
IPAddress gateway(192, 168, 1, 1);
IPAddress netmask(255, 255, 255, 0);
void setup() {
Serial.begin(115200);
delay(10);
// WIFI_AP, WIFI_STA, WIFI_AP_STA or WIFI_OFF
WiFi.mode(WIFI_STA);
WiFi.config(ip, gateway,netmask);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFiに接続しました。");
Serial.print( "IPアドレス: ");
Serial.println( WiFi.localIP());
Serial.print( "ゲートウェイ: ");
Serial.println(WiFi.gatewayIP());
Serial.print( "サブネットマスク: ");
Serial.println(WiFi.subnetMask());
}
void loop() {
// none
}
3. URLにアクセスしてファイルを取得する
#include <ESP8266WiFi.h>
const char* ssid = "xxx";
const char* password = "xxx";
// URL(例) http://www.example.com/iot/file.txt
const char* host = "www.example.com";
const char* path = "/iot/file.txt";
void setup() {
Serial.begin(115200);
// WIFI_AP, WIFI_STA, WIFI_AP_STA or WIFI_OFF
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFiに接続しました。");
Serial.print( "IPアドレス: ");
Serial.println( WiFi.localIP());
Serial.print( "ゲートウェイ: ");
Serial.println(WiFi.gatewayIP());
Serial.print( "サブネットマスク: ");
Serial.println(WiFi.subnetMask());
delay(1000);
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("接続に失敗しました。");
return;
}
// サーバにリクエストを送信
client.print(String("GET ") + path + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> タイムアウトしました。");
client.stop();
return;
}
}
// HTTPヘッダを含むデータの読み取り(1文字毎)
String raw = "";
while (client.available()) {
char c = client.read();
raw = raw +c;
// ファイルの内容を全て取得できない場合はディレイを追加します。
// delay(1);
}
// HTTPヘッダを含むデータの読み取り(1行毎)
// String raw = "";
// while (client.available()) {
// raw = raw + client.readStringUntil('\n') + '\n';
// delay(1);
// }
// HTTPヘッダの削除
int index = raw.indexOf("\r\n\r\n");
raw = raw.substring(index + 4);
Serial.println("-----");
// ファイルサイズ
Serial.print(raw.length());
Serial.println(" byte");
Serial.println("-----");
// ファイルの生データ
Serial.println(raw);
Serial.println("-----");
// Wifiの切断
WiFi.disconnect();
}
void loop() {
// none
}
[実行例]
4. URLにアクセスする(HTTP GET)
#include <ESP8266WiFi.h>
const char* ssid = "xxx";
const char* password = "xxx";
// URL(例) http://www.example.com/iot/get.php?value=1&string=ABCDE
const char* host = "www.example.com";
const char* path = "/iot/get.php?value=1&string=ABCDE";
void setup() {
Serial.begin(115200);
// WIFI_AP, WIFI_STA, WIFI_AP_STA or WIFI_OFF
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFiに接続しました。");
Serial.print( "IPアドレス: ");
Serial.println( WiFi.localIP());
Serial.print( "ゲートウェイ: ");
Serial.println(WiFi.gatewayIP());
Serial.print( "サブネットマスク: ");
Serial.println(WiFi.subnetMask());
delay(1000);
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("接続に失敗しました。");
return;
}
// サーバにリクエストを送信(GET)
client.print(String("GET ") + path + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> タイムアウトしました。");
client.stop();
return;
}
}
// HTTPヘッダを含むデータの読み取り(1文字毎)
String raw = "";
while (client.available()) {
char c = client.read();
raw = raw +c;
}
// HTTPヘッダの削除
int index = raw.indexOf("\r\n\r\n");
raw = raw.substring(index + 4);
if(raw == "OK"){
Serial.println("GETの成功");
}else{
Serial.println("GETの失敗");
}
Serial.println("-----");
// ファイルサイズ
Serial.print(raw.length());
Serial.println(" byte");
Serial.println("-----");
// ファイルの生データ
Serial.println(raw);
Serial.println("-----");
// Wifiの切断
WiFi.disconnect();
}
void loop() {
// none
}
[実行例]
[PHPAdminでデータベースの確認]
5. URLにアクセスする(HTTP POST)
#include <ESP8266WiFi.h>
const char* ssid = "xxx";
const char* password = "xxx";
// URL(例) http://www.example.com/iot/post.php
const char* host = "www.example.com";
const char* path = "/iot/post.php";
String body = "value=123&string=abcde";
void setup() {
Serial.begin(115200);
// WIFI_AP, WIFI_STA, WIFI_AP_STA or WIFI_OFF
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFiに接続しました。");
Serial.print( "IPアドレス: ");
Serial.println( WiFi.localIP());
Serial.print( "ゲートウェイ: ");
Serial.println(WiFi.gatewayIP());
Serial.print( "サブネットマスク: ");
Serial.println(WiFi.subnetMask());
delay(1000);
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("接続に失敗しました。");
return;
}
// サーバにリクエストを送信(POST)
client.print(String("POST ") + path + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Content-Length:" + String(body.length())+ "\r\n" +
"Connection: close\r\n\r\n" +
body);
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> タイムアウトしました。");
client.stop();
return;
}
}
// HTTPヘッダを含むデータの読み取り(1文字毎)
String raw = "";
while (client.available()) {
char c = client.read();
raw = raw +c;
}
// HTTPヘッダの削除
int index = raw.indexOf("\r\n\r\n");
raw = raw.substring(index + 4);
if(raw == "OK"){
Serial.println("POSTの成功");
}else{
Serial.println("POSTの失敗");
}
Serial.println("-----");
// ファイルサイズ
Serial.print(raw.length());
Serial.println(" byte");
Serial.println("-----");
// ファイルの生データ
Serial.println(raw);
Serial.println("-----");
// Wifiの切断
WiFi.disconnect();
}
void loop() {
// none
}
[実行例]
[PHPAdminでデータベースの確認]
最後に
Arduino IDEの「スケッチ例」にその他のサンプル(ESP8266系)が沢山ありますので、試すと良いです。ブラウザで確認するにはGitHubで。
※Arduino純正のWiFi libraryも参考になります。
掲示板
ArduinoやRaspberry Piなどの電子工作の掲示板を作成しました。質問やわからない事は電子工作 (Arduino・ラズパイ等)でユーザー同士で情報を共有して下さい。
関連記事
プチモンテ ※この記事を書いた人
![]() | |
![]() | 💻 ITスキル・経験 サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。 画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ |
| 🎵 音楽制作 BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は抒情詩、抒情的な楽曲が多い。楽曲制作は🔰2023年12月中旬 ~ | |










