良いねや読者登録

有り難うございます。笑い泣き

 

昨日は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が点灯するようにします。

(部品を用意するので少しお待ちください。汗うさぎ

 

 

   

このブログが良いなって

思った方は『良いね』をクリックおねがい

 

続きも読んで頂ける方は

『読者登録』ラブ