hiro yamamoto works

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

赤外線リモコンWi-Fi中継の応用 Webページからテレビを操作(WiFiMangerスケッチを改変したところなど)

2024-04-03 14:30:52 | マイコンソフト&ハードウェア

スケッチ改変ポイントなどを説明してみようかと思いました。
間違い、文字化けがあるかもしれません。

素晴らしいライブラリ、サンプルスケッチを公開してくださっている方々に感謝します。

Wi-Fi接続と固定IPアドレス設定のために"WiFiManager"ライブラリの
"Advanced"サンプルスケッチで設定したIPAddress、Gateway、Subnetを
(Gatewey、Subnetは不要かもしれない)EEPROMへ保存している。
SSIDとPASSWORDは初回設定後引数指定せずにWiFi.begin();
としてESP32内部に保存された前回WiFi認証情報を使って接続する。

#define INI_SETUP_PIN 15 //ESP32 DEV Module INPUT_PULLUP
中略
EEPROMへのデータ保存準備
//>>> EEPROM put アドレスを指定する
//なぜかEEPROM_SSID_ADDRESS 0のデータだけ電源OFF-ONで化けるので使っていない
#define EEPROM_SSID_ADDRESS 0 //使っていないが削除して不具合が出ないか心配で残してある
#define EEPROM_PASS_ADDRESS 32 //使っていないが削除して不具合が出ないか心配で残してある
#define EEPROM_IP_ADDRESS   64
#define EEPROM_GATEWAY      96
#define EEPROM_SUBNET       128 // 1アドレスに1byte String savedSSID;//それぞれの情報が入る変数
String savedPassword;
IPAddress savedIP; //IPAddress型
IPAddress savedGateway;
IPAddress savedSubnet;
//<<< EEPROM PUT

  //>>>> EEPROM setup
  Serial.println("\nTesting EEPROM Library\n");
  if (!EEPROM.begin(512)) { //512byte
    Serial.println("Failed to initialise EEPROM");//"EEPROMの初期化に失敗しました"
    Serial.println("Restarting...");//再起動せずにLEDを高速点滅して停止
    delay(1000);
    Serial.println("stop...");
    while (1) {
      // LEDを高速点滅する
      digitalWrite(LED_BUILTIN, HIGH);
      delay(100);
      digitalWrite(LED_BUILTIN, LOW);
      delay(100);
    }
    //ESP.restart();//これで再起動もできますが、再起動で解決できないことが多いかも
  } else {
    Serial.println("EEPROM Library Test OK ");
  } //<<<< EEPROM setup

