고급 예제

다양한 도구들을 가지고 마음껏 응용해보세요.

라즈베리 파이 응용-디지털 날씨 정보 출력하기

2014-12-15 16:41:53

라즈베리 파이로 날씨 정보 받아오기


이제까지 앞에서 라즈베리 파이를 이용하는 방법들을 소개했습니다. 앞에서 소개한 내용들을 이용하여 라즈베리 파이로 디지털 날씨 관측소를 만들어 봅시다.

간단한 16X2 LCD 화면에 오늘 날씨 정보를 출력하면서, 라즈베리 파이 사용과 GPIO핀 설정 및 제어를 다시 해보겠습니다.

우선 날씨 정보를 받아보고 모니터에 출력해보겠습니다. 이 후 라즈베리 파이에 LCD를 연결하여 LCD화면에 출력해 보겠습니다.

 

소프트웨어 코드

#!/usr/bin/env python

#import

import time
import feedparser
import os

#
#THE WEATHER CODE
#

while True:
	rss_link = 'http://weather.yahooapis.com/forecastrss?w=1132599&u=c'
	d = feedparser.parse(rss_link)

	location  = d.feed.yweather_location
	atmosphere = d.feed.yweather_atmosphere
	astronomy = d.feed.yweather_astronomy
	city = location['city']
	humidity = atmosphere['humidity']
	sunrise = astronomy['sunrise']
	sunset = astronomy['sunset']	
	
	summary = d.entries[0].summary
	temp = summary.split("High: ")
	temp = temp[1].split(" Low: ")
	high = temp[0]
	low = temp[1].split("<br />")[0]

	print ("Weather for "+city)
	print ("Low Temp:  "+low)
	print ("High Temp: "+high)
	print ("Humidity:  "+humidity)
	print ("Sunrise:   "+sunrise)
	print ("Sunset:    "+sunset)
		
	time.sleep(300)

# 출처 : Raspberry Pi Magazine(neil-black.co.uk) - Weather Station

 * 코드를 IDLE이나 Nano 에디터를 이용하여 작성합니다. 에디터의 사용법은 라즈베리 파이 시작히가_GPIO핀을 이용하여 LED제어해보기 소프트웨어 코딩하기 부분에 간단하게 설명되어 있습니다. 참고하여 작성하시기 바랍니다.

위 코드는 Yahoo Weather에서 지역 날씨정보를 받아서 도시명, 최저온도, 최고온도, 습도, 일출시간, 일몰시간을 창에 출력해 주는 코드입니다.(300초마다 갱신합니다.)
 
rss_link = 'http://weather.yahooapis.com/forecastrss?w=1132599&u=c'
위 rss_link주소는 날씨정보를 받을 야후 api 주소입니다. 뒤쪽에 forecastrss?w=___ 부분에 지역 코드를 적으시면 해당지역의 날씨 정보를 받습니다.

해당 지역 코드는 Yahoo Weather에서 지역을 검색하시면 주소칸에 지역코드가 나옵니다.
(밑의 사진에 작은 네모안에 있는 숫자, 서울의 경우 1132599입니다.)


마지막에 u=c 부분은 온도 표시 방법입니다. C는 섭씨, F는 화씨 입니다. 필요에 맞게 수정하시면 됩니다.

위 코드를 다 작성하셧으면 실행해 봅시다. (자신이 저장한 파일명을 입력합니다. 저는 weatherStation.py로 저장했습니다.)
 
sudo python weatherStation.py

실행을 하면 밑의 화면과 같이 날씨 정보가 나옵니다.(300초마다 갱신)



* 위에서 출력하는 부분은 제공하는 날씨 정보 중 일부분만 받아서 출력합니다. api 정보를 보면 위에 있는 정보 외에도 체감온도, 풍향, 풍속, 기압 등 여러가지 정보를 제공합니다.
 (인터넷 브라우져를 이용하여 rss_link에 적힌 주소에 접속하면 밑의 화면과 같이 api 정보가 나옵니다. 확인하시고 필요한 정보를 받아서 사용하시면 됩니다.)
 (밑의 화면은 크롬으로 접속한 화면입니다. 익스플로러는 다르게 나옵니다.)

라즈베리 파이로 날씨 정보 LCD에 띄우기

부품 목록

NO 부품명 수량 상세설명
1 Raspberry Pi  1 Model B+
2 Wifi 동글 1 ipTIME N100 mini
3 LCD 1 MC1602-13
4 가변저항 1 potentiometer
5 브레드보드 1 브레드보드
6 점퍼케이블 24 라즈베리 파이에 연결하는 방법에 따라
케이블 수가 변할 수 있습니다.
부품명 라즈베리 파이 Wifi 동글 LCD
파 트
부품명
가변저항
브레드보드
점퍼케이블
파 트

 

 

동영상

 

 

 

 

 

회로도

 

 

 

 

브레드보드 레이아웃

 

 

LCD연결

