Arduino UNOでインターネット上の情報を取得する


Arduino UNOとESP-WROOM-02を繋いで通信が出来る様になりました。過去記事については以下を参照してください。

Arduino UNO + ESP-WROOM-02(ESP8266)

Arduino UNO + ESP-WROOM-02(ESP8266)

これでhttpサーバから情報を入手する事が出来ますが、そのままwebの情報を読み取るとArduinoのとっては情報が大き過ぎて扱いに困ります。そこで、必要な情報だけを送信するようにPHPを処理を行います。まずは単純なPHPをサーバに設置してテストします。

PHPのURLアドレスは http://mkbtm.jp/PHP/esp8266/simple.php とします。コードは次の通りです。

ブラウザで上記のURLをクリックして開くと分かりますが、変数の値(10)を返すだけのPHPです。ここにArduino UNOからアクセスします。Arduinoのスケッチは次の通りです。

#include "ESP8266.h"
#include <SoftwareSerial.h>

//Arduino UNOとESP8266をシリアルで繋いで通信。
//UNOとESP8266はSoftware Serialで通信。

#define SSID        "アクセスポイントの名前"
#define PASSWORD    "アクセスポイントのパスワード"
#define HOST_NAME   "mkbtm.sakura.ne.jp"
#define HOST_PORT   80

SoftwareSerial mySerial(12, 11); /* RX:12, TX:11 */
ESP8266 wifi(mySerial);
//software serialの速度はESP8266.hで設定

void setup(void)
{
    //Serial.begin(9600);
    Serial.begin(57600);
    Serial.print("setup begin\r\n");

    Serial.print("FW Version:");
    Serial.println(wifi.getVersion().c_str());

    if (wifi.setOprToStationSoftAP()) {
        Serial.print("to station + softap ok\r\n");
    } else {
        Serial.print("to station + softap err\r\n");
    }

    if (wifi.joinAP(SSID, PASSWORD)) {
        Serial.print("Join AP success\r\n");
        Serial.print("IP:");
        Serial.println( wifi.getLocalIP().c_str());
    } else {
        Serial.print("Join AP failure\r\n");
    }

    if (wifi.disableMUX()) {
        Serial.print("single ok\r\n");
    } else {
        Serial.print("single err\r\n");
    }

    Serial.print("setup end\r\n");
}

void loop(void)
{
     uint8_t buffer[512] = {0};

    if (wifi.createTCP(HOST_NAME, HOST_PORT)) {
        Serial.print("create tcp ok\r\n");
    } else {
        Serial.print("create tcp err\r\n");
    }

    char *hello = "GET /PHP/esp8266/simple.php HTTP/1.0\r\nHost: mkbtm.jp\r\nUser-Agent: arduino\r\n\r\n";

    wifi.send((const uint8_t*)hello, strlen(hello));

    uint32_t len = wifi.recv(buffer, sizeof(buffer), 10000);
    if (len > 0) {
        Serial.print("Received:[");
        for(uint32_t i = 0; i < len; i++) {
            Serial.print((char)buffer[i]);
        }
        Serial.print("]\r\n");
    }

    delay(5000);
}

ここで一つポイントがあります。アクセスしているサーバはsakuraのレンタルサーバですが、共有サーバになっているのでHostを指定しないと接続できません。ドメイン名はこのブログと同じmkbtm.jpですが、mkbtm.jpにアクセスしただけでは404 File not Foundになってしまいます。

実行結果をシリアルモニタで見ると次の通りです。
スクリーンショット 2015-08-29 20.59.17
10という値が返って来ているのが分かります。