Prismjs

2019年1月5日土曜日

秋月のESP-WROOM-02開発キットを使う~STAモードでwifiLチカ編~

前回(秋月のESP-WROOM-02開発キットを使う~APモードでwifiLチカ編~)では、開発キットと端末(iPhone8)を直接Wi-Fiで接続して無線でLチカを行いました。
APモードでLチカした場合、開発キットに接続した状態では端末がインターネットにアクセスできなくなってしまうし、接続するために毎回接続先を切り替えなければならないのが不便でした。
今回はSTAモードで開発キットとWi-Fiルータ(無線LANルーター)を接続することで、ルーターを通して端末からLチカを行います。こうすることで、開発キットが接続されたルーターに接続された様々な端末からLチカができ、ルーターがネット回線につながっていれば、端末はそのままでインターネットにアクセスできるようになります。

開発キット⇔無線ルーター⇔端末 というようなイメージで接続されています。





回路は前回や前々回と同じです。
手っ取り早くLチカしたい人は完成後のスケッチ(②の後半にあります)をコピペして、③からの手順で進めてください。

①mDNSサンプルスケッチを開く

前回と同様にArduino IDEのファイル→スケッチの例→ESP8266mDNS→mDNS_Web_Serverを開きます。

mDNSを使用することによって、接続のたびに変わるローカルIPを気にせずに接続することができます。使用しなくてもできますが、開発キットの電源を切るたびにLチカのためにアクセスするIPが変わるので不便です。(mDNS利用なら、指定した文字のアドレス.localにアクセスすればLチカ可能)

万が一サンプルが見つからなければ、以下にサンプルを貼っておきますので、コピペしてスケッチを作製してください。

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiClient.h>

const char* ssid = "............";//接続するルーターのssid
const char* password = "..............";//接続するルーターのパスワード

// TCP server at port 80 will respond to HTTP requests
WiFiServer server(80);

void setup(void) {
  Serial.begin(115200);

  // Connect to WiFi network
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  // Set up mDNS responder:
  // - first argument is the domain name, in this example
  //   the fully-qualified domain name is "esp8266.local"
  // - second argument is the IP address to advertise
  //   we send our IP address on the WiFi network
  if (!MDNS.begin("esp8266")) {
    Serial.println("Error setting up MDNS responder!");
    while (1) {
      delay(1000);
    }
  }
  Serial.println("mDNS responder started");

  // Start TCP (HTTP) server
  server.begin();
  Serial.println("TCP server started");

  // Add service to MDNS-SD
  MDNS.addService("http", "tcp", 80);
}

void loop(void) {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  Serial.println("");
  Serial.println("New client");

  // Wait for data from client to become available
  while (client.connected() && !client.available()) {
    delay(1);
  }

  // Read the first line of HTTP request
  String req = client.readStringUntil('\r');

  // First line of HTTP request looks like "GET /path HTTP/1.1"
  // Retrieve the "/path" part by finding the spaces
  int addr_start = req.indexOf(' ');
  int addr_end = req.indexOf(' ', addr_start + 1);
  if (addr_start == -1 || addr_end == -1) {
    Serial.print("Invalid request: ");
    Serial.println(req);
    return;
  }
  req = req.substring(addr_start + 1, addr_end);
  Serial.print("Request: ");
  Serial.println(req);
  client.flush();

  String s;
  if (req == "/") {
    IPAddress ip = WiFi.localIP();
    String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);
    s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>Hello from ESP8266 at ";
    s += ipStr;
    s += "</html>\r\n\r\n";
    Serial.println("Sending 200");
  } else {
    s = "HTTP/1.1 404 Not Found\r\n\r\n";
    Serial.println("Sending 404");
  }
  client.print(s);

  Serial.println("Done with client");
}


