LINE Things로 쓰레기 일 알림 앱을 만들어 보았습니다.

17862 단어 linebotLIFFLINEThings

만든 것



휴지통에 착용 할 수있는 유형의 "쓰레기 일 알림"IoT 앱
LINE Things Award에 응모했습니다.
LINE bot상에서 움직일 수 있는 LIFF(LINE Front-end Framework)를 사용해, obniz에 정보를 등록해 obniz가 쓰레기의 날을 통지해 주는 앱을 만들었습니다.

LINE things의 좋은 곳은 독자적인 앱을 만들지 않아도 BLE 경유로 디바이스와 접속해 디바이스를 조작할 수 있는 점과
장치에서 LINE으로 자동으로 통신을 보낼 수있는 자동 통신이라는 기능을 사용하여 bot에서 메시지를 보낼 수 있다는 것이 좋은 점이었습니다!

만든 이유


  • 쓰레기를 버리는 것을 잊어버리는 경우가 많다
  • 집을 나온 뒤, 오늘 불타는 쓰레기의 날이었다 아아 아 쓰레기 ぃぃ와 슬퍼하는 것이 싫다.

  • 휴지통✖️IoT의 방향성으로서
  • 쓰레기의 날 캘린더라고 하는 서비스가 있으므로, 그것을 디바이스에 떨어뜨리면 편리하다고 생각했다.


  • 사용법


  • LIFF를 시작하여 살고있는 지구의 쓰레기 버림 정보를 입력하십시오.
  • 장치 측에 쓰레기 일 정보 등록
  • 쓰레기 일 전날이 되면, bot로부터 메시지가 온다(자동 통신) 디바이스의 LED 라이트가 빛난다
  • 쓰레기 일 당일이되면 장치에서 소리가 울리고 쓰레기 배출 알림을 받는다

  • 구성





    LINE Things의 BLE 통신을 할 수 있는 이점을 살린다면 wifi에 접속할 수 있는 obniz가 아니어도 좋다고 생각했지만, 집에 있었기 때문에 채용했습니다! 사용하기 쉽고 최고였습니다!

    개발 흐름


  • LIFF측
  • 요일 등록 화면의 개발 (친구에게 부탁했다)
  • BLE 협력 부분 개발

  • 디바이스 측
  • LINE THINGS 연계
  • BLE에서받은 정보 처리
  • 쓰레기 일 판정 처리
  • 통지 처리


  • 코드 발췌 및 개발 tips



    BLE 연결 정보



    obniz와 LIFF간에 공통 UUID를 신뢰하는 연결

    LIFF에서 장치를 찾고있는 곳 .js
        device.gatt.connect().then(() => {
            // Get service
            device.gatt.getPrimaryService(USER_SERVICE_UUID).then(service => {
              liffGetUserService(service);
            }).catch(error => {
                uiStatusError(makeErrorMsg(error), false);
            });
            device.gatt.getPrimaryService(PSDI_SERVICE_UUID).then(service => {
                liffGetPSDIService(service);
            }).catch(error => {
                uiStatusError(makeErrorMsg(error), false);
            });
    
            // Device disconnect callback
            const disconnectCallback = () => {
                // Remove disconnect callback
                document.getElementById("log").innerText = "failed";
                device.removeEventListener('gattserverdisconnected', disconnectCallback);
                // Try to reconnect
                initializeLiff();
            };
            device.addEventListener('gattserverdisconnected', disconnectCallback);
        }).catch(error => {
            document.getElementById("log").innerText = "gets";
            uiStatusError(makeErrorMsg(error), false);
        });
    

    데이터 교환



    LIFF에서 장치로 데이터를 보내는 곳 .js
      function submitValue(array){
        let param = localStorage.getItem('param');
        let str = JSON.stringify( param );
        window.writeCharacteristic.writeValue(
          Uint8Array.from(str.split(""), e => e.charCodeAt(0))
        ).catch(error => {
          document.getElementById("log").innerText = error;
            uiStatusError(makeErrorMsg(error), false);
        });
      };
    

    장치에서 데이터를받는 곳 .js
      writeCharacteristic.onwritefromremote = function(address, newvalue) {
        let str = Array.from(newvalue, e => String.fromCharCode(e)).join("");
        param = JSON.parse(str);
      }
    

    UUID를 사용하여 얻는 Characteristic 객체를 사용하여 charasteristic에 값을 읽고 씁니다.
    편리.

    charasteristic.js
      var writeCharacteristic = new obniz.ble.characteristic({
        "uuid" : writeCharacteristicUUID,
        "properties" : ["write"],
        "data" : [0x00]
      });
    

    쓰레기의 날 체크



    쓰레기 일 체크.js
        StartTimer = function() {
          // 30分ごとの処理
          timerID = setInterval(Timer, 1800000);
        }
        StopTimer = function() {
          clearInterval(timerID);
        }
        Timer = function() {
          if(!getParamFlag)
            return;
          }
          let today = new Date();
    
          checkDaysSchedule(today);
          // checkDaysSchedule(tomorrow);
        }
    
        function checkDaysSchedule(day){
    
          let date = weekdays[day.getDay()];
          let weekNum = Math.floor((day.getDate() - day.getDay() + 12 ) / 7);
          if(isSchedule) {
            checkSchedule(date, weekNum);
          }
        }
    
        function isSchedule(date){
          return param["schedule"][date] != null;
        }
    
        async function checkSchedule(date, weekNum){
        let schedule = param["schedule"][date];
          let garbageInfo = param["garbageInfo"][schedule];
          garbageInfo["frequency"].forEach(function(e) {
            if(e == weekNum){
              let output = "";
              output += date + "" + schedule + "日です。\n";
              output += garbageInfo["hour"] + "" + garbageInfo["min"] + "収集です。";
              obniz.display.print(output);
    
              NotifyToLine();
              swichLed(true);
            }
          })
        }
    

    타이머 돌려 30분마다 통지를 할 필요가 있는지 판별하고 있습니다!

    힘든 점


  • BLE 연결 설정
  • 안드로이드 단말기와 잘 협력 할 수 없었고, iPhone을 구입 한 결과 가난한 삶을 살게 된 점

  • 즐거운 점


  • BLE에서 장치에서 값을 받았을 때 !!!
  • LINE에서 자동 통신으로 메시지를 받았을 때 !!!

  • 또 뭔가 만들어요!



    참고한 기사



    LINE Things 자동 통신 기능 핸즈온

    좋은 웹페이지 즐겨찾기