こんばんは。
以前から少々お問い合わせいただいたために、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 当ブログのおすすめ












コメント
ライブラリについてご質問が御座います。
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つあるのが問題とかありますでしょうか?
宜しくお願いします。
先程EWS_BrowserSendRateのエラーのコメントを書き込みを行った者です。
無事解決しましたのでご安心下さいませ。
結果から言うと一つ下のバージョンEasyWebSocketのライブラリを利用していたのが原因だった様です。
削除したら問題なく書き込みを行えました。
katoさま
ライブラリご使用いただき、ありがとうございます。
無事解決して何よりです。
そうなんですよね。新しいバージョンのライブラリをインストールするときは、古いライブラリのフォルダを削除しなければならないんです。
本当はライブラリのオートアップデートに対応させたいところですが、まだまだベータ版なのでお許しください。