아두이노로 실시간 버스 정보 받아오기

버스 정보 받아오기
details

wizfi250_orange_board_wifi_get_bus_information.PNG

아두이노로 실시간 버스 정보 받아오기 (1)

개요

 

안녕하세요ㅎ 이번에 만들어 볼 프로젝트는 현재 버스 정보를 WiFi통신으로 받아와서 출력하는 기기 입니다!

 

최근에 부쩍 WiFi를 접할 기회가 많아지면서 WiFi통신으로 이것저것 건드려보고 있기는 합니다.

아두이노에서 WiFi를 사용하면서 느끼는 점은 ‘아직까지 숨겨져 있는 여러 정보들이 많다!’ 라는 것을 느낍니다.

 

국내에서 아두이노 WiFi를 검색해보면 그다지 많은 자료가 나오지 않습니다. 코코아팹을 비롯해서 찾아보면 기껏해야 ‘날씨정보 받아오기’ 정도가 나오곤 하는데 생각보다 API의 세계는 깊고 무궁무진합니다ㅎㅎ

 

 

 

 

본 글에서 작성할 내용은 버스정보를 아두이노로 받아오는 내용인데요.

분명 스마트폰을 가지고 있는 대한민국 국민이라면 버스정보를 받아오는 어플은 하나쯤은 설치했을거라 생각합니다. 물론 저도 설치했습니다!

<그 생.중.계 아두이노가 해보겠습니다>

 

 

 

 

그만큼 출퇴근이나 등하교, 혹은 데이트 시간을 맞추기 위해 중요한 어플이기도 합니다. (시간 약속은 중요하니까요!ㅋㅋ)

<앞으로는 이러지 말아요!!ㅜ>

 

 

 

 

이번에는 집에서 어플켜는 시간조차 아까우신 분들을 위한 원버튼 버스 알리미를 만들어보고자 합니다! 아침에는 1분 1초가 잠과의 싸움이기 때문이죠ㅎㅎ

 

2개의 글로 나눠쓸 예정이며 일단 이번 글에서는 API를 사용하는 법에 대해 설명해보도록 하겠습니다.

 

 

 

 

필요한 부품 목록

 

NO부품명수량상세설명
1OrangeBoard WiFi1WizFi250라이브러리 사용

 

부품명OrangeBoard WiFi
파트

 

 

 

 

경기버스정보시스템 사용하기

 

경기버스정보시스템을 사용하기 위해서는 일단 사이트에 먼저 접속합니다. 주소는 아래와 같습니다.

경기 버스 정보 – http://www.gbis.go.kr/

 

 

 

 

공유서비스를 클릭하면 경기버스정보의 OpenAPI를 개발할 수 있는 정보를 볼 수 있습니다.

매뉴얼에서는 사용방법을 볼 수 있고 테스트에서는 임의의 값을 넣어 어떻게 값이 출력되는지 미리 볼 수 있습니다.

 

그런데 API를 사용할 때 항상 필요한 것이 공개키인데 역시 경기버스정보시스템을 사용할 때도 공개키가 필요합니다.

이 공개키는 공공데이터포털에서 받을 수 있습니다.

 

 

 

 

무엇을 하던간에 미리 다 준비되어 있는 상태에서 해야 마음이 편합니다. 시작했는데 뭐가 준비되어 있지 않아 중간에 준비하려고 하면 김빠지죠…

공개키를 먼저 받아봅시다!

 

공공데이터포털에 접속합니다. 링크는 아래와 같습니다.

공공데이터 포털 – https://www.data.go.kr/ 

 

 

 

 

먼저 공개키를 받기 위해서는 회원가입을 해야합니다. 회원가입을 하고 로그인까지 한 후 검색창에 아래의 API를 검색합니다.

 

기반정보 관리는 설명과 같이 노선과 정류소 등의 버스에 관한 여러 정보 데이터가 담겨있는 텍스트 파일을 받을 수 있는 API입니다.

텍스트 파일을 받아 각 정류소별 ID, 노선별ID를 알아야 버스 정보를 조회할 수 있습니다.

 

 

 

 

활용신청을 클릭하고 나오는 페이지에서 신청을 하면 공개키를 받을 수 있습니다.

 

 

 

 

공개키는 우측 상단의 마이페이지 – 오픈API에서 확인할 수 있습니다.

 

※ 공개키는 신청 후 1시간이 경과한 후부터 사용이 가능합니다.

그 전에는 유효한 공개키를 입력하더라도 유효하지 않다고 뜨니 유의하세요.

 

 

 

