Arduino

아두이노 deepsleepmax 설정 시 안죽고 안깸

[혜안] 2022. 3. 23. 22:58
728x90

2022.03.21 - [Arduino] - 간접조명을 만들고 일몰시간에 자동으로 켜지게 할 수 있을까? #2

 

간접조명을 만들고 일몰시간에 자동으로 켜지게 할 수 있을까? #2

좌우지간 완성을 했다. 2022.03.20 - [Arduino] - NodeMCU DeepSleep Max 시간 NodeMCU DeepSleep Max 시간 2022.03.16 - [Arduino] - 간접조명을 만들고 일몰시간에 자동으로 켜지게 할 수 있을까? #1 간접조명을..

viewise.tistory.com

스마트 간접조명을 완성하긴 했는데,

조명을 켜야하는 선셋 시간이 아직 멀었으면, deepSleepMax 시간으로 최대한 길게 슬립모드에 들도록 해놓은 코드에 문제가 있었다.

문제가 있었다기보단,

deepSleepMax가 잘 안먹고,

전류는 전류대로 먹으면서 동작도 하지 않는 가수면 상태 비슷하게 빠지는 케이스가 종종 발생했다.

결국 시간을 대폭 줄여 최대 1시간 이상은 슬립모드를 유지하지 않도록 바꾸고 지금은 안정적으로 동작 중이다.

슬립모드 진입에도 일부 코드 변경이 있었다.

#아두이노

else if(request.indexOf("/SLEEP") != -1) {

    int s = request.indexOf("stime");
    int e = request.indexOf("HTTP");
    if(s > 0) {
      String stime = request.substring(s+6, e-1);
      //client.println("HTTP/1.1 200 OK");
      Serial.println("Deep sleep for " + stime + "sec");
      delay(10);

      client.stop();

      delay(1);

      if(stime == "MAX"){
        ESP.deepSleep(3600*1e6);
        //ESP.deepSleep(0xffffffff);//x
        //ESP.deepSleepInstant(ESP.deepSleepMax());//x
        //ESP.deepSleep(ESP.deepSleepMax());//x
        //ESP.deepSleepMax();//약 3시간 34분
      }else{
        ESP.deepSleep(stime.toInt()*1e6);//30분 넘으면 그냥 30분
      }
      delay(1);
    }
}

여러개의 주석에서 고심의 흔적이....

이제 MAX sleep으로 요청이 들어와도, 최대 1시간만 sleep을 한다.

 

#라즈베리파이

function checkSunset(){
    var url = 'http://apis.data.go.kr/B090041/openapi/service/RiseSetInfoService/getAreaRiseSetInfo';
    var queryParams = '?' + encodeURIComponent('serviceKey') + '개인별 서비스키'; /* Service Key*/
    queryParams += '&' + encodeURIComponent('locdate') + '=' + encodeURIComponent(new Date().toFormat('YYYYMMDD')); /* */
    queryParams += '&' + encodeURIComponent('location') + '=' + encodeURIComponent('서울'); /* */

    req({
        url: url + queryParams,
        method: 'GET'
        }, function (error, response, body) {

            var json = convert.xml2json(body, {compact: true, spaces: 4});
            var data = JSON.parse(json).response.body.items.item;
            var sunset = data['sunset']._text;

            var h = sunset.substring(0,2);
            var m = sunset.substring(2,4);

            var now = new Date();
            var eod = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59);
            var target = new Date(now.getFullYear(), now.getMonth(), now.getDate(), h, m);
            l('Sunset Time: ' + target.toFormat('YYYY-MM-DD HH24:MI'));

            var next_tick = now.getSecondsBetween(target);

            if(next_tick < 0){//이미 선셋 시간이 지났으므로 불켜기 유지
                l('after sunset!');
                if(wifiplug_state == false){
                    toggle_wifi(null);
                }
                if(timerId != null)
                    clearTimeout(timerId);

                l('reserve sleep off!');
                timerId = setTimeout(sleep_off_wifi, now.getSecondsBetween(eod)*1000);
            }else{
                l('before sunset!');
                var sleep_period;
                if(next_tick > 12840)//MAX sleep (3시간 34분) 보다 길게 남았으면 MAX sleep
                    sleep_period = 'MAX';
                else
                    sleep_period = next_tick;
                sleep_wifi(sleep_period);
            }
        }
    );
}

아두이노나 라즈베리파이의 프로세스 재기동 등을 감안한 예외케이스 방어코드가 추가되었고,

로그를 더 넣었다. 이상 현상이 있으면 바로 알 수 있도록...

MAX sleep 시간인 3시간 34분 기준으로 분기하는 건 딱히 손대지 않았다.

아두이노에서 보완했기 때문에...

오히려 1시간 ~ 3시간 사이 구간의 sleep 시간이 셋팅됐을 때,

또다시 가수면 상태가 발생할 지 로그를 보면 알수 있도록만 해놓았다.

 

하지만, 

생각보다 보조배터리가 빨리 달아서,

결국 전원을 연결해야 될 수도 있을 듯 하다...

 


 ​

728x90