全部解説すると大変なので掻い摘んで説明すると、WiFi.mode(WIFI_STA);でWIFI_STAと記述することにより、開発キットをSTAモードにしています。
MDNS.begin("esp8266")とすることで192.168.~のような数字ではなく、「esp8266.local」で端末から開発キットにアクセスできるようになります。
loop内では、esp8266.localにアクセスしたときにローカルIPアドレスを表示させるための記述が書いてあります。
試しに、
const char* ssid = "............";
const char* password = "..............";
の........に自分のルーターの情報を入れて、開発キットにスケッチを書き込んで端末のブラウザでesp8266.localにアクセスしてみましょう。


②サンプルスケッチを書き換える

mDNSのサンプルスケッチに、あるURLにアクセスしたときにLチカするような記述を加えます。mDNSサンプルスケッチと前回までの記述を合体させるような感じです。
まず、#include <ESP8266WebServer.h>を書き足してESP8266WebServer.hをインクルードします。
WiFiServer server(80);をESP8266WebServer server(80);に書き換えます。

前回同様にsetupの前にあるURLにアクセスしたときの動作を記述します。
LEDを点灯させる動作は
void LedOn(){
  server.send(200, "text/html", "<h1>LED is ON</h1>");
  digitalWrite(13,HIGH);
}
消す動作は
void LedOff(){
  server.send(200, "text/html", "<h1>LED is Off</h1>");
  digitalWrite(13,LOW);
}
です。

setup内には、URLと先ほど記述した動作を紐づけます。
server.on("/on", LedOn);でhttp://esp8266.local/onにアクセスするとLedOnが実行され、
server.on("/off", LedOff);でhttp://esp8266.local/offにアクセスするとLedOffが実行るようになります。
また、pinMode(13,OUTPUT);の記述で13番ピンを出力用に設定しておきます。

サンプルスケッチのloop内はmDNS動作確認用の記述になっているため、loop内の記述は全て消して、MDNS.update();と前回同様のserver.handleClient();だけ記述します。

これでスケッチが完成しました。ssidとpasswordは自分の無線ルーターのものに書き換えて開発キットに書き込んでみましょう。(書き込みモードにするのを忘れずに)

最終的なスケッチは以下のようになります。
手っ取り早く実行したい人は以下の記述をコピーしてssidとpasswordだけ書き換えてスケッチを作製・書き込みをして次の手順に進んでください。

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

const char* ssid = "............";
const char* password = "............";

// TCP server at port 80 will respond to HTTP requests
ESP8266WebServer server(80);

void LedOn(){
  server.send(200, "text/html", "<h1>LED is ON</h1>");
  digitalWrite(13,HIGH);
}

void LedOff(){
  server.send(200, "text/html", "<h1>LED is Off</h1>");
  digitalWrite(13,LOW);
}

void setup(void) {
  pinMode(13,OUTPUT);
  Serial.begin(115200);

  // Connect to WiFi network
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  // Set up mDNS responder:
  // - first argument is the domain name, in this example
  //   the fully-qualified domain name is "esp8266.local"
  // - second argument is the IP address to advertise
  //   we send our IP address on the WiFi network
  if (!MDNS.begin("esp8266")) {
    Serial.println("Error setting up MDNS responder!");
    while (1) {
      delay(1000);
    }
  }
  Serial.println("mDNS responder started");

  // Start TCP (HTTP) server
  server.on("/on", LedOn);
  server.on("/off", LedOff);

  server.begin();
  Serial.println("TCP server started");

  // Add service to MDNS-SD
  MDNS.addService("http", "tcp", 80);
}

void loop(void) {
  MDNS.update();
  server.handleClient();
}


③端末からアクセスする

開発キットをつなげた無線LANルーターと同じ無線LANルーターにつなげた端末(今回はiPhone8)のブラウザから「http://esp8266.local/on/」にアクセスしてみましょう。
画面にLED is ONと表示され、LEDが光ったと思います。
次に、「http://esp8266.local/off/」にアクセスしてみましょう。
画面にLED is Offと表示され、LEDが消えたと思います。
これでSTAモードでLチカができました。無線LANルーターに接続さえすれば、毎回無線LAN設定を変更しなくとも、http://esp8266.local/にアクセスすればLチカが可能になりました。家にいる間だけ有効なスイッチみたいな感じで応用ができそうですね。



0 件のコメント:

コメントを投稿