ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자동차 배터리 전압을 텔레그램 메시지로 받기
    Telegram 2024. 1. 2. 00:59

    영하 10도 아래로 온도가 떨어진 12월 어느 날 외부에 주차해 둔 자동차로 이동 중 배터리가 방전되는
    아찔한 경험을 했습니다. 주로 대중교통을 이용하다 보니 자동차는 대부분 주차되어 있었고 급격하게 내려간 온도 때문에 배터리가 평소보다 더 빨리 방전되었던 것 같습니다.
     
    배터리 방전을 막기 위해서 매일 10분씩만 시동을 걸면 된다는 뉴스를 보았지만 쉽지 않았고 무엇보다 온도에 따라 자동차 배터리가 어떻게 방전되는지 실제 측정된 데이터를 얻고 싶었습니다. 
     
    1. 자동차가 주차해 둔 곳은 와이파이나 블루투스가 연결되지 않는 곳이라 LTE CATM1 모뎀을 사용해서 통신하고 데이터를 확인하기 위해 별도의 서버를 제작하지 않고 텔레그램봇을 이용해서 텔레그램 메시지로 받습니다. 
     
    2. LTE CATM1 모뎀이 구성된 ESP32 IoT 보드는 자동차 배터리 전원을 사용하지 않고 별도의 배터리(18650)를 연결해서 동작시킬 예정이라 배터리 소모를 최소화하기 위해 배터리 측정해서 텔레그램 서버에 전달하지 않을 때는 잠자기(deep sleep) 모드로 대기합니다.
     
    3. 배터리 모니터링 프로그램이 동작하다가 이상동작으로 인해 멈출 경우를 대비해서 워치독 타이머를 설정하고 제한시간동안 타이머를 리셋하지 않으면 장치를 자동으로 재시작시킵니다.
     
    4. 자동차 12V배터리를 전압센서에 연결해서 ESP32 보드 ADC핀에 연결해서 배터리 전압을 읽고 전압값을 가져올 수 있도록 구현했습니다. 
     
    5. 추후 시스템 디버깅을 위해 장치가 깨어났을 때 어떤 이유로 깨어났는지 확인하는 기능을 추가했습니다.   
     
    간단하게 전체적인 구성을 살펴보면 아래와 같습니다. 

    Remote Battery Measurement System Diagram ( https://dgm.sh )

     
    코드 먼저 확인하시고 싶으신 분들은 아래 코드를 다운로드하시기 바랍니다.

    SendMessageFromEvent_Battery.ino
    0.01MB

     
    위 코드는 이전에 릴리스한 https://codezoo.tistory.com/72 기반으로 하고 있습니다. 혹시 준비되어 있지 않으시면 아래 글을 참고해서 개발환경, 라이브러리 및 BOT_TOKEN, CHAT_ID 값을 미리 준비해 두어야 합니다. 

     

    LTE CATM1 모뎀을 Telegram Bot으로 만들기

    IoT통신을 위해서는 IoT Device와 IoT Device와 통신할 수 있는 IoT서버가 모두 준비되어 있어야 합니다. 어디서나 통신이 가능한 LTE CATM1 모뎀을 이용해서 사용자의 실시간 위치를 확인하려고 목적의

    codezoo.tistory.com

     
    이제 개발 준비가 되었다고 가정하고 순서대로 진행하겠습니다. 
     
    1. 전압센서
    연결된 전압을 1/5로 분배해 줍니다. ESP32는 ADC블록에서 전압을 0~3.3V까지 밖에 인식할 수 없어서 1/5로 전압을 분배하면 12V의 경우 약 2.4V의 전압을 출력합니다. 전압처리 방법은 소스코드에서 다시 다루겠습니다. 
    https://mechasolution.com/shop/goods/goods_view.php?goodsno=539851&category=

    전압센서

    2. 멀티미터
    배터리에서 실제 출력되는 전압을 측정하기 위해서 필요합니다. 기존에 사용하시던 제품이 있으면 그대로 사용하시면 됩니다.
    https://mechasolution.com/shop/goods/goods_view.php?goodsno=592947&category=

    멀티미터

    3. 자동차 상시 전압 가져오기
    자동차 배터리 전압을 가져오기 위해 본넷을 열고 선을 연결하실 필요는 없습니다.
    운전석 아래쪽에 있는 퓨즈박스를 사용해서 상시 전원을 연결하시면 됩니다. 

     
    퓨즈박스

    퓨즈박스에 자동차 상시전원과 연결된 퓨즈에 전압을 측정하는 선을 위와 같이 연결했습니다. 퓨즈박스에 붙어 있는 스티커나 자동차 매뉴얼을 참고하시면 상시전원, 시동 후 사용할 수 있는 전원과 같은 내용을 확인할 수 있습니다. 작업하실 때는 꼭 절연장갑을 착용하시고 조심해서(!) 연결하시기 바랍니다. 

    자동차 접지(GND)

    접지는 퓨즈박스 아래에 있는 접지파트에 연결했습니다.

    ​이제 전압센서에 연결합니다. 

    배터리 상시전원 측정

    배터리 상시전원 측정

     

    GND, Vcc에는 상시전원을 연결하고 S는 ESP32 IoT보드의 25번핀, - 는 GND에 각각 연결합니다. 
    아래 사진의 흰색 점프선이 연결된 핀이 25번, 그 아래 검은색 점프선이 연결된 핀이 GND입니다. 

    전압센서와 ESP32 IoT보드 연결

    (*주의할 점)
    ESP32 IoT 보드에 전원을 먼저 연결 후 전압센서의 S, - 점프선을 연결하시기 바랍니다. 
     
    ESP32 IoT 보드 전원은 아래 제품에 3500mAh 18650배터리를 장착해서 USB 출력전원(5V)에 연결해서 사용했습니다.  
    https://www.devicemart.co.kr/goods/view?no=14607406

     

    리튬 배터리(18650) 홀더장착 충전-전원출력(3.3V, 5V) 모듈(배터리 - 1개용) (PN-HLCH-18650-1S)

    PCB Size : 약 99.5mm x 29.2 / Battery : 18650 Size Battery (1 pcs) / Charging Voltage : DC 5V

    www.devicemart.co.kr

    리튬배터리 전원출력 모듈

     
    이제 소스코드에서 중요한 부분만 설명드리겠습니다. 
     
    1) 배터리값 가져오기
    - BCF(배터리 보정계수)를 500으로 설정해서 얻어온 배터리 값에 더해 줬는데, 이유는 멀티미터로 측정한 값과 ESP32 IoT보드 ADC에서 가져온 값의 차이가 있어서 여러 번 테스트 진행 후 측정값에 0.5V(500mV) 더해 줘서 최대한으로 값을 맞췄습니다. 해당 값은 실제 멀티미터로 측정하시면서 조정해서 적용하시기 바랍니다.
     
    - 12비트 ADC로 기준전압(3.3V)을 나눴기 때문에 얻어온 값을 4095로 나누고 3300(3.3V)을 곱했고 전압센서에서 1/5한 값이 입력되었기 때문에 원래대로 5를 곱했습니다. 여기에 보정계수를 더했습니다. 
     
    -  배터리 값을 ADC로 샘플링(30회) 후 값을 정렬해서 최대값과 최소값은 버리고 나머지 값들을 더해 평균값 만듭니다. 

    readBattery()

    2) 깨어난 이유 살펴보기
    'esp_sleep_get_wakeup_cause' API를 사용해서 시스템이 깨어난 이유를 추적합니다. deep sleep + wakeup 이슈가 있을 때 디버깅 용도로 넣었습니다. 정상적인 경우라면 Wakeup caused by timer 가 출력됩니다. (RTC Wakeup 사용)

    sleepWakeUpReason()

     
    3) deep sleep 
    RTC(Real Time Clock)로 깨울 시간을 설정하고 ESP32 IoT 보드를 재웁니다. 깨우는 시간은 초단위로 설정합니다.

    sleepGo()

     
    4) 워치독 타이머
    타임아웃 (WDT_TIMEOUT)이 되기 전에 타이머를 리셋하지 않으면 시스템이 재부팅됩니다. 
    타임아웃 시간은 초단위로 입력할 수 있습니다. 시스템에는 300초(5분)로 설정했습니다. 

     
    사용하기 위해서는 먼저 'esp_task_wdt_init' API에 타임아웃값을 입력해서 초기화하고 만들어진 타이머를 시스템에 연결합니다. 

     
    타임아웃이 되기 전에 'esp_task_wdt_reset()' API가 호출되어야 합니다. 따라서 시스템 초기화나 네트워크 연결과 같은 코드 구문에 적절하게 사용해서 무한루프에 빠질 경우 시스템을 재시작할 수 있도록 배치해야 합니다. 

     
    시스템을 재우기 (deep sleep) 전에 워치독 타이머를 해제합니다. 아래 순서로 진행합니다. 

     
    5) 잠자기 (deep sleep) 전 LTE CATM1 연결된 I/O 제어
    먼저 모뎀 WakeUp에 LOW를 인가해서 모뎀이 슬립모드에 들어갈 수 있게 설정합니다. 
    5초 대기 후 EXT_ANT(외부안테나 제어), RST_PIN(모뎀 리셋), WAKEUP_PIN 설정을 INPUT으로 변경합니다.
     
    마지막으로 PWR_PIN에 LOW신호를 줘서 CATM1 모뎀에 전원을 공급하는 LDO 칩셋을 OFF 합니다. 

     
     
    이제 사용하는 텔레그램 메신저로 자동차의 배터리 값을 원하는 시간주기로 받으실 수 있습니다. 

    3시간 주기
    1시간 주기


    설치 사진 1)

     
    [추가 팁]
    ESP32 보드에 전원 LED가 연결된 보드가 있습니다. 칩LED을 켜두면 20mA~50mA까지 시간당 배터리를 소모시킬 수 있습니다. 처음 설치 후 배터리를 좀 더 절약하기 위해 인두기로 아래와 같이 칩LED를 제거했습니다.

    칩LED 제거

     
    설치 사진 2)

    칩LED를 제거한 설치사진

     
    Murata Type1SC 모듈 구매, 자료 관련 문의
    (주)아성코리아
    전지만 이사 010-5418-8812 mlcc@asung.com
    박상인 수석 010-6556-5405 sipark@asung.com

    LTE-CATM1 내장형 모뎀 대량 구매 상담, 외주 개발, 협업 문의
    (주)코드주
    장병남 대표 010-8965-1323 rooney.jang@codezoo.co.kr
     
    https://www.devicemart.co.kr/goods/view?no=14077527

     

    LTE-CatM1 내장형 모뎀 / 사물인터넷 통신모듈

    사물인터넷 개발을 위한 LTE 모듈입니다. / CodeZoo / 사물인터넷 통신모듈 / 유심은 상품상세의 링크에서 별도 구매가 필요합니다.

    www.devicemart.co.kr

    https://smartstore.naver.com/codezoo/products/8514695472

     

    LTE CATM1 ESP32 IoT 보드 : codezoo

    [codezoo] IoT Global SIM, IoT Connectivity, IoT Device

    smartstore.naver.com

    https://smartstore.naver.com/codezoo/products/7153689192

     

    Vodafone Global IoT SIM Card : codezoo

    [codezoo] IoT Global SIM, IoT Connectivity, IoT Device

    smartstore.naver.com

Designed by Tistory.