SoftAP モード対応しました。EasyWebSocketライブラリをbeta ver 1.39 にアップデート

ESP8266 ( ESP-WROOM-02 )

こんばんは。

以前から少々お問い合わせいただいたために、Arduino IDEの ESP-WROOM-02 ( ESP8266 )専用の当方自作ライブラリ EasyWebSocket を SoftAP モード対応してバージョンアップしました。
それほど多くの改良をしていないために、以前のスケッチもそのまま利用できると思います。

スポンサーリンク


以前までのEasyWebSocketライブラリではステーションモードで、ESP-WROOM-02が周囲のルーターのアクセスポイントに接続するモードでした。
これの場合はルーターがインターネットに接続してあれば、そのままネットに接続できました。

今回のSoftAPモードはESP-WROOM-02がWi-Fiルータそのものとなり、アクセスポイントになります。つまり、外部のルーターは不要になります。

パスワードを8文字以上設定すれば、必然とWPA2のセキュリティーになります。
それ未満だとパスワードを入力しなくてもスマホとWi-Fi接続できてしまいます。

このEasyWebSocketライブラリのインストール方法はこちらのページを参照してください。

インストール終了したら、下図のようにSoftAPのサンプルスケッチを開いて下さい。

サンプルスケッチも掲載しておきます。
【ソースコード】 (※無保証 ※PCの場合、ダブルクリックすればコード全体を選択できます)

/*
WebSocket for ESP-WROOM-02 ( ESP8266 ) Soft AP mode Sample Sketch
for Beta version 1.39
---> https://www.mgo-tec.com
Please rewrite their own the ssid and password.
Please rewrite their own local IP address of "/data/spiffs_01.txt" in the sketch folder.(ex: ws://192.168.4.1)
Use the SPIFFS file system uploader, please upload the spiffs_01.txt file to flash.
Arduino IDE ver 1.6.9 OK!
ESP8266 board ver 2.3.0 OK!
*/
#include <EasyWebSocket.h>
#include <ESP8266WiFi.h>
#include <Hash.h>

const char* ssid = "xxxxxxxxx";
const char* password = "xxxxxxxxx"; //8文字以上でWPA2モード。8文字未満はパスワード無しでアクセス可能

long CountTime;

byte cnt = 0;

EasyWebSocket ews;

String html_str1;
String html_str2;
String html_str3;
String html_str4;
String html_str5;
String html_str6;
String html_str7;

String ret_str;
String txt;

int PingSendTime = 30000;

#define ledPin1 12 //GPIO #12
#define ledPin2 13 //GPIO #13
#define ledPin3 14 //GPIO #14

