M5Stick-C를 사용하여 SORACOM 버튼의 WiFi 버전을 만들어 보았습니다.

8956 단어 SORACOMM5SticCM5stack

소개



다른 기사에서 SORACOM LTE-M Button Plus를 복지 기기에 사용한 이야기를 썼습니다만, 개인의 집에서는 LTE-M이 편리한 경우가 많습니다만, 시설 등에서 WiFi가 들어가 있는 경우 또한 있는데, 이 경우는 LTE-M의 회선비가 싸다고는 해도 중하가 되는 경우가 있습니다. 그래서 SORACOM LTE-M Button Plus와 호환되는 WiFi 버튼을 M5Stick-C로 만들어 보았습니다.

구성



I/F로 SORACOM LTE-M Button Plus와 동일하게하기 위해 M5StickC의 GROVE 포트에 3.5Φ 스테레오 잭을 설치하십시오.
SORACOM LTE-M Button Plus 버튼은 M5StickC 메인 버튼에 기능을 할당합니다.
SORACOM LTE-M Button Plus측의 회로가 불명하므로, 엄밀하게 같은 것은 아닙니다만, 실측으로 단자간에 3V 걸리고 있으므로, 풀업의 입력으로 좋다고 생각합니다. 입력 포트는 G32입니다.

동작



움직임으로서는 다음과 같이 하고 싶습니다.
초기시(WiFi 미설정)
· AP 모드에서 시작
M5StickC의 웹 서버(192.168.4.1)에 접속하여 WiFi의 SSID, 패스워드 설정
WiFi 설정 후
· WiFi 클라이언트 모드로 시작
・버튼 누름(짧게 누름, 2도 누름, 길게 누름)의 검출
· 버튼 누름 감지로 서버 WebAPI 호출

호출하는 API는 SORACOM 버튼과 일치하므로 Beams의 WebHook에서 설정한 URL과 동일하게 합니다.

통상시는 슬립 상태로 해, 버튼으로 슬립 기동시키고 싶었습니다만, 이번은 시간의 사정으로 넣고 있지 않습니다(배터리 동작의 경우는 필요).

프로그램



WiFi의 설정을 실시하는 부분은 Arduino IDE의 M5Stack의 샘플 스케치 Advanced - WiFiSetting을 그대로 사용했습니다. ESP32에서는 WiFiManager 라는 라이브러리를 사용하면 코드가 적어집니다만, M5SttickC로 컴파일하면 에러가 되었으므로, 이쪽을 사용했습니다.
단지, 그대로라면 Web 페이지로 표시되는 문자가 영어이므로 일본 후의 표시로 조금 변경하고 있습니다.
(샘플을 별칭으로 복사하는 경우 하위 디렉토리의/detail도 복사하지 않으면 오류가 발생합니다.)

변경점
M5StickC의 경우 include를 다시 씁니다. 그런 다음 HTTPClient.h의 include를 추가합니다.
#include <M5StickC.h>   //変更
#include <HTTPClient.h>  //追加

makePage()
String makePage(String title, String contents) {
  String s = "<!DOCTYPE html><html lang='ja'><head><meta charset='UTF-8'>";
  s += "<meta name=\"viewport\" content=\"width=device-width,user-scalable=0\">";
  s += "<title>";
  s += title;
  s += "</title></head><body>";
  s += contents;
  s += "</body></html>";
  return s;
}

일본어를 볼 수 있도록 HTML 헤더를 변경합니다.
  String s = "<!DOCTYPE html><html lang='ja'><head><meta charset='UTF-8'>";

HTML 표시 부분의 영어를 일본어로 변경합니다.
이번에는 WiFi 설정 외에 서버 로그인 정보도 등록하는 부분도 추가합니다.
void startWebServer() {
  if (settingMode) {
    //WebAP mode IPアドレス
    M5.Lcd.println("Starting Web Server at");
    M5.Lcd.println(WiFi.softAPIP());
    webServer.on("/setap", []() {
      String ssid = urlDecode(webServer.arg("ssid"));
      M5.Lcd.println("SSID: ");
      M5.Lcd.println(ssid);
      String pass = urlDecode(webServer.arg("pass"));
      M5.Lcd.println("Writing SSID to EEPROM...");

      //WiFi設定の保存
      M5.Lcd.println("Writing Password to nvr...");
      preferences.putString("WIFI_SSID", ssid);
      preferences.putString("WIFI_PASSWD", pass);

      //WiFiボタン設定の保存
      userid = urlDecode(webServer.arg("userid"));
      button_pass = urlDecode(webServer.arg("password"));
      preferences.putString("USERID", userid);
      preferences.putString("PASSWD", button_pass);

      M5.Lcd.println("Write nvr done!");
      String s = "<h1>WiFi設定終了</h1><p>デバイスリセット後\"";
      s += ssid;
      s += "\" に接続します";
      webServer.send(200, "text/html", makePage("WiFi設定", s));
      delay(3000);
      //M5Stick-C再起動
      ESP.restart();
    });
    webServer.onNotFound([]() {
      String s = "<h1>WiFiボタン WiFi設定</h1><p>WiFiのSSID,パスワード入力</p>";
      s += "<form method=\"get\" action=\"setap\"><label>SSID: </label><select name=\"ssid\">";
      s += ssidList;
      s += "</select><br>Password: <input name=\"pass\" length=64 type=\"password\">";
      s += "<br><br>userid: <input name=\"userid\" length=64 type=\"text\">";
      s += "<br>pass: <input name=\"password\" length=64 type=\"password\"><br><input type=\"submit\"></form>";
      webServer.send(200, "text/html", makePage("Wi-Fi設定", s));
    });
  }
  webServer.begin();
}