GPIO15がHIGHの時 EEPROMに保存したWiFi認証&IP情報で接続する。
GPIO15がLOWの時 強制的にconfigPortalを起動して設定&接続する。
if (digitalRead(INI_SETUP_PIN) == HIGH) { //GPIO15(INPUT_PULLUP)HIGHの時はEEPROMからGETした情報でWiFi接続する
    //LOWのときはconfigPortalを起動してWiFi認証、接続情報設定する
    Serial.println("Previous WiFi authentication and connection with IP address in EEPROM");
    //"以前のWiFi認証とEEPROM内のIPアドレスによる接続"
    eepromGetData(); // EEPROMから保存済のIPアドレスを各変数へ読み込む(WiFi認証情報は未使用)
    IPAddress dns1 = savedGateway;//dns1はGateweyと同じなので代入
    WiFi.config(savedIP, savedGateway, savedSubnet, dns1);//ESP 引数順序厳守 NTPサーバ名アクセス時dns1要
    WiFi.begin();// ESP32内部に保存された前回WiFi認証情報(SSID、PASSWORD)を使って接続する
    //>>> 2024.01.29     Serial.print("Connecting to WiFi");
    uint8_t i = 0;
    while (WiFi.status() != WL_CONNECTED && i++
      digitalWrite(LED_BUILTIN, HIGH);
      delay(250);
      digitalWrite(LED_BUILTIN, LOW);
      delay(250);
      //delay(500);
      Serial.print(i); //Serial.print(".");
    }/* while(WiFi.status() != WL_CONNECTED &&...*/
    //Serial.println(i);
    if (i >= 20) { //iが20以上の時はWiFi認証情報に問題があると思われるのでconfigPortalを起動して設定し直す
      Serial.println("Connection Failed!");
      //wm.resetSettings();// wipe settings
      //ESP.restart(); //ESP32を再起動
      //<<
      startConfigPortal();//configPortal起動 関数にしてみました
    } /*if (i >= 20)*/
  } else { //if (INI_SETUP_PIN == HIGH)//GPIO15がHIGHじゃない時     //>>>> WiFiManagerのconfigPortalで接続設定 //関数化する
    startConfigPortal();//configPortal起動 関数にしてみました   }


それぞれの関数は適切な位置へ挿入してください。
関数startConfigPortal()
configPortalの一部分を関数化したものです。
"WiFiManager"ライブラリの
"Advanced"サンプルスケッチの改変部分だけ記載しています。
void startConfigPortal() {
中略
  //set static ip固定IPアドレスをセットする ここに書いたアドレスがデフォルト設定として表示されます。
  wm.setSTAStaticIPConfig(IPAddress(192, 168, 2, 100), IPAddress(192, 168, 2, 1), IPAddress(255, 255, 255, 0)); // set static ip,gw,sn
  中略
//bool res;
  // res = wm.autoConnect(); //chipidからAP名を自動生成 auto generated AP name from chipid
  // res = wm.autoConnect("AutoConnectAP"); //匿名AP anonymous ap
  //res = wm.autoConnect("AutoConnectAP","password"); //パスワードで保護されたAP password protected ap
  /*if(!res) { //戻り値が"false"接続失敗 (res = wm.autoConnect()使用時)
    Serial.println("Failed to connect or hit timeout");
    //ESP.restart();
    } else {
    //ここまで来れば、WiFiに接続したことになる。 if you get here you have connected to the WiFi
    Serial.println("connected...yeey :)??");
    }*/
  /*暫定的に無効化するため関数にして移動した*/
  // start portal w delay
  Serial.println("Starting config portal");
  wm.setConfigPortalTimeout(120);
  if (!wm.startConfigPortal("OnDemandAP", "password")) {
    Serial.println("failed to connect or hit timeout");
    delay(3000);
    // ESP.restart();
  } else {
    //if you get here you have connected to the WiFi
    Serial.println("now connected...yeey :)");
    eepromPutData();
//WiFi認証情報と静的IP設定を保存 関数名変更SaveConfigCallbackをeepromPutDataへ
  }
  eepromGetData(); // EEPROMから(保存済の?)WiFi認証とIPアドレスをそれぞれの変数へ読み込む
} //<<<


関数eepromGetData()
//EEPROMからWiFi認証(保存NGだった)とIPアドレスをそれぞれの変数へ読み込む
void eepromGetData() {
  //EEPROM.get(EEPROM_SSID_ADDRESS, savedSSID);//SSIDが電源ON-OFFで化けるため使用中止した
  //EEPROM.get(EEPROM_PASS_ADDRESS, savedPassword);//SSID、PASSWORDは設定すると記憶される基本的な機能を活用
  EEPROM.get(EEPROM_IP_ADDRESS, savedIP);
  EEPROM.get(EEPROM_GATEWAY, savedGateway);
  EEPROM.get(EEPROM_SUBNET, savedSubnet);
}


関数eepromPutData () は設定が終わったIPアドレスをESP32のEEPROMへ保存します。
WiFi認証情報の保存、読み出しはうまく行かなかった。
void eepromPutData () {
//関数名変更SaveConfigCallbackをeepromPutDataへ
  Serial.println("Save button pressed, saving WiFi credentials and static IP configuration...");
  //"保存ボタンが押され、WiFi認証情報と静的IP設定が保存されました..."
  EEPROM.put(EEPROM_SSID_ADDRESS, WiFi.SSID());//SSIDはEEPROM保存しているが使っていない
  EEPROM.put(EEPROM_PASS_ADDRESS, WiFi.psk());//PASSWORD(psk)はEEPROM保存しているが使っていない
  EEPROM.put(EEPROM_IP_ADDRESS, WiFi.localIP());
  EEPROM.put(EEPROM_GATEWAY, WiFi.gatewayIP());
  EEPROM.put(EEPROM_SUBNET, WiFi.subnetMask());
  EEPROM.commit();
}

だんだんわからんなってきた

つづく
"SimpleWiFiServer"
"IRremote"ライブラリの"SendRawDemo"
受信したデータを赤外線リモコン信号にしてテレビへ送信する



最新の画像もっと見る

コメントを投稿