void setup() 
{
  //The assignment in the Body element of the browser of HTML to a String variable
  html_str1 = "<body style='background:#000; color:#fff;'>\r\n";
  html_str1 += "<font size=3>\r\n";
  html_str1 += "ESP-WROOM-02(ESP8266)\r\n";
  html_str1 += "<br>\r\n";
  html_str1 += "EasyWebSocket Beta1.3 Sample\r\n";
  html_str1 += "</font><br>\r\n";
  html_str1 += ews.EWS_BrowserSendRate();
  html_str1 += "<br>\r\n";
  html_str1 += "from WROOM DATA =\r\n";
  html_str1 += ews.EWS_BrowserReceiveTextTag("wroomTXT",20,"RED");
  html_str1 += "<br>\r\n";
  html_str1 += "WS Status = \r\n";
  html_str1 += ews.EWS_Status_Text(20,"#FF00FF");
  html_str1 += "<br><br>\r\n";
  html_str1 += ews.EWS_TextBox_Send("txt1", "Hello Easy WebSocket Beta1.3","送信");
  html_str1 += "<br><br>\r\n";

  html_str2 = "LED \r\n";
  html_str2 += ews.EWS_On_Momentary_Button("ALL", "全点灯", 65,25,15,"#000000","#AAAAAA");
  html_str2 += ews.EWS_On_Momentary_Button("OUT", "全消灯", 65,25,15,"#FFFFFF","#555555");
  html_str2 += "<br>\r\n";
  
  html_str3 = "<br>LED BLUE... Dim\r\n";
  html_str3 += ews.EWS_Canvas_Slider_T("BLUE",200,40,"#777777","#0000ff");
  html_str3 += "<br>LED GREEN Dim\r\n";
  html_str3 += ews.EWS_Canvas_Slider_T("GREEN",200,40,"#777777","#00ff00");
  
  html_str4 = "<br>LED RED..... Dim\r\n";
  html_str4 += ews.EWS_Canvas_Slider_T("RED",200,40,"#777777","#ff0000");
  html_str4 += "<br>LED RGB..... Dim\r\n";
  html_str4 += ews.EWS_Canvas_Slider_T("_RGB",200,40,"#777777","#ffff00");
  
  html_str5 = "<br><br>\r\n";
  html_str5 += "BLUE... \r\n";
  html_str5 += ews.EWS_OnOff_Button("blue",60,25,15,"#FFFFFF","#0000FF");
  html_str5 += ews.EWS_Touch_Slider_T("blue", "Txt1");
  html_str5 += ews.EWS_Sl_Text("Txt1",15,"#5555FF");
  html_str5 += "<br><br>\r\n";
  html_str5 += "GREEN \r\n";
  html_str5 += ews.EWS_OnOff_Button("green",60,25,15,"#FFFFFF","#00FF00");
  html_str5 += ews.EWS_Touch_Slider_T("green", "Txt2");
  html_str5 += ews.EWS_Sl_Text("Txt2",15,"#00ff00");
  html_str5 += "<br><br\r\n>";
  
  html_str6 = "RED..... \r\n";
  html_str6 += ews.EWS_OnOff_Button("red",60,25,15,"#FFFFFF","#ff0000");
  html_str6 += ews.EWS_Touch_Slider_T("red", "Txt3");
  html_str6 += ews.EWS_Sl_Text("Txt3",15,"#ff0000");
  html_str6 += "<br><br>\r\n";
  html_str6 += "RGB..... \r\n";
  html_str6 += ews.EWS_Touch_Slider_BT("-RGB", "Txt4");
  html_str6 += ews.EWS_Sl_BoxText("Txt4",30,20,15,"#000000");
  html_str6 += "<br><br><br>\r\n";
  html_str6 += ews.EWS_WebSocket_Reconnection_Button("WS-Reconnect", 200, 40, 17);
  html_str6 += "<br><br>\r\n";  
  html_str6 += ews.EWS_Close_Button("WS CLOSE",150,40,17);
  html_str6 += ews.EWS_Window_ReLoad_Button("ReLoad",150,40,17);
  html_str6 += "</body></html>\r\n";

  html_str7 = ""; //The description here is if the string is too large. If you do not want to use it is empty.
  
  ews.SoftAP_setup(ssid, password);
  
  CountTime = millis();
}

void loop() {
  ews.EWS_HandShake(html_str1, html_str2, html_str3, html_str4, html_str5, html_str6, html_str7);

  String str;

  if(ret_str != "_close"){
    if(millis()-CountTime > 10){//Data transmission from WROOM (ESP8266) every 500ms
      if(cnt > 3){
        cnt = 0;
      }
      switch(cnt){
        case 0:
          str = txt;
          break;
        case 1:
          str = "WebSockets";
          break;
        case 2:
          str = "Hello!!";
          break;
        case 3:
          str = "World!!";
          break;
      }
      ews.EWS_ESP8266_Str_SEND(str, "wroomTXT");
      CountTime = millis();
      cnt++;
    }

    ret_str = ews.EWS_ESP8266CharReceive(PingSendTime);
    if(ret_str != "\0"){
      Serial.println(ret_str);
      if(ret_str != "Ping"){
        if(ret_str[0] != 't'){
          int ws_data = (ret_str[0]-0x30)*100 + (ret_str[1]-0x30)*10 + (ret_str[2]-0x30);
          switch(ret_str[4]){
            case 'B':
              LED_PWM(1, ledPin1, floor(ws_data/2));
              break;
            case 'G':
              LED_PWM(1, ledPin2, floor(ws_data/2));
              break;
            case 'R':
              LED_PWM(1, ledPin3, floor(ws_data/2));
              break;
            case '_':
              LED_PWM(2, 0, floor(ws_data/2));
              break;
            case 'b':
              LED_PWM(1, ledPin1, ws_data);
              break;
            case 'g':
              LED_PWM(1, ledPin2, ws_data);
              break;
            case 'r':
              LED_PWM(1, ledPin3, ws_data);
              break;
            case '-':
              LED_PWM(2, 0, ws_data);
              break;
            case 'A':
              LED_PWM(3, 0, ws_data);
              break;
            case 'O':
              LED_PWM(4, 0, ws_data);
              break;
          }
        }else if(ret_str[0] == 't'){
          txt = ret_str.substring(ret_str.indexOf('|')+1, ret_str.length()-1);
          Serial.println(txt);
        }
      }
    }
  }else if(ret_str == "_close"){
    CountTime = millis();
    ret_str = "";
  }
}

