M5StickC의 자세를 검지하여 시정 잠금 이력 관리

개요


  • 도어의 시개정 이력을 가능한 한 저렴한 구조로 취득하고 싶다.
  • 기존의 것에서는 삼턴에 씌우는 타입의 스마트 락이 있지만, 비싸다.
  • 예를 들면 노인의 안부 확인에 스마트 락은 필요 없다. 시개정 이력만 있으면 충분하지 않은가.











  • 준비하는 것


  • M5StickC
  • Arduino IDE가 움직이는 PC (Mac/Windows)

  • 환경 구축



    (1) Arduino IDE 설치
    htps //w w. 아르즈이의. C / En / Main / 그 f와
    (2) M5StickC 관련 라이브러리 설치
    스케치 → 라이브러리 포함 → 라이브러리 관리
    M5StickC 검색

    프로그래밍


  • M5StickC의 6 축 센서를 사용하여 어느 축이 위쪽을 향하고 있는지 감지합니다
  • 디스플레이에 OPEN/CLOSE로 표시한다.
  • Wifi를 통해 Ambient로 전송하고 시각화 (1 : OPEN 0 : CLOSE).

    lockstate.ino
    #include <M5StickC.h>
    #include "Ambient.h"
    
    #define POSE_P_X 0
    #define POSE_M_X 1
    #define POSE_P_Y 2
    #define POSE_M_Y 3
    #define POSE_P_Z 4
    #define POSE_M_Z 5
    uint8_t pose = POSE_P_X;
    uint8_t prev_pose = POSE_P_X;
    
    WiFiClient client;
    Ambient ambient;
    
    const char* ssid = "xxxxxxxxxxxxxx";
    const char* password = "xxxxxxxxxxxx";
    
    unsigned int channelId = "xxxxx"; // AmbientのチャネルID
    const char* writeKey = "xxxxxxxxxxxxxxxx"; // ライトキー
    
    // 加速度
    float accX_g = 0;
    float accY_g = 0;
    float accZ_g = 0;
    float accX_mpss = 0;
    float accY_mpss = 0;
    float accZ_mpss = 0;
    
    // 角速度
    float gyroX_dps = 0;
    float gyroY_dps = 0;
    float gyroZ_dps = 0;
    
    boolean near_p_g(float value){
      if(8.0 < value && value < 12.0){
        return true;
      }else{
        return false;
      }
    }
    
    boolean near_m_g(float value){
      if(-12.0 < value && value < -8.0){
        return true;
      }else{
        return false;
      }
    }
    
    boolean near_zero(float value){
      if(-2.0 < value && value < 2.0){
        return true;
      }else{
        return false;
      }
    }
    
    void setup() {
      // Initialize the M5StickC object
      M5.begin();
      M5.MPU6886.Init();
      M5.Lcd.setRotation(1);
      M5.Lcd.fillScreen(BLACK);
      M5.Lcd.setTextSize(1);
    
          WiFi.begin(ssid, password);  //  Wi-Fi APに接続
        while (WiFi.status() != WL_CONNECTED) {  //  Wi-Fi AP接続待ち
            delay(500);
            Serial.print(".");
        }
        Serial.print("WiFi connected\r\nIP address: ");
        Serial.println(WiFi.localIP());
    
        ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化
    }
    
    void loop() {
    
      M5.Lcd.fillScreen(BLACK);
      M5.Lcd.setTextSize(3);
    
      // 加速度取得
      M5.MPU6886.getAccelData(&accX_g,&accY_g,&accZ_g);
      accX_mpss = accX_g * 9.8;
      accY_mpss = accY_g * 9.8;
      accZ_mpss = accZ_g * 9.8;
      // 角速度取得
      M5.MPU6886.getGyroData(&gyroX_dps,&gyroY_dps,&gyroZ_dps);
    
      if(near_zero(accX_mpss) && near_p_g(accY_mpss) && near_zero(accZ_mpss)){
        pose = POSE_P_Y;
      }else if(near_p_g(accX_mpss) && near_zero(accY_mpss) && near_zero(accZ_mpss)){
        pose = POSE_P_X;
      }else if(near_zero(accX_mpss) && near_zero(accY_mpss) && near_p_g(accZ_mpss)){
        pose = POSE_P_Z;
      }else if(near_zero(accX_mpss) && near_m_g(accY_mpss) && near_zero(accZ_mpss)){
        pose = POSE_M_Y;
      }else if(near_m_g(accX_mpss) && near_zero(accY_mpss) && near_zero(accZ_mpss)){
        pose = POSE_M_X;
      }else if(near_zero(accX_mpss) && near_zero(accY_mpss) && near_m_g(accZ_mpss)){
        pose = POSE_M_Z;
      }
    
      // 姿勢に変化があった場合にのみ描画する
      if(prev_pose != pose){
        M5.Lcd.fillScreen(BLACK);
        switch(pose){
          case POSE_M_X:
            M5.Lcd.setRotation(3);
            M5.Lcd.setCursor(56, 16);
            M5.Lcd.print("CLOSE");
            // 施錠の情報をAmbientに送信する
            ambient.set(1, 0);
            ambient.send();
            delay(500);
            break;
          case POSE_P_Y:
            M5.Lcd.setRotation(3);
            M5.Lcd.setCursor(56, 16);
            M5.Lcd.print("OPEN");
            // 解錠の情報をAmbientに送信する
            ambient.set(1, 1);
            ambient.send();
            delay(500);
            break;
            default:
            ;
            }
        }
      prev_pose = pose;
      delay(100);
    }
    

    주의점


  • 삼턴의 조작성을 손상시키지 않는 설치 방법을 고안할 필요가 있다.
  • 어떠한 전원(모바일 배터리 등)으로 급전해 둘 필요가 있다.

  • 기타


  • 화면 표시의 밝기, 표시 시간을 조정하면 절전할 수 있다.
  • 앱을 구축해 API에 송신하도록 하면 복수 개소의 대응, 경고 메일을 송신하는 등 기능을 늘릴 수 있다.
  • 도어의 시정정 이외의 용도에도 응용할 수 있을지도 모른다.
  • 좋은 웹페이지 즐겨찾기