아두이노에 LCD연결하는 방법과 같습니다. 밑의 핀번호를 보시고 맞는 핀에 연결하세요.(잘못 연결 시 라즈베리 파이가 고장날 수 있습니다.)

 - Raspberry Pi Model B+ GPIO핀 배열

 

 

 

LCD핀번호 연결
1 GND
2 5V
3 가변저항 가운데 핀
4 라즈베리 파이 26번 핀(GPIO7)
5 GND
6 라즈베리 파이 24번 핀(GPI8)
7~10 연결 안함
11 라즈베리 파이 22번 핀(GPIO25)
12 라즈베리 파이 18번 핀(GPIO24)
13 라즈베리 파이 16번 핀(GPIO23)
14 라즈베리 파이 12번 핀(GPIO18)
15 5V
16 GND

 

 

 

소프트웨어 코드

 

#!/usr/bin/env python

#import
import RPi.GPIO as GPIO
import time
import feedparser

GPIO.cleanup()

#
# THE LED DRIVER CODE
#

# Define GPIO to LCD mapping
LCD_RS = 7
LCD_E  = 8
LCD_D4 = 25 
LCD_D5 = 24
LCD_D6 = 23
LCD_D7 = 18
LED_ON = 15

# Define some device constants
LCD_WIDTH = 16    # Maximum characters per line
LCD_CHR = True
LCD_CMD = False

LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line 

# Timing constants
E_PULSE = 0.00005
E_DELAY = 0.00005

def main():
	# Main program block
	GPIO.setmode(GPIO.BCM)       # Use BCM GPIO numbers
	GPIO.setup(LCD_E, GPIO.OUT)  # E
	GPIO.setup(LCD_RS, GPIO.OUT) # RS
	GPIO.setup(LCD_D4, GPIO.OUT) # DB4
	GPIO.setup(LCD_D5, GPIO.OUT) # DB5
	GPIO.setup(LCD_D6, GPIO.OUT) # DB6
	GPIO.setup(LCD_D7, GPIO.OUT) # DB7
	GPIO.setup(LED_ON, GPIO.OUT) # Backlight enable

def lcd_init():
	# Initialise display
	lcd_byte(0x33,LCD_CMD)
	lcd_byte(0x32,LCD_CMD)
	lcd_byte(0x28,LCD_CMD)
	lcd_byte(0x0C,LCD_CMD)  
	lcd_byte(0x06,LCD_CMD)
	lcd_byte(0x01,LCD_CMD)  

def lcd_string(message,style):
	if style==1:
		message = message.ljust(LCD_WIDTH," ")  
	elif style==2:
		message = message.center(LCD_WIDTH," ")
	elif style==3:
		message = message.rjust(LCD_WIDTH," ")

	for i in range(LCD_WIDTH):
		lcd_byte(ord(message[i]),LCD_CHR)

def lcd_byte(bits, mode):
	GPIO.output(LCD_RS, mode) # RS

	# High bits
	GPIO.output(LCD_D4, False)
	GPIO.output(LCD_D5, False)
	GPIO.output(LCD_D6, False)
	GPIO.output(LCD_D7, False)
	if bits&0x10==0x10:
		GPIO.output(LCD_D4, True)
	if bits&0x20==0x20:
		GPIO.output(LCD_D5, True)
	if bits&0x40==0x40:
		GPIO.output(LCD_D6, True)
	if bits&0x80==0x80:
		GPIO.output(LCD_D7, True)

	# Toggle 'Enable' pin
	time.sleep(E_DELAY)    
	GPIO.output(LCD_E, True)  
	time.sleep(E_PULSE)
	GPIO.output(LCD_E, False)  
	time.sleep(E_DELAY)      

	# Low bits
	GPIO.output(LCD_D4, False)
	GPIO.output(LCD_D5, False)
	GPIO.output(LCD_D6, False)
	GPIO.output(LCD_D7, False)
	if bits&0x01==0x01:
		GPIO.output(LCD_D4, True)
	if bits&0x02==0x02:
		GPIO.output(LCD_D5, True)
	if bits&0x04==0x04:
		GPIO.output(LCD_D6, True)
	if bits&0x08==0x08:
		GPIO.output(LCD_D7, True)

	# Toggle 'Enable' pin
	time.sleep(E_DELAY)    
	GPIO.output(LCD_E, True)  
	time.sleep(E_PULSE)
	GPIO.output(LCD_E, False)  
	time.sleep(E_DELAY)   

if __name__ == '__main__':
	main()
  
#
# THE WEATHER CODE
#

lcd_init()

i = 0