//**************************************************************
void LED_PWM(byte Led_gr, byte Led_Pin, int data_i)
{
Serial.println(data_i);
  switch(Led_gr){
    case 1:
      analogWrite(Led_Pin, data_i);
      break;
    case 2:
      if(data_i < 34){
        analogWrite(ledPin1, data_i*8);
        analogWrite(ledPin2, 0);
        analogWrite(ledPin3, 0);
      }else if(data_i > 33 && data_i < 67){
        analogWrite(ledPin2, (data_i-33)*8);
        analogWrite(ledPin1, 0);
        analogWrite(ledPin3, 0);
      }else if(data_i > 66){
        analogWrite(ledPin3, (data_i-66)*7.78);
        analogWrite(ledPin1, 0);
        analogWrite(ledPin2, 0);
      }
      break;
    case 3:
      analogWrite(ledPin1, 100);
      analogWrite(ledPin2, 100);
      analogWrite(ledPin3, 100);
      break;
    case 4:
      analogWrite(ledPin1, 0);
      analogWrite(ledPin2, 0);
      analogWrite(ledPin3, 0);
      break;
  }
}

●15、16行目のSSIDとパスワードを設定してください。
パスワードを8文字未満にするとパスワード無しで誰でもアクセスできるようになりますので注意です。
8文字以上にすると、WPA2セキュリティになるようです。

●105行目のところが新たに追加した関数で、SoftAP対応のものです。サンプルスケッチで変わったところはここだけです。

このスケッチを名前を付けて保存して、再度このスケッチを開いて、スケッチフォルダの中のdataフォルダを開いてspiffs_01.txtファイルをテキストエディタで開いて下さい。
これについては先ほどのこのページを参照してください。

var wsUri = ‘ws://192.168.4.1’;

という行で、IPアドレスが、192.168.4.1 となっていればOKです。
SoftAPモードでは自動的にESP-WROOM-02のIPがそのようにセットされるようです。

では、SPIFFSファイルシステムアップローダーでspiffs_01.txtをアップロードしてから、サンプルスケッチのコンパイル書き込みを実行してみてください。

スマホでWi-Fi設定すれば外付けルーター無しでESP-WROOM-02にアクセスできると思います。
ただ、WebSocket通信はやはり厳しいですね。
たまにフリーズしてしまいます。
やはり、ルーターの性能は専用機の方が格段に通信が良いですね。

今回は以上です。
不具合などあれば、コメント等でご連絡いただければ幸いです。

ではまた。

Amazon.co.jp 当ブログのおすすめ

スイッチサイエンス ESPr Developer 32 Type-C SSCI-063647
スイッチサイエンス
¥2,420(2024/03/19 08:55時点)
ZEROPLUS ロジックアナライザ LAP-C(16032)
ZEROPLUS
¥22,504(2024/03/19 15:23時点)
Excelでわかるディープラーニング超入門
技術評論社
¥2,068(2024/03/19 03:23時点)

コメント

  1. kato より:

    ライブラリについてご質問が御座います。
    EasyWebSocket_BETA1.3のexamplesのEasyWebSocket139を利用しています。

    EasyWebSocket_BETA1.3をダウンロードしてそのまま利用しているのですが、検証を行うとエラーとなります。
    エラー内容
    ———————————————
    exit status 1
    ‘class EasyWebSocket’ has no member named ‘EWS_BrowserSendRate’
    ———————————————

    ↓ここでつまづいています。

    EasyWebSocket_test:50: error: ‘class EasyWebSocket’ has no member named
    ‘EWS_BrowserSendRate’
    html_str1 += ews.EWS_BrowserSendRate();

    ews.EWS_BrowserSendRate();

    #include を行っているので読み込まれているかと考えるのですが、何か気をつけないといけない点など御座いますでしょうか?
    “ライブラリをインクルード”には”EasyWebSocket”と”EasyWebSocket139″と2つあるのが問題とかありますでしょうか?

    宜しくお願いします。

  2. kato より:

    先程EWS_BrowserSendRateのエラーのコメントを書き込みを行った者です。
    無事解決しましたのでご安心下さいませ。

    結果から言うと一つ下のバージョンEasyWebSocketのライブラリを利用していたのが原因だった様です。
    削除したら問題なく書き込みを行えました。

    • mgo-tec mgo-tec より:

      katoさま

      ライブラリご使用いただき、ありがとうございます。
      無事解決して何よりです。
      そうなんですよね。新しいバージョンのライブラリをインストールするときは、古いライブラリのフォルダを削除しなければならないんです。
      本当はライブラリのオートアップデートに対応させたいところですが、まだまだベータ版なのでお許しください。

タイトルとURLをコピーしました