ESP32 (Micropython) 와 VFD 를 이용한 버스 시간 디스플레이 만들기 - ②

2024. 12. 28. 23:51·공돌 ━━━━━/플젝
반응형

지난 글

https://gukjan9.tistory.com/150

 

ESP32 (Micropython) 와 VFD 를 이용한 버스 시간 디스플레이 만들기 - ①

서장예전부터 학교를 다닐 때나 직장을 다닐 때나 항상 이런게 있었음 좋겠다 싶었던 것이 있다. 바로버스 / 지하철 시간 표시기 이것이 대체 뭔가 싶은데 그냥 말그대로 버스나 지하철 시간을

gukjan9.tistory.com

 

공공데이터포털

우선 코딩을 하기 전에 공공데이터포털에 들어가서 내가 원하는 기능을 하는 api 가 있는지 살펴봐야 한다.

'경기도 버스' 관련 api 를 찾아보니...

https://www.data.go.kr/data/15080346/openapi.do

 

경기도_버스도착정보 조회

경기도 버스의 실시간 운행정보를 수집하여 이용자에게 제공하는 시스템입니다. 해당 정류소(정류소 ID)에 정차하는 버스노선들의 도착정보와 특정 버스노선(노선ID)들의 도착정보 등을 제공합

www.data.go.kr

 

버스도착정보 조회 api 를 발견했다.

 

하지만 response 를 보면

특정 정류소에 곧 도착할 첫 번째, 두 번째 버스밖에 보여주질 않는다..

곧 도착에 뜬다는 것은 1~2분 내로 버스가 도착을 하는 것이기 때문에 이번 플젝의 취지와 맞지 않다.

 

그래서 찾아본 두 번째 api 는

https://www.data.go.kr/data/15080648/openapi.do

 

경기도_버스위치정보 조회

경기도 버스의 실시간 운행정보를 수집하여 이용자에게 제공하는 시스템

www.data.go.kr

 

현재 버스의 위치 정보를 조회해주는 api 인데

흠.. 내 프로젝트에 딱 적당한건 아니지만 내가 타는 정류장 5전 정도 위치에 있을 때를 감지하는 것으로 방향을 잡았다.

 

코딩

wifi.py

우선 ESP32 가 와이파이에 연결이 되어 있어야 실시간으로 버스 정보를 불러오므로 와이파이에 연결하는 코드를 짜주었다.

// wifi.py
import network

def connect(ssid, pw):
    ssid = ssid
    password = pw

    wlan = network.WLAN(network.STA_IF)
    if not wlan.isconnected():
        wlan.active(True)
        wlan.connect(ssid, password)
        while not wlan.isconnected():
            pass

    print('와이파이:', wlan.ifconfig())

 

run script 를 해주면

 

잘 연결됨을 확인!

 

bus.py

공공데이터포털에 가보면 친절하게도 언어별로 샘플 코드들이 있다.

// sample.py
import requests

url = 'http://apis.data.go.kr/6410000/buslocationservice/getBusLocationList'
params ={'serviceKey' : '서비스키', 'routeId' : '233000031' }

response = requests.get(url, params=params)
print(response.content)

 

테스트로 서비스키를 넣어서 실행해보았지만 requests module 이 없다는 에러를 뿜어냈다.

python 에서는 지원하는 모듈이지만 micropython 은 python 의 기본적인 기능은 제공하지만 python 의 모든 기능을 지원하진 않는다.

(micropython ⊂ python 느낌..)

 

구글링을 해보니 requests 의 대안으로

https://makeblock-micropython-api.readthedocs.io/en/latest/public_library/Third-party-libraries/urequests.html

 

urequests 가 있어 활용해보았다.

 

// bus.py
import urequests as requests

def get_data(api, id):
    url = 'http://apis.data.go.kr/6410000/buslocationservice/getBusLocationList'
    full_url = url + "?serviceKey=" + api + "&routeId=" + id 

    response = requests.get(full_url)
    print(response.content)

 

main.py

이제 main 단 코드를 작성해준다.

from machine import SPI, Pin
from _8MD06INKM import _8MD06INKM
import time, json
import wifi, bus

with open('config.json', 'r') as e:
        config = json.load(e)

