Arduinoと無線LANで通信する(ESP8266 5)


ちょっと脱線しますが、アクセスポイントに接続した状態でArduinoの電源を切ったり、
スケッチを変更したらどうなるか確認してみました。
以下のようにleaveAP()をコメントアウトして実行します。
SIDにはアクセスポイントのSSID、PASSにはそのパスワードを指定してください。

/*
 * ESP8266 Connect Example with WeeESP8266 Library
 * https://github.com/itead/ITEADLIB_Arduino_WeeESP8266
 *
 * ESP8266----------ATmega
 * ESP8266_TX    -> RX(D2)
 * ESP8266_RX    -> TX(D3)
 */

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

#define rxPin 2
#define txPin 3
#define baudRate 4800

SoftwareSerial myESP8266(rxPin, txPin); /* RX:D2, TX:D3 */
ESP8266 wifi(myESP8266,baudRate);
#define SID         "アクセスポイントのSSID"
#define PASS        "アクセスポイントのパスワード"

void setup(void)
{
    Serial.begin(9600);
    wifi.leaveAP();
    Serial.print("FW Version:");
    Serial.println(wifi.getVersion().c_str());
   
    if (wifi.setOprToStationSoftAP()) {
      Serial.print("to station ok\r\n");
    } else {
      Serial.print("to station 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");
    }

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

void loop(void)
{
}

次に以下のスケッチを実行し AT+CWJAP? コマンドを実行します。

/*
 * ESP8266 Software Serial Test
 * 
 * ESP8266----------ATmega
 * ESP8266_TX    -> RX(D2)
 * ESP8266_RX    -> TX(D3)
 */
#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3

SoftwareSerial myESP8266(rxPin, txPin); // RX, TX

void ESP8266_Write(char * cmd) {
    Serial.println(cmd);
    myESP8266.println(cmd);
}

int ESP8266_Read(char * buf, int szbuf, int timeout) {
    int len=0;
    int pos=0;
    char line[128];
   
    long int time = millis();

    while( (time+timeout) > millis()) {
      while(myESP8266.available())  {
        char c = myESP8266.read(); // read the next character.
        buf[len]=c;
        len++;
        if (len == szbuf) return len;
        buf[len]=0;

        if (c == 0x0d) {
         
        } else if (c == 0x0a) {
          Serial.print("line=[");
          Serial.print(line);
          Serial.println("]");
          if (strcmp(line,"OK") == 0) return len;
          pos=0;
          line[pos]=0;
        } else {
          line[pos++]=c;
          line[pos]=0;
        }
      } 
    }
    return len;
}

void setup(void)
{
    char buf[256];
    int len;
   
    Serial.begin(9600);
    myESP8266.begin(4800);
    ESP8266_Write("AT");
    len=ESP8266_Read(buf,sizeof(buf),2000);
    ESP8266_Write("AT+CWJAP?");
    len=ESP8266_Read(buf,sizeof(buf),2000);
}


void loop(void) {
}

やはり予想通り、アクセスポイントに接続されたままになっていることが分かります。
Arduinoの電源をON→OFF→ONしても、アクセスポイントに接続されたままです。



次に以下のスケッチを実行します。

/*
 * ESP8266 Connect Example with WeeESP8266 Library
 * https://github.com/itead/ITEADLIB_Arduino_WeeESP8266
 *
 * ESP8266----------ATmega
 * ESP8266_TX    -> RX(D3)
 * ESP8266_RX    -> TX(D2)
 */

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

#define rxPin 2
#define txPin 3
#define baudRate 4800

SoftwareSerial myESP8266(rxPin, txPin); /* RX:D2, TX:D3 */
ESP8266 wifi(myESP8266,baudRate);

void setup(void)
{
    Serial.begin(9600);
    wifi.leaveAP();
    Serial.print("setup end\r\n");
}

void loop(void)
{
}

再び AT+CWJAP? コマンドを実行すると、アクセスポイントとの接続が開放されていることが分かります。



いきなりleaveAP()を実行して、無条件にアクセスポイントとの接続を開放したほうが安全だと思います。

続く....