hiro yamamoto works

マイコンハード、ソフトを作ったりしています。
お家や現場のお困りごと解決に!
内容利用は自己責任でお願いします。

ESP32 SDから設定を読んでWi-Fi接続する

2021-06-27 09:03:00 | マイコンハードウェア
スケッチ例SDWebServerを改変して
ESP32 WiFi SSID,passwordをSDメモリから設定する。

その他の機能
・SDから変数を代入することも可能です。
・セキュリティ対策として、
 設定ファイルだけwebから見えなくしました。
参考記事 特定ファイルを開かせない・・・を見て下さい。

作例をWeb公開している方々に感謝します。


設定ファイルについて
例えば、SDメモリカードにsetupというフォルダを作り、
setup.txtというファイルを作って保存します。
(ファイル、フォルダ名は、スケッチと合わせて下さい。
また、必ずフォルダに入れる必要はありません。)

setup.txt例
##以降はコメントとして扱われます。
#SSのあとにSSID、paのあとにpasswordを入力してください
#SS your-SSID #SSID
#pa your-password #password
#
SS ********** #SSID
pa ********** #password
#
#gw 192,168, 1, 1 #gateway
#sn 255,255,255, 0 #subnet
#dn 192,168, 1, 1 #dnS1
#ip 192,168, 1, 10 #ip address
#
gw 192,168, 1, 1 #gateway
sn 255,255,255, 0 #subnet
dn 192,168, 1, 1 #dnS1
ip 192,168, 1, 10 #ip address
#
# interval time 測定間隔
it 30000 #mSec 1000=1sec


スケッチ
スケッチ例SDWebServerをベースに、追加変更部分を下記に
載せます。追加変更位置がわかるように前後スケッチを表示
していますので、目印にしてオリジナルのスケッチへコピペ
してください。

ip address,gateway,sabnet,dns 固定不要ならIPAdressと
WiFi.config 行頭に // つけてコメントアウトしてください。

#include行のライブラリ名を半角<>で囲んで下さい。

#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <SPI.h>
#include <SD.h>

#define DBG_OUTPUT_PORT Serial

//const char* ssid = "**********";
//const char* password = "**********";
char ssid[30]; // 追加
char password[30]; // 追加
const char* host = "esp32sd";
int gw[4], sn[4], dn[4], ip[4]; // 追加
int interval_t; // 追加 例 SDファイルから読み込む変数

WebServer server(80);
〜中略〜
else if (path.endsWith(".zip")) {
dataType = "application/zip";
}
//追加 setup.txtをwebから開こうとした時「ページが見つかりません」表示する
if (path == "/setup/setup.txt") {
server.send(404, "text/plain", ""); // 追加
} else { // 追加

File dataFile = SD.open(path.c_str());
if (dataFile.isDirectory()) {
path += "/index.htm";
dataType = "text/html";
dataFile = SD.open(path.c_str());
}
〜中略〜
dataFile.close();
return true;
} // 追加
}

void handleFileUpload() {
if (server.uri() != "/edit") {
return;
}
〜中略〜
void setup(void) {
if (SD.begin(SS)) { // 場所変更 変更後の場所
DBG_OUTPUT_PORT.println("SD Card initialized.");
hasSD = true; // 場所変更
} // 場所変更
DBG_OUTPUT_PORT.begin(115200);
DBG_OUTPUT_PORT.setDebugOutput(true);
DBG_OUTPUT_PORT.print("\n");
// 追加 ここから〜終了まで
File dataFile = SD.open("/setup/setup.txt", FILE_READ); // 設定ファイルをフォルダ/ファイル名でオープン
if (dataFile) {
while (dataFile.available()) {//dataFileを1行づつ評価していく
String line = dataFile.readStringUntil('\n');//終端文字'\n'が検出されるまで読んで文字列全体をlineへ入れる
line = line.substring(0, line.indexOf('#'));//インデックス0(行頭)から(#までのインデックス数)の文字列取得
if (line.substring(0, 2) == "SS") {
String ss = line.substring(line.indexOf(' '));//スペースから行末まで
ss.trim();//スペースを除去
ss.toCharArray(ssid, ss.length() + 1);
} else if (line.substring(0, 2) == "pa") {
String pass = line.substring(line.indexOf(' '));
pass.trim();
pass.toCharArray(password, pass.length() + 1);
} else if (line.substring(0, 2) == "gw") {
String gw0 = line.substring(3, 6); String gw1 = line.substring(7, 10);
String gw2 = line.substring(11, 14); String gw3 = line.substring(15, 18);
gw[0] = gw0.toInt(); gw[1] = gw1.toInt(); gw[2] = gw2.toInt(); gw[3] = gw3.toInt();
} else if (line.substring(0, 2) == "sn") {
String sn0 = line.substring(3, 6); String sn1 = line.substring(7, 10);
String sn2 = line.substring(11, 14); String sn3 = line.substring(15, 18);
sn[0] = sn0.toInt(); sn[1] = sn1.toInt(); sn[2] = sn2.toInt(); sn[3] = sn3.toInt();
} else if (line.substring(0, 2) == "dn") {
String dn0 = line.substring(3, 6); String dn1 = line.substring(7, 10);
String dn2 = line.substring(11, 14); String dn3 = line.substring(15, 18);
dn[0] = dn0.toInt(); dn[1] = dn1.toInt(); dn[2] = dn2.toInt(); dn[3] = dn3.toInt();
} else if (line.substring(0, 2) == "ip") {
String ip0 = line.substring(3, 6); String ip1 = line.substring(7, 10);
String ip2 = line.substring(11, 14); String ip3 = line.substring(15, 18);
ip[0] = ip0.toInt(); ip[1] = ip1.toInt(); ip[2] = ip2.toInt(); ip[3] = ip3.toInt();
} else if (line.substring(0, 2) == "it") {//例setup.txtのitという項目を変数interval_tへ設定
String it = line.substring(line.indexOf(' '));//スペースから行末まで
interval_t = it.toInt(); // データ型変換
}
}
dataFile.close();
} else {
Serial.println("error opening setup.txt");
}

IPAddress local_IP(ip[0], ip[1], ip[2], ip[3]);
IPAddress gateway(gw[0], gw[1], gw[2], gw[3]);
IPAddress subnet(sn[0], sn[1], sn[2], sn[3]);
IPAddress dns1(dn[0], dn[1], dn[2], dn[3]);
WiFi.mode(WIFI_STA);
WiFi.config(local_IP, gateway, subnet, dns1);
// 追加 終了(ここまで)

WiFi.begin(ssid, password);
DBG_OUTPUT_PORT.print("Connecting to ");
DBG_OUTPUT_PORT.println(ssid);
〜中略〜
server.begin();
DBG_OUTPUT_PORT.println("HTTP server started");

/*場所変更 元の場所
if (SD.begin(SS)) {
DBG_OUTPUT_PORT.println("SD Card initialized.");
hasSD = true;
}*/
}

void loop(void) {
server.handleClient();
delay(2);//allow the cpu to switch to other tasks
}


・ArduinoIDEにコピペしたらメニューの「ツール」「自動整形」
 で見やすくなります。
・#includeライブラリ名<>を半角に直して下さい。
・SDに入れておくファイルはsetup.txt以外にもあります。
 SDWebServer開いておき、「スケッチ」「スケッチのフォルダを
 表示」、sdRootのフォルダを開き、中のファイルをSDにコピ
 ーして下さい。オリジナルのコメントより

無保証自己責任でよろしくお願いします。

最新の画像もっと見る

コメントを投稿