M5StickC를 도어 센서 (& 개폐 통지)로 설정

18185 단어 M5StickCDIY
일요일 DIY. 집인의 외출이나 귀가를 왠지 알 수 있도록, M5StickC + ENV Hat로 집의 도어 센서를 만들었다(3000엔 전후).


하드웨어 조달



  • M5 StickC (2000엔 전후)

  • M5 StickC Env Hat (500엔 전후)
  • USB 전원 (USB 케이블은 StickC와 함께 제공되는 것을 사용)
  • 자석, 히츠키 벌레

  • 개발



    개발 환경


  • 다양한 사이트를 참고로 하면서 시행착오했기 때문에 모호하지만,, 주로는 아래와 같이
  • ESP32 (StickC의 내부 코어)와 USB 직렬 통신을위한 드라이버 설치

  • Arduino IDE 환경 구축
  • 소스 (include) 라이브러리 설치
  • 센서 관련 코드는 ENV Hat의 github에서

  • 참고 사이트
  • htps : // 등 sp 벨 ry 피. 몽곤타. 코 m / 호 w와 - s rt-m 5s ck - r 즈이 치 /
  • htps : // 아무도였다. 이오/사 mp㎇s/m5s한 ck/m5해 tckc/


  • 프로그램


    #include <M5StickC.h>
    #include <Wire.h>
    #include "bmm150.h"
    #include "bmm150_defs.h"
    #include <WiFi.h>
    #include <WiFiClientSecure.h>
    
    const char* wifi_ap_ssid = "XXXXXXXX";
    const char* wifi_ap_pass = "XXXXXXXX";
    
    String   door_state     = "close";
    uint16_t door_thr_close =  1600;
    uint16_t door_thr_open  =   800;
    uint16_t door_ignore    = 60000;
    uint32_t door_lastpost  = -door_ignore;
    
    BMM150 bmm = BMM150();
    
    void setup() {
      Serial.begin(115200);
      Serial.println("start debugging");
      Wire.begin(0,26);
      M5.begin();
      M5.Lcd.setRotation(3);
      M5.Lcd.fillScreen(BLACK);
      pinMode(M5_BUTTON_HOME, INPUT);
      initdev();
      M5.Lcd.fillScreen(BLACK);
    }
    
    void initdev(){
      M5.Lcd.setCursor(0, 0, 2);
      if(bmm.initialize() == BMM150_E_ID_NOT_CONFORM){ while(1); }
      M5.Lcd.printf("Mag sensor OK.\n");
    
      WiFi.begin(wifi_ap_ssid, wifi_ap_pass);
      while (WiFi.status() != WL_CONNECTED){ delay(500); }
      IPAddress ip = WiFi.localIP();
      M5.Lcd.printf("Wifi: %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);
      delay(2000);
    }
    
    uint8_t setup_flag = 1;
    void loop() {
      bmm.read_mag_data();
      int magval = (int)(sqrt(pow(bmm.raw_mag_data.raw_datax, 2) + pow(bmm.raw_mag_data.raw_datay, 2) + pow(bmm.raw_mag_data.raw_dataz, 2)));
      String state = "-----";
      if (door_thr_close < magval){ state = "close"; }
      if (magval < door_thr_open ){ state = "open"; }
    
      M5.Lcd.setCursor(0, 0, 2);
      M5.Lcd.printf("%06d [%s]  \n", magval, state);
      if ((state != "-----") && ((millis()-door_lastpost) > door_ignore) && (door_state != state)){
        door_state = state;
        door_lastpost = millis();
        String r = https_Web_Get("example.com", "/update?1=door&2=" + state + "&3=" + String(magval));
        M5.Lcd.printf("send: %s \n", state);
        M5.Lcd.println(r);
      }
      delay(200);
    
      if(!setup_flag){
        setup_flag = 1;
        initdev();
      }
      if(digitalRead(M5_BUTTON_HOME) == LOW){
        setup_flag = 0;
        while(digitalRead(M5_BUTTON_HOME) == LOW);
      }
      return;
    }
    
    String https_Web_Get(const char* host, String target_page){
      String res;
      WiFiClientSecure https_client;
      if (https_client.connect(host, 443)){
        String s = "GET https://" + String(host) + target_page + " HTTP/1.1\r\nHost: " + String(host) + "\r\n";
        s += "User-Agent: ESP32\r\nConnection: close\r\n\r\n\0";
        https_client.print(s);
        https_client.flush();
      }
      if(https_client){
        while(https_client.connected()){
          String r = https_client.readStringUntil('\n');
          if(0 <= r.indexOf("HTTP")){res = r;}
          Serial.println(r);
          if (r == "\r") break;
        }
        while (https_client.available()){ https_client.read(); }
        https_client.stop();
      }
      return res;
    }
    
  • 상기에서는 자력의 임계치는 800 이하에서 close, 1600 이상에서는 open 이다.
  • 채터링 방지를 위해, 상태 변화 통지 후 60초간은 다음의 통지를 실시하지 않게 하고 있다.
  • 통지처의 API는 당초 IFTTT로부터의 Email로 하고 있었지만, 통지가 느린 일이 있었기 때문에, 자작+Slack으로 했다.
  • 통신은 https이지만, 라이브러리에서는 서버 증명서의 검증까지는 하고 있지 않는 것 같기 때문에, 그 점 유의.
  • 기능가제, 각종 디버그 하고 싶은 경우는, Serial나 Display에서 적절히 printf 디버그.
  • ENV HAT는 기온/습도/기압의 데이터도 취할 수 있는 것 외, StickC 본체에는 마이크도 있기 때문에, 문이 열리면 녹음, 등 다양한 확장의 망상이 퍼집니다. StickV라고 더.

  • 설치 및 조정


  • 문쪽에 자석을 붙인다
  • 임계 값을 환경에 맞게 조정
  • 당초 USB 전원에 저렴한 것을 사용하면, 과전류로 뜨거워져 액정이 안 되어 1대 부수어 버렸다. USB 전원 접속 후는 3분 정도 본체 온도나 외형에 이상이 없는가 요 확인.
  • 좋은 웹페이지 즐겨찾기