樹莓派 micro:bit meteorologist 物聯網氣象站

2017-08-26 10:55

 micmicro:bit meteorologist 物聯網氣象站 

What you will make

在這個資源中,你可以將你的micro:bit變成一個氣象學家,可以顯示未來七天的天氣預報,無論你居住在哪裡。

What you will learn

通過創建微型氣象學家,您將學習:

如何開始您的微:位和您的Raspberry Pi之間的雙向通信

如何使用PyOWM獲取天氣預報

如何創建自定義圖像以顯示在微:位上

這個資源涵蓋了以下Raspberry Pi數字製作課程的內容:

應用抽象和分解來解決更複雜的問題

組合輸入和/或輸出來創建項目或解決問題

 

What you will need

Hardware

除了帶有SD卡和常規外圍設備的Raspberry Pi,您還需要:

BBC micro:bit

§ 

USB A to micro USB-B cable

Software

To prepare for this resource, you'll need an up-to-date SD card image. See the updating Raspbian guide.

You'll also need the following additional software installed:

§  Python 3 PyOWM

§  mu

For information on installing these libraries, see the software installation page.

Get started

 

                       

 

 

micro:bit meteorologist

在這個資源中,您將使用您的Raspberry Pi獲取七天的天氣預報。 然後,它可以將數據發送到您的micro:bit,這將在其5x5 LED矩陣上顯示圖形以顯示天氣。

Accessing OpenWeatherMaps

The first thing you'll have to do is get access to a weather API. API stands for Application Programming Interface. This sounds complicated, but it's just a set of rules telling your programs how to talk to other software.

您首先要做的就是訪問天氣API( weather API)。 API代表應用程序編程接口。 這聽起來很複雜,但它只是一組告訴你的程序如何與其他軟件交談的規則。

你要在這個資源中使用的天氣服務叫做OpenWeatherMap。 這是一個完全免費的服務,並且具有易於使用的API。 您將需要自己的帳戶,所以點擊鏈接去網站。

點擊“註冊”:

1.    選擇用戶名,輸入您的電子郵件地址,然後提供密碼:

    2.    登錄後,您應該看到一個帶有秘密API密鑰(secret API key)的頁面。 這很重要,因此請將其複製到剪貼簿中:

Getting the weather with Python

現在是使用一點Python來獲取天氣預報的時候了。

1.打開IDLE(菜單>編程> Python 3(IDLE)(Menu > Programming > Python 3 (IDLE)) )並創建一個新文件(File> New File)。

2.使用幾行Python 3,您可以訪問OpenWeatherMap API並獲得七天的預測:

import pyowm
 
## Copy and paste your key into the line below
KEY = '61a75f732e10039232d4122fbff52e96'
 
## Place your location (city, country code) into the line below
location = 'New York,us'
 
owm = pyowm.OWM(KEY)
fc = owm.daily_forecast(location)
f = fc.get_forecast()
icons = [weather.get_weather_icon_name() for weather in f]

1.    Save the file (Ctrl + s) and then run it (F5); the weather data should now be fetched.

保存文件(Ctrl + s),然後運行(F5); 現在應該獲取天氣數據。

要查看天氣數據,請切換到Python Shell並鍵入:

icons

您應該看到一些如下所示的數據:

```python
['02d', '10d', '01d', '01d', '10d', '10d', '01d']
```

這些字符串表示描述您所在位置的天氣的圖標。 您可以通過查看OpenWeatherMap網站查看他們的意思,或查看下面的圖片:

Displaying weather icons

接下來,您將為micro:bit編寫一些MicroPython代碼以顯示天氣圖標。

使用USB A-to-micro-B電纜將micro:bit連接到Raspberry Pi上。

