ホーム > カテゴリ > ロボット・電子工作・マイコン >

データを送受信をするIoTデバイスの作り方 [ESP-WROOM-02版]

USBシリアル変換モジュールを使用してArduinoスケッチを「ESP-WROOM-02」に書き込んで「Wifi接続」「ネット上のファイルの取得」「GET/POST」を実行する方法です。

スケッチの書き込み後は「ESP-WROOM-02」だけで動作します。

Arduinoから「ESP-WROOM-02」を使用する方法はデータを送受信をするIoTデバイスの作り方 [Arduino版]をご覧ください。

Arduinoスケッチの書き込みが初めての方はESP-WROOM-02にArduinoのスケッチを書き込む必ず先にご覧ください。

やること

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の使い方/まとめをご覧ください。

事前準備

準備作業内容
はんだ付け秋月電子で購入した「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・ラズパイ等)でユーザー同士で情報を共有して下さい。

関連記事



公開日:2017年04月16日 最終更新日:2018年08月06日
記事NO:02327