Arduino

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

[혜안] 2022. 3. 21. 23:13
728x90

좌우지간 완성을 했다.

2022.03.20 - [Arduino] - NodeMCU DeepSleep Max 시간

 

NodeMCU DeepSleep Max 시간

2022.03.16 - [Arduino] - 간접조명을 만들고 일몰시간에 자동으로 켜지게 할 수 있을까? #1 간접조명을 만들고 일몰시간에 자동으로 켜지게 할 수 있을까? #1 오랜만에 버려진 재료들을 가지고 다시 뭔

viewise.tistory.com

 

아두이노(NodeMCU) 동작이 만족스럽지 않아서, 

동작 시나리오를 변경했고, 몇 가지 오류가 있었지만 지금은 무사히 동작 중이다.

 

기록할 만한 오류는,

DeepSleepMax를 걸 때에 약 3시간 34분 후 깨어날 것으로 예상했는데, 깨어나지 못하는 케이스가 있었다.

찾아본 자료에서 그런 주의사항이 있었지만 무시했었는데, 역시나 발생하고 자세히 보게 되더라..

원인은 모뎀이나 기타 장치들이 준비되지 않았는데 슬립에 들어가는 케이스로 추정되어, 슬립전 시간 텀을 주고, 

정리할 수 있는건 정리하였다.

 

코드는,

NodeMCU에서

1. 슬립 들어가기

2. 조명 켜기

2가지 기능이 작성되었고,

라즈베리파이에서

1. 공공데이터포털 API로 일몰시간 가져오기

2. 현재시간 비교해서 슬립 또는 조명커기 명령 내리기

이렇게 작성되었다.

일몰시간에 자동으로 조명 켜기 순서도

조각 코드

아두이노

 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);      
      Serial.println("Deep sleep for " + stime + "sec");
      delay(10);
      
      client.stop();
      
      if(stime == "MAX")
        ESP.deepSleepInstant(ESP.deepSleepMax());
        //ESP.deepSleepMax();//약 3시간 34분
      else
        ESP.deepSleepInstant(stime.toInt()*1e6);//30분 넘으면 그냥 30분
        
    }
  }

라즈베리파이

function sleep_wifi(p) {
    var sleep_wifiplug = {host : wifiplug_ip, path: '/SLEEP?stime='+p, method: 'GET', timeout:1000};
    var req = http.request(sleep_wifiplug, null);
    req.on('error', function(err) {
        e('sleep_wifi problem with request: ' + err.message);
    });
    req.end();
}

function sleep_off_wifi() {
    wifiplug_state = false;
    l('sleep and turn off wifi plug');
    sleep_wifi('MAX');
}


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);
            console.log('Now: ', now.toFormat('YYYY-MM-DD HH24:MI'));
            console.log('Sunset Time: ', target.toFormat('YYYY-MM-DD HH24:MI'));
            console.log('End of Day: ', eod.toFormat('YYYY-MM-DD HH24:MI'));

            var next_tick = now.getSecondsBetween(target);

            if(next_tick < 0){//이미 선셋 시간이 지났으므로 불켜기 유지
                if(wifiplug_state == false){
                    toggle_wifi(null);
                    setTimeout(sleep_off_wifi, now.getSecondsBetween(eod)*1000);
                }
                l('after sunset!');
            }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;
                l('sleep wifi for ' + sleep_period);
                sleep_wifi(sleep_period);
            }
        }
    );
}

 

 

 

그리고 제작한 케이블들...

양쪽이 다 micro USB male 로 개조했다.

LED 스트링과 빵판회로 사이에 거리가 좀 있는 관계로 탈착이 쉬운 연장선 개념이라고 보면 된다.

다른그림 찾기 ㅋㅋㅋ

 

사실 케이블 개조는 했지만, micro 타입 female 단자가 하나밖에 없어서,

LED 스트링은 USB C female 로 급조했다.

조악한 개조솜씨 ㅎㅎㅎ

때문에 개조된 케이블에 C 타입 젠더를 끼울 수 밖에 없었다는 슬픈 이야기...

뭐 길게 봐서 C 타입이 대세가 되고 있....

 

연결하면 이런 모양이 된다.

그리고 아두이노에 연결

 

그리고 설치

방수팩에 보조배터리와 아두이노를 넣고, 매달기. 아~ 똥손~ ㅋㅋㅋ

그러나 앞에서 보면 멀쩡함

위에는 이렇게 테이프로 대충~

될 지 안될 지 모르는 프로토타입이라 일단 급조하였고,

쓸만하다 판단이 되면 더 매꼼하게 만들어 봐야지~ 라고 생각만 한다.

 

728x90