코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
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
rss_link = 'http://weather.yahooapis.com/forecastrss?w=1132599&u=c'
sudo python weatherStation.py
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연결하는 방법과 같습니다. 밑의 핀번호를 보시고 맞는 핀에 연결하세요.(잘못 연결 시 라즈베리 파이가 고장날 수 있습니다.)
- 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()
위에서 실행해본 라즈베리 파이로 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
항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!