打開mu(菜單>編程> mu , Menu > Programming > mu

一個窗口應該打開,看起來像這樣:

 

現在你需要創建你的天氣圖標。 micro:bit有一個5x5 LED矩陣。 每個LED的亮度可以設置為0到9之間的值,0是關閉的,9是最亮的。

1.要創建圖像,請使用以下語法:

sun = Image('00000:'
        '00900:'
        '09990:'
        '00900:'
'00000:')

 以上將設置整個頂行像素關閉。 第二行像素將中間像素設置為最亮的級別

 要查看圖像,您可以添加一行,然後Flash程序:

sun = Image('00000:'
        '00900:'
        '09990:'
        '00900:'
        '00000:')
 
display.show(sun)

太陽圖標現在應該顯示在你的micro:bit。

接下來,您需要為上面顯示的每個圖標創建一個圖像。 你可以使用下面的那些,或者做一點更有創造力,讓自己的。 為了節省空間,圖像已經寫在單行上:

sun = Image('00000:00900:09990:00900:00000:')
few = Image('04040:44444:04040:00000:00000:')
cloud = Image('06060:66666:06060:00000:00000:')
broken = Image('09090:99999:09090:00000:00000:')
shower = Image('09090:99999:09090:30303:03030:')
rain = Image('07070:77777:07070:20202:02020:')
thunder = Image('90090:09009:00900:09009:90090:')
snow = Image('70707:07070:70707:07070:70707:')
mist = Image('22222:33333:22222:33333:22222:')

測試每個圖像,以確保它們看起來不錯。

Communication between the micro:bit and the Raspberry Pi

1.    micro:bit和Raspberry Pi可以通過USB進行通訊。 您將需要在Python文件頂部的另一個導入行,因此切換回IDLE並添加一行,如下所示:

import pyowm
import serial
KEY = '61a75f732e10039232d4122fbff52e96'
location = 'New York,us'
owm = pyowm.OWM(KEY)
fc = owm.daily_forecast(location)
f = fc.get_forecast()
icons = [weather.get_weather_icon_name() for weather in f]

2.     要設置通信,需要設置一些變量:

## Edit the line below to the correct port
PORT = "/dev/ttyACM0"
##
BAUD = 115200
s = serial.Serial(PORT)
s.baudrate = BAUD
s.parity   = serial.PARITY_NONE
s.databits = serial.EIGHTBITS
s.stopbits = serial.STOPBITS_ONE
s.readline()

根據您連接到Raspberry Pi的內容,PORT行將有所不同。 要查看您的micro:bit連接到哪個端口,請將其從Raspberry Pi斷開,然後在LXTerminal中鍵入以下內容:

ls /dev/ttyA*

重新連接micro:bit並再次鍵入行:

ls /dev/ttyA*

你應該在列表中看到一個新的條目。 這是您的micro:bit連接到的端口,因此編輯Python文件中的行以顯示正確的端口。

保存並運行該文件,並檢查您是否收到錯誤。

Sending the weather

接下來,您將要將天氣數據從圖標列表發送到micro:bit。 將發送的特定圖標將取決於micro:bit的按鈕。

通過將圖標設置為列表中的第0個項目開始:

icon = 0

接下來,在無限循環中,您可以將圖標發送到micro:bit。 數據需要編碼才能發送:

while True:
    s.write(icons[icon%len(icons)].encode('utf-8'))
 
s.close()

Receiving the weather data

1.切換回 mu。

2.要選擇正確的圖像,您需要將其存儲在字典中。 將以下行添加到您的MicroPython文件中:

weather = {'01d': sun, '02d':few, '03d': cloud, 
      '04d': broken, '09d': shower, '10d':rain,'1
1d':thunder, '13d':snow, '50d': mist}

現在,在無限循環中,您可以從Raspberry Pi獲取當前天氣,並顯示正確的天氣圖標。 從Raspberry Pi發送的數據需要解碼:

while True:
    sleep(500)
    try:
        bytestring = uart.readline()
        icon = weather[str(bytestring,'utf-8')]
        display.show(icon)
    except:
pass

將程序閃存到你的micro:bit,然後切換回IDLE並在那裡運行Python程序。 您應該在micro:bit上看到一個天氣圖標。

Cycling over the forecast

由Raspberry Pi收集的天氣數據是七天預報。 下一步將是允許微:比特超越預測。 為了做到這一點,你需要讓微:點對面的Raspberry Pi。 這很容易使用print()語句。

在mu中,創建一個函數來獲取micro:bit的按鈕按下:

def get_sensor_data():
    a, b = button_a.was_pressed(), button_b.was_pressed() 
print(a, b)

然後調用while循環中的函數:

while True:
    sleep(500)
    get_sensor_data()
    try:
        bytestring = uart.readline()
        icon = weather[(str(bytestring))[2:-1]]
        display.show(icon)
    except:
        pass

回到IDLE,你需要讓Raspberry Pi讀取從micro:bit發送的數據。 更改while循環,使其看起來像這樣:

while True:
    s.write(icons[icon%len(icons)].encode('utf-8'))
    data = s.readline().decode('UTF-8')
data_list = data.rstrip().split(' ')

data_list現在應該包含從micro:bit發送的數據。 它應該包含True和False數據類型,具體取決於按鈕A或按鈕B是否被按下。 如果按下按鈕,現在可以更改圖標的值。

while True:
    s.write(icons[icon%len(icons)].encode('utf-8'))
    data = s.readline().decode('UTF-8')
    data_list = data.rstrip().split(' ')
    try:
        a,b = data_list
        if a == 'True':
            icon -= 1
            print(icon%len(icons))
        if b == 'True':
            icon += 1
            print(icon%len(icons))
    except:
       pass

嘗試再次閃爍micro:bit,然後運行程序。 按下按鈕A或B可以循環瀏覽當前位置的天氣圖標。 如果某些事情不起作用,請使用以下完整的代碼清單檢查您的代碼。

micro:bit code

from microbit import *
 
sun = Image('00000:'
        '00900:'
        '09990:'
        '00900:'
        '00000:')
few = Image('04040:'
        '44444:'
        '04040:'
        '00000:'
        '00000:')
cloud = Image('06060:'
          '66666:'
          '06060:'
          '00000:'
          '00000:')
broken = Image('09090:'
           '99999:'
           '09090:'
           '00000:'
           '00000:')
shower = Image('09090:'
           '99999:'
           '09090:'
           '30303:'
           '03030:')
rain = Image('07070:'
         '77777:'
         '07070:'
         '20202:'
         '02020:')
thunder = Image('90090:'
        '09009:'
        '00900:'
        '09009:'
        '90090:')
snow = Image('70707:'
         '07070:'
         '70707:'
         '07070:'
         '70707:')
mist = Image('22222:'
         '33333:'
         '22222:'
         '33333:'
         '22222:')
 
weather = {'01d': sun, '02d':few, '03d': cloud, 
       '04d': broken, '09d': shower, '10d':rain,
       '11d':thunder, '13d':snow, '50d': mist}
 
def get_sensor_data():
    a, b = button_a.was_pressed(), button_b.was_pressed()
    print(a, b)
 
while True:
    sleep(500)
    get_sensor_data()
    try:
        bytestring = uart.readline()
        icon = weather[(str(bytestring))[2:-1]]
        display.show(icon)
    except:
        pass

Raspberry Pi code

import pyowm
import serial
 
KEY = '61a75f732e10039232d4122fbff52e96'
location = 'New York,us'
owm = pyowm.OWM(KEY)
fc = owm.daily_forecast(location)
f = fc.get_forecast()
icons = [weather.get_weather_icon_name() for weather in f]
 
PORT = "/dev/ttyACM0"
BAUD = 115200
s = serial.Serial(PORT)
s.baudrate = BAUD
s.parity   = serial.PARITY_NONE
s.databits = serial.EIGHTBITS
s.stopbits = serial.STOPBITS_ONE
s.readline()
 
icon = 0
 
while True:
    s.write(icons[icon%len(icons)].encode('utf-8'))
    data = s.readline().decode('UTF-8')
    data_list = data.rstrip().split(' ')
    try:
        a,b = data_list
        if a == 'True':
            icon -= 1
            print(icon%len(icons))
        if b == 'True':
            icon += 1
            print(icon%len(icons))
    except:
        pass
 
s.close()

What next?

您可以對代碼進行一些更改以提供動畫天氣圖標。 看看文檔,看看如何為micro:bit製作動畫。

您可以使用Touch Develop來編寫您的micro:bit 代碼。 這使用藍牙功能與計算機通信並接收天氣數據,為您提供便攜式氣象學家。

Microbit 台灣 商店購買

Microbit 中文 課程 : Python , Javascript物聯網

              中國

 

—————

返回