try:
	while True:
		rss_link = 'http://weather.yahooapis.com/forecastrss?w=1132599&u=c'
		if i == 0 or i == 20: 
			d = feedparser.parse(rss_link)
			i = 1
		i += 1		
		
		location  = d.feed.yweather_location
		atmosphere = d.feed.yweather_atmosphere
		astronomy = d.feed.yweather_astronomy
		summary = d.entries[0].summary
		temp = summary.split("High: ")
		temp = temp[1].split(" Low: ")
		high = temp[0]
		low = temp[1].split("<br />")[0]
	
		city = location['city']
		humidity = atmosphere['humidity']
		sunrise = astronomy['sunrise']
		sunset = astronomy['sunset']
	
		lcd_byte(LCD_LINE_1, LCD_CMD)
		lcd_string(city, 2)
		lcd_byte(LCD_LINE_2, LCD_CMD)
		lcd_string("Low Temp: "+low, 2)
	
		time.sleep(4)
		
		lcd_byte(LCD_LINE_1, LCD_CMD)
		lcd_string(city, 2)
		lcd_byte(LCD_LINE_2, LCD_CMD)
		lcd_string("High Temp: "+high, 2)
		
		time.sleep(4)
		
		lcd_byte(LCD_LINE_1, LCD_CMD)
		lcd_string(city, 2)
		lcd_byte(LCD_LINE_2, LCD_CMD)
		lcd_string("Humidity: "+humidity, 2)
		
		time.sleep(4)
		
		lcd_byte(LCD_LINE_1, LCD_CMD)
		lcd_string(city, 2)
		lcd_byte(LCD_LINE_2, LCD_CMD)
		lcd_string("Sunrise: "+sunrise, 2)
	
		time.sleep(4)
		
		lcd_byte(LCD_LINE_1, LCD_CMD)
		lcd_string(city, 2)
		lcd_byte(LCD_LINE_2, LCD_CMD)
		lcd_string("Sunset: "+sunset, 2)
		
		time.sleep(4)
		
except KeyboardInterrupt:
	lcd_init()
	GPIO.cleanup()
# 출처 : Raspberry Pi Magazine(neil-black.co.uk) - Weather Station

위에서 실행해본 라즈베리 파이로 Yahoo Weather에서 날씨 데이터를 받아오는 코드에서 LCD를 설정하고 받아온 날씨 정보를 LCD에 출력하는 부분이 추가되었습니다.

16X2 LCD에서 첫번째 줄에는 지역명을 출력하고, 두번째 줄에서는 최저온도, 최고온도, 습도, 일출시간, 일몰시간을 4초마다 순서대로 출력합니다.
 

		lcd_byte(LCD_LINE_1, LCD_CMD)
		lcd_string(city, 2)
		lcd_byte(LCD_LINE_2, LCD_CMD)
		lcd_string("Low Temp: "+low, 2)
	
		time.sleep(4)
		
		lcd_byte(LCD_LINE_1, LCD_CMD)
		lcd_string(city, 2)
		lcd_byte(LCD_LINE_2, LCD_CMD)
		lcd_string("High Temp: "+high, 2)
		
		time.sleep(4)
		
		lcd_byte(LCD_LINE_1, LCD_CMD)
		lcd_string(city, 2)
		lcd_byte(LCD_LINE_2, LCD_CMD)
		lcd_string("Humidity: "+humidity, 2)
		
		time.sleep(4)
		
		lcd_byte(LCD_LINE_1, LCD_CMD)
		lcd_string(city, 2)
		lcd_byte(LCD_LINE_2, LCD_CMD)
		lcd_string("Sunrise: "+sunrise, 2)
	
		time.sleep(4)
		
		lcd_byte(LCD_LINE_1, LCD_CMD)
		lcd_string(city, 2)
		lcd_byte(LCD_LINE_2, LCD_CMD)
		lcd_string("Sunset: "+sunset, 2)
		
		time.sleep(4)

LCD에 데이터를 출력하는 부분입니다. Parsing 하는 부분에서 필요한 정보를 받은 다음에 lcd_byte() lcd_string() 함수를 통해서 자신이 원하는 위치에 원하는 데이터를 출력하면 됩니다.

lcd.string() 에서 괄호 안에 첫번째 변수는 출력할 문자이고 두번째 변수는 문자의 위치를 정하는 변수 입니다. 1은 왼쪽 정렬, 2는 가운데 정렬, 3은 오른쪽 정렬입니다.

time.sleep(4) 는 4초간 딜레이를 주는 부분입니다. 날씨 정보를 출력해 주는 사이 시간을 줄이거나 늘리실려면 이 부분을 수정하시면 됩니다.
(ms단위가 아닌 s 단위 입니다. )

코드를 다 작성하셧으면 python 명령어를 이용하여 실행해 봅시다. 실행을 하면 LCD화면에 도시명과 오늘 날씨 정보가 출력이 됩니다.(파일명 확인)

sudo python weatherStation.py 


kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

라즈베리 파이, 기타

xoskd 2017-03-25 21:10:13

라즈베리파이os가 라즈비언으로 설치되어있으면 못하나여??

ReDak 2017-11-24 17:33:46

크롬이나 인터넷 브라우져를 이용하여 rss_link에 적힌 주소에 접속이 안됩니다.
그리고 야후api로 날씨정보를 받아오는건 이제 막혔다고 들었는데 맞나요?