2018년 8월 7일 화요일

ESP8266 원격 리셋 장치

1. 원격 리셋? 왜?

 여러가지 사정때문에 CCTV를 원격에 설치해 놓은 것이 있다. 집에서 약 3시간 거리라서 쉽게 오갈수 없는 곳인데, 이 CCTV가 올 여름처럼 너무 더워서 그런지 가격이 싼 제품이라서 그런지 동작을 멈추어 버리는 경우가 있다. 사실 실시간 스트링으로 보기도 하며, 집 NAS에 녹화도 하고 있어서 CCTV 입장에서는 힘들긴 할꺼다. 무튼 멈추고 나면 사람의 손으로 전원을 차단하였다가 다시 연결해야 하는데 쉬운일은 아니여서 원격 리셋을 기획하게 되었다.

2. 어떤 Relay switch를 쓸까?

 내구도를 위해서 Solid State Relay를 처음에 선택하였으나 아래의 조건에 맞지 않아서 기계식 Relay로 사양을 변경하였다.
조건1) 항상 연결되어 있어야 한다.
조건2) ESP8266이 deep sleep 모드에서도 연결되어 있어야 한다.
조건3) ESP8266이  깨어나는 순간 연결에 흔들림이 없어야 한다.
조건4) 필요한 경우에만 Relay Switch에 전원을 공급하여 동작시켜야 한다.

즉 거의 모든 시간에는 Relay가 연결되어 있어야 하며, 아주 아주 특별한 경우에만 접점이 떨어져야 하는 상황인데 SSR의 경우 이 조건을 만족 하기가 어려웠다.
aeProduct.getSubject()
       
기계식 릴레이는 출력쪽에 3개가 있는데 NC쪽이 Relay에 전원이 없더라도 연결되는 부분이며 NO쪽은 Relay에 On 신호가 들어와야 연결되는 부분이다.

3. 동작 원리는?

 크게 대단한 것은 없다. ESP8266 입장에서는 주구장창 잠을 자다가, 가끔 일어나서 상황을 살펴보고, CCTV의 리셋(잠시 전원 차단)이 필요한 경우에 조치를 하고 잠을 다시 잔다.
리셋의 여부는 Web Page를 하나 만들고, ESP8266이 페이지를 읽어서  판단한다. Web server 하나 돌리는 것이 부담된다고 생각하겠지만 일년에 3천원 이면 MySQL + WebServer + Domain name 까지 가능한 호스팅업체가 널렸다.
(domain name은 호스팅업체가 제공하는 범위내에서 선택이다.)
 만약 리셋이 필요하다면 웹서버쪽에 리셋이 더이상 필요하지 않다고 보고하고 나서, 리셋을 수행한다. (그렇지 않으면 다음번에 또 리셋되니까)
 이 시스템은 실시간 리셋이 아니며, 다음번 ESP8266이 깨어날때 확인하고 리셋이 이루어진다. 난 개인적으로 deep sleep mode를 좋아한다.

4. S/W는?

 Arduino이던 PHP던 크게 대단한 것은 없다.  아래의 몇줄 코딩으로 원하는 작업을 수행한다. 전체 소스코드는 아래와 같다.

1. WiFiSwitch.ino
#include <Arduino.h>
#include <ESP8266HTTPClient.h>

int ledPin = D4;               // LED
int relay = D8;                // Relay switch (with pulldown)

void setup() {
    pinMode(ledPin, OUTPUT);    
    pinMode(relay, OUTPUT);     
    digitalWrite(ledPin, HIGH);  // D1 mini 경우 이리 주어야 LED 꺼진다.
    Serial.begin(115200);
    Serial.println("");
    HTTPClient http;
    http.begin("http://site.kr/get_status.php?name=WIFI_SWI_01");
    int httpCode = http.GET();
    if (httpCode > 0) { // 제대로 받은 경우라면
        String payload = http.getString();  
        Serial.print("Switch Status (on/off, reset?):");
        Serial.println(payload); //웹서버로부터 받은 응답 표시
        // 웹서버로부터 "1,1" 처럼 문자열로 답변이 오고
        if (payload.length() >= 3 && payload.charAt(1) == ','
            && payload.charAt(2) == '1') {
            Serial.println("리셋이 필요합니다.");
            http.end();
            // 리셋을 하기 직전 리셋이 더이상 필요하지 않다고 정보를 저장한다.
           http.begin("http://site.kr/update_reset_status.php?\ name=WIFI_SWI_01&status=0");
            httpCode = http.GET();
            http.end();
            // 리셋한다.
            digitalWrite(relay, HIGH);
            delay (7000);
        } else {
            Serial.println("리셋이 필요없습니다.");
        }
    }
    Serial.println("확인 완료");
    http.end();
    ESP.deepSleep(35 * 1000000); // 오랫동안 잠을 잔다
}
void loop() {} // loop 함수는 불려질 일도 없고, 하는 일도 없다.



여기서 주목할 것은 http://site.kr/update_reset_status.php?name=WIFI_SWI_01&status=0
라는 부분이다. ESP8266에서 리셋이 더이상 필요하지 않다고 직접 처리해 버린다.

http://site.kr/update_reset_status.php?name=WIFI_SWI_01&status=1 와 같이 호출하면 다음번 ESP8266이 깨어나는 시점에 리셋이 이루어 진다.

php code 또한 간단 하다.
2. get_status.php
<?php
// com, id, pwd, db name
$conn = mysqli_connect('localhost', 'id', 'pwd', 'dbname');
$sql = sprintf("update I_WIFI_SWITCH set check_date = now() where name = '%s'",                         $_GET['name']);
$result = mysqli_query($conn, $sql);
$sql = "select on_off, req_reset from I_WIFI_SWITCH 
            where name = '".$_GET['name']."' ";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($result);
echo $row['on_off'].',';
echo $row['req_reset'];
?>



3. update_reset_status.php
<?php
// com, id, pwd, db name
$conn = mysqli_connect('localhost', 'id', 'pwd', 'dbname');
$sql = sprintf("update I_WIFI_SWITCH set req_reset = %s, up_time = now() where name = '%s'", $_GET['status'], $_GET['name']);
$result = mysqli_query($conn, $sql);
echo $result;
?>

5. H/W는?
 회로가 거창 한것도 아니고, 그리 대단한 것도 아니다. D0 --> Reset핀을 연결해 주어야 하며, Relay switch control은 D8 로 했다는 것에 주목하면 된다.  D8을 쓴 이유는 이미  pull down 핀 이기 때문이다.  아래의 그림과 같다.




실제 만들어 진것은 D1 mini용 5V 입력과  CCTV 출력용 12V 입출력 연결단자를 만들어야 해서 생각보다는 덜 깔끔하다.


심지어... 잘 안보이는 뒷면은 훨씬더 난감하다. 전공분야가 아니니..너무 탓하지 마시라~




마지막으로 이 시스템 자체가 외부에 노출되어서 설치할 예정이라서, PET병을 잘라서 커버를 만들었다.





댓글 없음:

댓글 쓰기

3단 6핀 스위치로 DC 모터의 회전 방향을 바꾸어 보자

1. 필요는 연구의 어머니 항상 느끼는 부분이다. 필요하지 않으면 연구하지 않으며, 필요하면 연구한다. DC 모터를 조건에 따라서 정방향 또는 역방향으로 회전시켜야 하는 필요가 생겼다. 처음에는 MCU 및 Relay Switch를 이용하는 방법을 생각...