위의 API외에도 아래와 같이 버스도착정보 조회 API가 있는데

처음에는 두 개다 신청했지만 신청하고 나서 공개키를 보니 2개가 같은 것으로 보아 둘 중 하나만 신청하면 모두 사용가능한거 같습니다.

 

 

 

 

위 작업이 끝났다면 이제 다시 경기버스정보 페이지로 돌아와 버스 노선, 정류소 등의 데이터가 담긴 데이터를 받습니다.

 

사실 꼼수가 있긴한데 꼭 공개키를 받지 않더라도 아래와 같이 공유서비스 – 테스트 – 기반정보 조회로 가셔서 테스트값 입력을 클릭후 전송을 하면 텍스트 파일을 받을 수 있는 링크가 아래에 출력됩니다.

어떤 방법을 사용하셔도 받는 데이터는 동일하니 데이터에 뜨는 주소로 텍스트 파일을 받습니다.

 

받아야할 텍스트 파일은 routestation날짜.txt입니다. 텍스트파일 치고는 용량이 큰 편입니다.

 

 

 

 

받고나면 아래처럼 알 수 없는 숫자와 글자가 띄어쓰기 없이 적혀있는 것을 볼 수 있습니다.

여기서 검색을 통해 노선ID와 정류소ID를 찾아야 합니다.

 

검색방법은 아래와 같습니다.

“버스번호|정류소이름”

 

※ 예를 들어 서현역에서의 17번버스 정보를 보고 싶다면 17|서현역을 검색하면 찾을 수 있는데 그 옆쪽에 9자리의 숫자|9자리의 숫자를 알아두셔야 합니다.

17|서현역을 검색하면 오른쪽에 12345679|987654321과 같은 숫자가 있습니다.

123456789는 17번 버스의 노선ID이고 987654321은 서현역의 정류소ID입니다.

 

 

 

 

 

그 값을 찾았다면 테스트페이지에서 테스트해 볼 수 있습니다.

공개키를 적고 검색한 노선ID와 정류소ID를 적고 전송을 했더니 정상적으로 결과가 출력되었습니다.

 

여기까지 성공했다면 절반 이상은 왔습니다. 이제 아두이노 코드를 통해 시리얼모니터에서 이 값을 출력하는 일만 남았습니다!

 

 

 

 

요청 결과에 대한 상세 내용은 매뉴얼에 아래와 같이 포함되어 있으니 참고하세요.

 

 

 

 

소프트웨어 Coding

 

 

 

 

코드에서 SSID, PASS, APIKEY, ROUTEID, STATIONID는 사용자가 직접 입력하는 부분입니다.

각각 WiFi이름, WiFi패스워드, 공개키, 노선ID, 정류소ID입니다.

 

 

 

 

위 데이터를 입력 후 업로드하고 시리얼 모니터를 열게되면 아래와 같이 데이터를 일렬로 받아오는 것을 볼 수 있습니다.

 

 

 

 

버스 정보 API의 경우 아래 사진과 일일 트래픽양이 존재합니다. 그렇기 때문에 무한정 요청이 불가능하고 몇 초 단위로 요청하는 것 또한 트래픽 제한이 걸릴 수 있으니 실제로 사용하신다면 시간 배분을 잘 해야합니다.

위 코드에서는 60초에 한번씩 요청할 수 있도록 설정하였으며 그 부분은 사용자가 변경할 수 있습니다.

 

 

 

 

아두이노 시리얼모니터의 가장 큰 단점이면 역시 한글을 표현하지 못하는 것이 아닐까 합니다. 그렇기 때문에 버스 번호판의 정보를 출력할 수 없고 불러오는 과정에서도 한글이 깨져서 출력되는 것을 볼 수 있습니다. 이 부분이 가장 크게 감안해야 할 부분이 아닌가 싶습니다.

이번 글에서는 API를 사용하여 데이터를 시리얼 모니터에 출력하는 것까지 사용했고 다음글에서 파싱을 통해 원하는 정보를 추출하여 LED에 표현하여 기기를 만들어 보겠습니다!

 

 

 

아두이노로 실시간 버스 정보 받아오기 (2)

개요

 

안녕하세요! 이전글에 이어 바로 이어서 글을 작성합니다ㅎ

저번글에서는 간단하게 경기버스정보시스템의 API를 사용하여 데이터를 오렌지보드 WiFi에 읽어오는 작업을 했는데요.

 

이번글에서는 읽어온 정보에서 내가 원하는 데이터만 파싱하여 LCD에 출력하는 작업까지 하여 완성해보겠습니다.

 

