在沒有WiFi的環境中,也能自己做出氣象預報顯示器!

目前常見的物聯網裝置大多仍是使用WiFi為主,但部分較難建構良好WiFi環境的偏鄉地區,就可以利用NBIoT作為聯網媒介取代。

透過WiFi連線常會需要顧及許多因素和限制,像是2.4G頻率數量過多導致干擾太嚴重、物理距離限制、WiFi與聯網裝置中間的干擾因素導致訊號變弱等多項因素,而NBIoT就是良好的替代方案!

這次我們就來實作一個能取得城市氣象預報資料,並透過LED點矩陣顯示器顯示的NBIoT聯網裝置;城市氣象預報資料來源為openweather,有著全球高達20多萬的城市的氣象資料,本次將以高雄市的溫濕度及降雨機率資料為例。

 

所需材料

  • ESP32

  • AM7020(含SIM Card、天線)

  • 8x8 LED點矩陣*4

  • 杜邦線數條

 

ESP32

ESP32是一塊同時具有WiFiBluetooth功能的開發板,具有兩組HW UART。這次範例會使用第二組HW UARTAM7020溝通,並將Protocol Stack 建置在 ESP32上。

 

AM7020

AM7020是一款NBIoT模組,模組本身支援HTTP(S)、MQTT(S)、TLS等多項Protocol,加上專屬AM7020的Arduino Library,讓使用門檻大大降低,對初學者相當親切的一款模組。

 

8x8 LED點矩陣顯示器

這次使用的8x8 LED點矩陣顯示器是經過模組化過的版本,本身已內建MAX7219 IC。

MAX7219 是一種整合的串列輸入/輸出共陰極顯示驅動器,可以和任何支援SPI的MCU相連,MCU只需透過SPI介面就可以將相關的指令寫入 MAX7219 的資料暫存器。此外它還支援多片 MAX7219 串聯方式,這樣MCU就能只透過三根線(即串列資料線:Din、串列時鐘線:Clock和晶片選擇線:CS)控制更多的 7 段顯示器或 8*8 矩陣式 LED 顯示器,而我們這次會使用串接方式控制4個8x8點矩陣LED顯示器達成跑馬燈的效果。

 

專案架構

ESP32作為主控版,透過UART與AM7020溝通;AM7020使用restful api取得openweather資料,最後將資料回傳至ESP32解析並以SPI控制8x8 LED點矩陣顯示器顯示城市名稱、溫度、溼度及降雨機率。

 

3大步驟:

1. 取得openweather api key

2. 硬體配置

3. 程式說明

 

1. 取得openweather api key

Openweather是一個氣象資料中心,提供的資料區間包含歷史、當前及預測資料,從溫度、濕度、降雨機率、風速到紫外線等,種類相當多。openweather 提供的API也很完整(openweather API文件),我們這次使用的API最多能夠取得指定城市「未來五天」的氣象資料,每筆資料間隔為三小時;我們只需取未來3小時內的預測資料作為顯示用途,API詳細使用方式會留到程式說明的段落為大家解釋。

使用它的API需要帶入API Key。首先去openweather官網註冊免費帳號,完成後可從網頁右上方使用者名稱下拉選單 My API Keys得到自己專屬的API Key,並把api key紀錄下來(之後程式會用到);這裡有一點要特別注意,首次啟用API key需要等待10~20分鐘才可使用。

 

2. 硬體配置

ESP32

AM7020

8x8點矩陣LED

5v

V

-

3v3

-

Vcc

GND

G

GND

TX2

R

-

RX2

T

-

D5

EN

-

D23

-

DIN

D18

-

CLK

D15

-

CS

 

3. 程式說明

程式碼請參閱Github( https://github.com/JiekangHuang/ESP32_openweather )。

 

程式將使用到以下五個Library,請先去Github上下載下來放到Arduino Library資料夾底下。

 

在整體通訊上我們使用HTTPS與OpenWeather溝通,而實際上實作通訊架構上我們分為三層,由上到下分別為HTTP、TLS、TCP。每層架構獨自完成各自工作後再將結過傳送至下層,最終由AM7020發送到OpenWeather。

從OpenWeather收回來的資料格式為JSON,所以使用ArduinoJson library來解析各欄位,最後將要顯示的字串直接透過Max72xxPanel library發送至8x8 LED點矩陣做顯示。 

本次使用的openweather api為下方紅色顯示字段,參數q為城市名稱,appid為API key,units為資料單位,cnt為資料筆數。如要修改參數內容可直接修改範例程式config.h,程式碼第64行為城市名稱(可自行修改為其他縣市,例如台北、台中),第66行為資料單位;預設是英制,我們指定使用公制作為單位,資料筆數按使用需求調整,這次只使用到未來三小時內預測資料,所以參數cnt固定為1筆。

 

api.openweathermap.org/data/2.5/forecast?q=Kaohsiung,tw&appid=XXXXXXXX &units=metric&cnt=1

上圖為本次呼叫openweather api所回傳的資料,資料格式為JSON,依照上圖所需資料欄位去做相應的解析。在ESP32上則使用ArduinoJson library解析,對應的解析程式碼為ESP32_openweather.ino檔中第91到94行,分別為取得溫度、濕度、降雨機率及城市名稱。

範例程式碼config.h檔第65行請改為自己的openweather api key。

 

成品

ESP32將會每小時透過AM7020去抓openweather的溫度、濕度及降雨機率預報資料(往後三小時的預報資料),並顯示在LED矩陣顯示器上。

 

小結

3步驟即可完成NBIoT天氣預報顯示器!NBIoT基地台訊號覆蓋率強、干擾低所帶來的優勢可以將它放置在任何地方,放在家門口就能每天出門前確認今日溫溼度和降雨機率,出門也不怕忘記帶傘啦。

這類型的應用還有非常多,例如室外型的聯網時鐘、顯示紫外線強度等等,未來有機會再為大家介紹實作方法,喜歡的朋友記得分享收藏文章,並持續關注我們分享更多簡易的實作案例。