지난 글
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 의 대안으로
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 |
---|