비록 외관은 없지만 기능면에는 잘 굴러가기 때문에 실제로 써봐도 지장이 없습니다!

저는 실제로 이걸 써볼 생각입니다ㅎ

(실제로 하루 사용해봤는데 볼품없지만 버스 시간을 체크하는데는 정말 유용했습니다.)

 

 

 

 

 

제가 일할 때 느끼는 출근시간과 퇴근시간은 매우매우 중요합니다. 그런만큼 등하교 시간도 누구한테는 중요하게 느껴질거라 생각합니다.

출근시간에 준비하면서 스마트폰을 찾고 어플을 켜서 제가 타고 다니는 버스를 찾아 누르는 작업을 하기 쉽지 않습니다.

마찬가지로 퇴근시간에도 스마트폰을 켜서 어플을 켜서 버스시간을 보는 일 또한 간단해 보이지만 번거롭습니다.

 

시간이 소중한 분들을 위해 제작한 프로젝트입니다!

단순하게 버튼을 두번 누르는 작업만으로도 내가 탈 버스의 시간과 현재 위치를 대략적으로 파악할 수 있습니다.(다음 버스와 다다음 버스까지 체크합니다.)

(지하철을 타고 다니는 분들에게는 별 도움이 안되는 프로젝트네요ㅜ)

 

WiFi보드를 제외하면 모든 모듈들을 쉽게 구할 수 있기 때문에 정말 간편하게 제작할 수 있을거라 생각합니다!

 

 

 

 

동영상

 

 

 

 

 

필요한 부품 목록

 

NO부품명수량상세설명
1OrangeBoard WiFi1WizFi250라이브러리 사용
2I2C LCD1I2C 4핀 16×2 LCD
3푸시 버튼2
4LED1
5저항1330옴

 

부품명OrangeBoard WiFiI2C LCD택트 스위치LED저항
파트

 

 

 

 

하드웨어 making

 

 

 

 

 

 

 

소프트웨어 coding

 

 

 

 

 

이전 글과 마찬가지로 코드에서 SSID, PASS, APIKEY, ROUTEID, STATIONID는 사용자가 직접 입력하는 부분입니다.

각각 WiFi이름, WiFi패스워드, 공개키, 노선ID, 정류소ID입니다.

 

 이 부분만 잘 입력하면 문제없이 작동되는 것을 확인하였습니다.

 

 

 

버튼의 기능은 아래사진과 같습니다.

 

디지털 7번핀에 연결된 버튼(흰색)을 누를경우에는 Gbus에 연결하여 현재 내가 지정한 버스의 시간 정보를 읽어옵니다.

디지털 6번핀에 연결된 버튼(노란색)을 누를경우에는 정보에서 원하는 정보만 파싱해서 LCD에 출력합니다.

 

 

 

 

LCD는 꼭 16×2 LCD를 사용하지 않더라도 OLED나 한글LCD 등의 다양한 LCD를 사용하여 사용할 수 있습니다.

다만 WiFi보드에서 SPI통신을 사용하고 있기 때문에 SPI통신핀과 겹치지 않는 선에서 선택하셔야 합니다.

 

제가 선택한 LCD는 I2C통신을 사용하기 때문에 SPi와 겹치지 않고 선 또한 간결하게 연결하여 사용하기 때문에 쉽게 사용할 수 있었습니다.

다만 위에서 사용한 16×2 LCD는 액정이 작기 때문에 다양한 정보를 한 화면내에 출력하는 것이 어려웠습니다.

그래서 위 사진과 같이 도착예정시간과 현재 위치만을 한 화면에 출력하게 만들었습니다.

 

 

 

 

위에 보이는 파란색 LED는 데이터를 요청하여 응답받는데 성공했을 경우 불이 잠깐 켜졌다 꺼지게 됩니다.

LED가 켜지는 것을 확인했다면 노란 버튼을 눌러 버스 정보를 읽어올 수 있습니다.

 

버스 정보는 5초 간격으로 첫 번째 도착 예정 버스, 두 번째 도착 예정 버스 정보가 출력됩니다.

 

LCD의 첫 줄에는 지정한 정류장에 도착하기까지 남은시간이 출력되고

두 번째 줄에는 지정한 정류장에 도착하기까지 남은 정류장 수가 출력됩니다.

 

 

 

 

손재주가 부족하여 많이 만들지는 못했지만 잘 꾸밀 수만 있다면 좋은 프로젝트가 될 수 있을거 같습니다!

 

감사합니다^^;

COMMENTS

Please Login to comment
  Subscribe  
Notify of
POSTED BY