良いねや読者登録
有り難うございます。
昨日はiPhoneのブラウザでESP-WROOM-02
のフラッシュメモリに登録したデータを書き換えました。
これはiPhoneじゃなくてもAndroidでもPCでも
WiFiに繋がれば試してみられます。
今日は、iPhoneの画面からESP-WROOM-02の
IOに繋いだLEDをON-OFFします。
ついでに、iPhoneの表示を変えてみます。
スケッチ
小さいパッケージにこれだけ書き込めるという優秀さ
/* Create a WiFi access point and provide a web server on it. */
// modefy 2022/8/29
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <FS.h>
#define FORMAT_SPIFFS_IF_FAILED true
const int OUT = 16; //LED OUT
const int IN = 14;
unsigned long time_data = 0;
unsigned long timer_start = 0;
unsigned long second = 0;
int out1 = 0;
int inputMode = 0;
String spiffs_data[12];
String mainForm;
String maintenanceMenu;
String wifiMenu;
String timerMenu;
String form;
ESP8266WebServer server(80);
void setup() {
delay(1000);
Serial.begin(115200);
Serial.println("");
/*
* SPIFFSを開始する
* SPIFFSが開始できない場合はエラーを出して終了する。
*/
if(!SPIFFS.begin()){ //FORMAT_SPIFFS_IF_FAILED
Serial.println("SPIFFS Mount Failed");
return;
}
/*
* フラッシュメモリのデータを読み込んで配列に入れる
*/
String readStr;
Dir dir = SPIFFS.openDir("/");
while (dir.next()) {
File f = dir.openFile("r");
int i = 0;
while(f.available()){
readStr = f.readStringUntil(',');
spiffs_data[i] = readStr;
i++;
}
for(int j = 0; j < 12; j++){
Serial.print("spiffs_data[");
Serial.print(j);
Serial.print("]=");
Serial.println(spiffs_data[j]);
}
f.close();
}
/*
* アクセスポイントとHTTPサーバーを開始する
*/
Serial.println("Configuring access point...");
delay(40);
const char *ssid = spiffs_data[0].c_str();
const char *password = spiffs_data[1].c_str();
IPAddress ip(spiffs_data[2].toInt(), spiffs_data[3].toInt(), spiffs_data[4].toInt(), spiffs_data[5].toInt());
IPAddress subnet(spiffs_data[6].toInt(), spiffs_data[7].toInt(), spiffs_data[8].toInt(), spiffs_data[9].toInt());
WiFi.softAPConfig(ip, ip, subnet);
WiFi.softAP(ssid, password);
IPAddress myIP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(myIP);
server.on("/", handleRoot);
server.on("/maintenance", handle_maintenance);
server.on("/wifi_setting", handle_wifi_setting);
server.on("/timer_setting", handle_timer_setting);
server.on("/start", handle_start);
server.on("/stop", handle_stop);
server.on("/back", handleRoot);
server.begin();
Serial.println("HTTP server started");
pinMode(OUT, OUTPUT);
pinMode(IN, INPUT_PULLUP);
mainFormMade();
}
void loop() {
time_data = millis();
int value1;
int value2;
int value3;
value1 = digitalRead(IN);
server.handleClient();
if(value1 == 0){
if(out1 == 0){
//出力をONする
inputMode = 1;
start_led();
} else {
//出力をOFFする
stop_led();
}
}
if(out1 == 0){
//タイマーを初期化
timer_reset();
}
if(out1 == 1){
//タイマーを動かす
if(((time_data - timer_start) % 1000) == 0){
second = (time_data - timer_start) / 1000;
}
}
if(inputMode == 1){ //親機のボタンで点灯した場合
if(second >= spiffs_data[10].toInt()){
//出力をOFFする
stop_led();
}
} else { //子機のボタンで点灯した場合
if(second >= spiffs_data[11].toInt()){
//出力をOFFする
stop_led();
}
}
}
void timer_reset(){
timer_start = 0;
second = 0;
}
void start_led(){
out1 = 1;
Serial.println("start");
digitalWrite(OUT, HIGH);
delay(500);
timer_start = millis();
}
void stop_led(){
out1 = 0;
inputMode = 0;
Serial.println("stop");
digitalWrite(OUT, LOW);
delay(500);
//タイマーを初期化
timer_reset();
}
void handle_start() {
inputMode = 2;
start_led();
server.send(200, "text/html", mainForm);
}
void handle_stop() {
stop_led();
server.send(200, "text/html", mainForm);
}
void handleRoot() {
server.send(200, "text/html", mainForm);
}
void handle_maintenance(){
maintenanceMenuFormMade();
server.send(200, "text/html", maintenanceMenu);
}
void handle_wifi_setting(){
if(server.arg("ssid_text") != ""){
spiffs_data[0] = server.arg("ssid_text");
spiffs_data[1] = server.arg("password_text");
spiffs_data[2] = server.arg("ip1");
spiffs_data[3] = server.arg("ip2");
spiffs_data[4] = server.arg("ip3");
spiffs_data[5] = server.arg("ip4");
spiffs_data[6] = server.arg("sb1");
spiffs_data[7] = server.arg("sb2");
spiffs_data[8] = server.arg("sb3");
spiffs_data[9] = server.arg("sb4");
Serial.println(spiffs_data[0]);
Serial.println(spiffs_data[1]);
Serial.print(spiffs_data[2]);
Serial.print(".");
Serial.print(spiffs_data[3]);
Serial.print(".");
Serial.print(spiffs_data[4]);
Serial.print(".");
Serial.println(spiffs_data[5]);
Serial.print(spiffs_data[6]);
Serial.print(".");
Serial.print(spiffs_data[7]);
Serial.print(".");
Serial.print(spiffs_data[8]);
Serial.print(".");
Serial.println(spiffs_data[9]);
writeFile(SPIFFS, "/spiffs.txt");
}
wifiMenuFormMade();
server.send(200, "text/html", wifiMenu);
}
void handle_timer_setting(){
if(server.arg("main_button") != "" && server.arg("table_button") != ""){
spiffs_data[10] = server.arg("main_button");
spiffs_data[11] = server.arg("table_button");
Serial.println(spiffs_data[10]);
Serial.println(spiffs_data[11]);
writeFile(SPIFFS, "/spiffs.txt");
}
timerMenuFormMade();
server.send(200, "text/html", timerMenu);
}
//SPIFFSファイルに書き出す
void writeFile(fs::FS &fs, const char * path){
File file = fs.open(path, "w");
if(!file){
return;
}
String message = spiffs_data[0];
for(int i=1; i<12; i++){
message += "," + spiffs_data[i];
}
file.print(message);
}
//mainFormのHTMLを作る
void mainFormMade(){
/**
* WEBに表示されるmainForm画面
*/
mainForm = "<html><head><meta name=viewport content='width=device-width, initial-scale=1.0'></head>"
"<form action=start><input type= submit value=start target=tif></form>"
"<form action=stop><input type=submit value=stop target=tif></form>"
"<br><br>"
"<form method='post' action=maintenance>"
"<input type='submit' value='maintenance'><br>"
"</form>"
"</html>";
}
//maintenanceMenuFormのHTMLを作る
void maintenanceMenuFormMade(){
/**
* WEBに表示されるmaintenanceMenuForm画面
*/
maintenanceMenu = "<html><head><meta name=viewport content='width=device-width, initial-scale=1.0'></head>"
"<form action=wifi_setting><input type= submit value=wifi target=tif></form>"
"<form action=timer_setting><input type=submit value=timer target=tif></form>"
"<br><br>"
"<form action=back><input type=submit value=back target=tif></form>"
"</html>";
}
//wifi設定HTMLを作る
void wifiMenuFormMade(){
/**
* WEBに表示されるWiFi設定画面(入力画面)
*/
wifiMenu = "<html><head><meta name=viewport content='width=device-width, initial-scale=1.0'></head>"
"<form method='post' action=wifi_setting>"
"<div>SSID:"
"<input type='text' name='ssid_text' value=";
wifiMenu += spiffs_data[0];
wifiMenu += " placeholder='ssid_text' style='width:120px;'; pattern='[!-~]*$' required><br>"
"</div>"
"<div>PASSWORD:"
"<input type='text' name='password_text' value=";
wifiMenu += spiffs_data[1];
wifiMenu += " placeholder='password_text' style='width:80px;' pattern='[a-z]*$' required><br>"
"</div>"
"IP ADDRESS:"
"<input type='number' name='ip1' value=" + spiffs_data[2] + " placeholder='ip1' style='width:35px;' required>"
"<input type='number' name='ip2' value=" + spiffs_data[3] + " placeholder='ip2' style='width:35px;' required>"
"<input type='number' name='ip3' value=" + spiffs_data[4] + " placeholder='ip3' style='width:35px;' required>"
"<input type='number' name='ip4' value=" + spiffs_data[5] + " placeholder='ip4' style='width:35px;' required><br>"
"SUB NET:"
"<input type='number' name='sb1' value=" + spiffs_data[6] + " placeholder='sb1' style='width:35px;' required>"
"<input type='number' name='sb2' value=" + spiffs_data[7] + " placeholder='sb2' style='width:35px;' required>"
"<input type='number' name='sb3' value=" + spiffs_data[8] + " placeholder='sb3' style='width:35px;' required>"
"<input type='number' name='sb4' value=" + spiffs_data[9] + " placeholder='sb4' style='width:35px;' required><br>"
"<input type='submit'><br>"
"</form>"
"<br><br>"
"<form action=back><input type=submit value=back target=tif></form>"
"</html>";
}
//timer設定HTMLを作る
void timerMenuFormMade(){
timerMenu = "<html><head><meta name=viewport content='width=device-width, initial-scale=1.0'></head>"
"<form method='post' action=timer_setting>"
"<input type='number' name='main_button' value=" + spiffs_data[10] + " placeholder='main_button' style='width:80px;'><br>"
"<input type='number' name='table_button' value=" + spiffs_data[11] + " placeholder='table_button' style='width:80px;'><br>"
"<input type='submit'><br>"
"</form>"
"<br><br>"
"<form action=back><input type=submit value=back target=tif></form>"
"</html>";
}
昨日も書きましたがフラッシュメモリの
読み込みはsetup()で行っていますので
フラッシュメモリを変更した場合は
リセットして反映させる必要があります。
ESP-WROOM-02と周辺回路
手前にあるLEDがON-OFFします。
上に見えるショートピンがIO14に繋がっていて
ショートするとIO14がGNDに落ちます。
左下にあるピンはRS232通信用の
RXD、TXD、GNDです。
上の左にあるショートピンは
書き込みモードと実行モードを
変えるためのものです。
左下のボタンはリセットボタンです。
電源はACアダプタで3.3V2.2Aを
供給しています。
スケッチを書き込んで実行モードでリセットすると
アクセスポイントとHTTPサーバーが起動します。
iPhone、スマホまたはPCのWiFi設定で
アクセスポイントのSSIDを選択し、
パスワードを入力するとアクセスポイントに
繋がります。
iPhoneのWiFi設定画面
ブラウザでESP-WROOM-02のIPアドレスに接続したところ
スタートボタンを押すとLEDが点灯し、
ストップボタンを押すと消灯します。
maintenanceボタンを押したところ
maintenance画面でwifiボタンを押したところ
SSID、パスワード、IPアドレス、
サブネットの変更ができます。
maintenance画面でtimerボタンを押したところ
上段がIO14でLEDを点灯したときの点灯時間(秒)
下段がスマホで点灯したときの点灯時間(秒)
点灯時間を過ぎると自動消灯します。
時間内でもストップボタンを押すと消灯します。
次回は、ESP-WROOM-02同士でWiFi接続し
子機のIOに繋いだボタンを押すと親機の
LEDが点灯するようにします。
(部品を用意するので少しお待ちください。)
このブログが良いなって
思った方は『良いね』をクリック
続きも読んで頂ける方は
『読者登録』