wifi.connect(config['ssid'], config['password'])
bus.get_data(config['api_key'], config['ID_9030'])

 

config.json 을 불러와서 각 .py 에 환경변수로 넣어준다.

 

그리고 실행을 시키면

 

 

xml 형태로 데이터가 출력이 된다!

 

xml 데이터 처리

받아온 xml 에서 원하는 데이터를 추출하기 위해 아래와 같이 코드를 짜주었다.

def parse_xml(xml):
    tag = None
    value = None
    elements = []

    in_tag = False
    for char in xml:
        if char == '<':
            in_tag = True
            if value and tag:
                elements.append((tag, value.strip()))
                value = None
            tag = ''
        elif char == '>':
            in_tag = False
            value = ''
        elif in_tag:
            tag += char
        else:
            value += char

    return elements

 

구글링을 해보니 micropython 에서 xml 을 처리하는 라이브러리로 xmltok 이라는 것을 보통 사용하는 것 같았다.

하지만 레퍼런스도 좀 부족해보이고...

복잡하게 데이터를 추출할 것 없이 쿼리 발생 시간과 현재 버스의 정류장 위치 이 2개의 데이터만 받아오면 되기에 따로 라이브러리를 쓰지 않고 그냥 이대로 진행하기로 했다.

 

이제 데이터도 다 파싱을 했으니 화면에 원하는 정보를 잘 띄우기만 하면 된다!

 

display

원래 https://github.com/zhcong/8MD06INKM-for-micropython

이 버전의 라이브러리를 쓰려 했지만 많은 시간 삽질을 해봐도 display 가 clear 되질 않고 처음에 올린 문자열이 계속 떠있어서...

결국 두 번째 라이브러리로 진행하기로 했다.

 

전체 코드

https://github.com/gukjan9/esp32-bus

 

GitHub - gukjan9/esp32-bus

Contribute to gukjan9/esp32-bus development by creating an account on GitHub.

github.com

 

실행

설정한 정류장으로 오고 있을 때 - 잔여 정류장 갯수 표시

 

(지금은 정류장 갯수가 10의 자리일 때와 1의 자리일 때 조건을 걸어주어 맨 뒤에 텍스트가 안 없어지는 현상 해결)

 

도착했을 때 - Arr 표시

 

버스가 지나가고 다음 버스가 없을 때 - None 표시

 

다음...

어느 정도 구현이 다 되었으니 이제 사용할 일만 남았는데 지금 이대로 써도 아무 문제 없지만 점퍼선으로 연결되어 있는 것 보단 기판에 납땜을 하는 것이 깔끔하기 때문에 언젠가.. 시간이 나면 해보는 것으로!

반응형

'공돌 ━━━━━ > 플젝' 카테고리의 다른 글

ESP32 (Micropython) 와 VFD 를 이용한 버스 시간 디스플레이 만들기 - ①  (0) 2024.12.02
'공돌 ━━━━━/플젝' 카테고리의 다른 글
  • ESP32 (Micropython) 와 VFD 를 이용한 버스 시간 디스플레이 만들기 - ①
GukJang
GukJang
•  ⌘ ⌥ •
    반응형
  • GukJang
    SPACE
    GukJang
  • 전체
    오늘
    어제
    • Blog (73)
      • 개발 ━━━━━ (68)
        • Java (14)
        • C++ (1)
        • HTML (1)
        • Spring(boot) (7)
        • Dev (9)
        • SQL (1)
        • CS (2)
        • Git (1)
        • Troubleshoot (14)
        • Algorithm (2)
        • Definition (1)
        • Dev Life (2)
        • TIL (7)
        • 항해 (6)
      • 공돌 ━━━━━ (4)
        • 플젝 (2)
        • 장비 (1)
        • 부품 (1)
      • 독서 ━━━━━ (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    사전 스터디
    항해99
    Python
    알고리즘
    오픈소스 기여
    자바
    Java
    mysql
    spring
    SpringBoot
    EC2
    AWS
    CI CD
    백준
    electron-builder
    github actions
    마이크로파이썬
    docker
    micropython
    docker volume
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
GukJang
ESP32 (Micropython) 와 VFD 를 이용한 버스 시간 디스플레이 만들기 - ②
상단으로

티스토리툴바