WiFi 설정은 스마트 폰으로 WiFi SSID "WiWiButton_SETUP"에 연결하고 웹 브라우저에서 192.168.4.1에 액세스합니다.

샘플은 WiFi 설정 후의 재기동에서도 AP 모드로 기동하게 되어 있습니다만, 이번은 클라이언트로 동작시키기 때문에 setup의 부분을 변경합니다.
String userid = "";
String button_pass = "";
int type = 1;
int state = 0;
HTTPClient http;
int tp;

void setup() {
  m5.begin();

  pinMode(SW_PORT, INPUT_PULLUP);
  cktime = 0;
  btnst = 0;
  preferences.begin("wifi-config");

  delay(10);
  if (restoreConfig()) {
    //if (checkConnection()) {
      //WiFi設定済みの場合
      settingMode = false;      //WiFi設定モードOFF
      //startWebServer();
      return;
    //}
  }
  settingMode = true;           //WiFi設定モードON
  setupMode();
}

void loop() {
  if (settingMode) {
    webServer.handleClient();
  }else{
    switch_check();             //外部スイッチ検出処理
  }
}

버튼 감지
WiFi 설정 후 모드에서 SORACOM 버튼과 동일한 스위치 동작을 추가합니다.
//ボタン検出
int btnst;
unsigned long cktime;
unsigned long now;
unsigned long ck;
int cnt = 0;
int swBack = 0;
const int SW_PORT = 32;
//--------------------------------------------------------
//SORACOM ボタン等価の動作
//--------------------------------------------------------

void switch_check(){
  now = millis();
  if(cktime > 0){
    ck = now - cktime;
  }
  //外部スイッチ
  int sw = digitalRead(SW_PORT); 
  if(digitalRead(M5_BUTTON_HOME) == LOW || sw == LOW){
    if(btnst == 0){
      btnst = 1;
      cktime = millis();
      //Serial.print("ON ");
      ck = 0;
    }
    else if(btnst == 2){
      //Serial.print("ON DOUBLE");
      btnst = 5;
    }
  }else{
    if(btnst == 1){
      //SHORT
      //Serial.println("OFF");
      btnst = 2;
    }else if(btnst == 4){
      //Serial.println("OFF LONG");
      //LONG
      btnst = 0;
    }else if(btnst == 5){
      //Serial.println("OFF DOUBLE");
      btnst = 6;
      //DOUBLE
    }
  }

  if(btnst != 0 && ck > 1200){
    //Serial.println(btnst);
    if(btnst == 1){
      //LONG
      btnst = 4;
      state = 3;
      delay(200);
    }else if(btnst == 2){
      //SHORT
      state = 1;
      btnst = 0;
    }else if(btnst == 6){
      //DOUBLE
      btnst = 0;
      state = 2;
    }
  }
  if(digitalRead(M5_BUTTON_HOME) == LOW && digitalRead(M5_BUTTON_RST) == LOW){
    if(btnst != 5){
      cktime = millis();
      btnst = 5;
    }else if(btnst ==5 && ck > 2000){  //2秒長押し
      //WiFi設定消去   
      preferences.remove("WIFI_SSID");
      preferences.remove("WIFI_PASSWD");
      preferences.remove("USERID");
      preferences.remove("PASSWD");
      delay(3000);
      ESP.restart();
    }
  }else{
    if(btnst == 5){
      btnst = 0;
    }
  }

  //送信
  if(state != 0){
    tp = state;
    state = 0;
    cktime = 0;
    ck = 0;

    M5.Lcd.fillScreen(TFT_BLACK);
    M5.Lcd.setCursor(0, 0);
    M5.Lcd.println("Connecting");

    //WiFi接続
    M5.Lcd.println(wifi_ssid);
    M5.Lcd.println(wifi_password);

    WiFi.begin(wifi_ssid.c_str(),wifi_password.c_str());
    delay(200);
    while(WiFi.status() != WL_CONNECTED){
      delay(1000);
      M5.Lcd.print(".");
    }
    M5.Lcd.println("connected!");

    String type = String(tp);
    //WebAPIのURL
    String url = "https:/XXXXXXXX?id=" + userid + "&button_pass=" + type + "&type=" + type;

    http.begin(url);
    int st = http.GET();
    if(st > 0){
      M5.Lcd.println("");
      if(st == 200){
        String body = http.getString();
        M5.Lcd.println(body);
      }else{
        M5.Lcd.println(http.errorToString(st));
      }
    }
    http.end();
  }
}

요약



이제 서버 측을 동일하게 하고 SORACOM 버튼과 WiFi 버튼을 섞어서 사용할 수 있게 되었습니다.
보안적으로는 WiFi 라우터에 SORACOM Air의 SIM을 꽂아 SORACOM Beams를 경유시키는 편이 정답이라고 생각합니다.
복수의 스위치가 필요한 때에는, WiFi 버튼을 정리해 SORACOM에 접속하는 것 같은 사용법도 할 수 있네요.
SIM 대응 WiFi 라우터 Aterm HT100LN
htps //w w. rm. jp / p 로즈 ct / 어서 rms들 온 / p 로즈 ct / 모비 / HT 100l /

 

좋은 웹페이지 즐겨찾기