樹莓派 micro:bit meteorologist 物聯網氣象站
2017-08-26 10:55micmicro: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.
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
() forweather
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
() forweather
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
() forweather
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 中文 課程 : Python , Javascript, 物聯網
標籤:
—————