在沒有WiFi的環境中,也能自己做出氣象預報顯示器!
目前常見的物聯網裝置大多仍是使用WiFi為主,但部分較難建構良好WiFi環境的偏鄉地區,就可以利用NBIoT作為聯網媒介取代。
透過WiFi連線常會需要顧及許多因素和限制,像是2.4G頻率數量過多導致干擾太嚴重、物理距離限制、WiFi與聯網裝置中間的干擾因素導致訊號變弱等多項因素,而NBIoT就是良好的替代方案!
這次我們就來實作一個能取得城市氣象預報資料,並透過LED點矩陣顯示器顯示的NBIoT聯網裝置;城市氣象預報資料來源為openweather,有著全球高達20多萬的城市的氣象資料,本次將以高雄市的溫濕度及降雨機率資料為例。
所需材料
-
ESP32
-
AM7020(含SIM Card、天線)
-
8x8 LED點矩陣*4
-
杜邦線數條
ESP32
ESP32是一塊同時具有WiFi及Bluetooth功能的開發板,具有兩組HW UART。這次範例會使用第二組HW UART與AM7020溝通,並將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資料夾底下。
-
TinyGsm(產生TCP封包)
-
SSLClient(產生TLS封包)
-
ArduinoHttpClient(產生HTTP封包)
-
ArduinoJson(解析JSON資料)
-
arduino-Max72xxPanel(驅動8x8 LED點矩陣)
在整體通訊上我們使用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 |