嘗試用ESP32和RTC做一個“鬧鐘”吧!

Originally published by Dec 3, 2019

本文最初發佈在deviceplus.jp網站上,而後被翻譯成英語。

目錄

  1. 前言
  2. 關於ESP32鬧鐘
  3. 創建日期和時間的“RTC”
  4. 在ESP32 LCD上顯示日期和時間
  5. 使用MP3模組發出鬧鈴響聲
  6. 給鬧鐘主機接線
  7. 給ESP32鬧鐘分機接線
  8. 安裝庫和字體檔
  9. Arduino IDE鬧鐘程式
  10. 分機程式
  11. 確認運行情況
  12. 結論
  13. 相關文章

前言

您每天早上被什麼鬧鐘吵醒?早上人們的一個常見問題是關掉鬧鐘並直接回去睡覺。
這一次,我們決定使用ESP32製作一個“鬧鐘”,應該有助於解決這個問題。

設計步驟

預計完成時間:120分鐘

名稱 賣方 價格
ESP32-DevKitC(2件) 貿澤電子 約10.00美元
DS3231 模組 Amazon 約3.00美元
LIR2032(鈕扣充電電池) Amazon 約3.60美元
揚聲器 Amazon 約1.00~3.00美元
2.8英寸SPI連接器 320×240圖元LCD螢幕 Amazon 約15.00美元

*除上述物品外,還需要一個輕觸開關、一個LED和一個約100Ω的電阻。

use ESP32 to make a wake up alarm clock

關於ESP32鬧鐘

我們來使用ESP32完成一個目標吧:像普通鬧鐘一樣在螢幕上顯示日期和時間,並在指定的時間響起。在設計製作這款“鬧鐘”時,我們需要將分機按鈕(用於關閉鬧鐘)與鬧鐘主機分開放置。之所以這樣設計,是因為想要您必須起床並走到分機按鈕處才能將鬧鐘關掉。

如下面的視頻所示,使用兩個ESP,一個用於主機,另一個用於分機。在視頻中,主機和分機是挨著的,但如果透過Wi-Fi連接,它們是可以在Wi-Fi範圍內分開放置的。

將主機和分機分開放置時,請使用ESP32的Wi-Fi功能。兩個ESP32作為Web伺服器和用戶端運行,並相互通信,如圖1所示。

use ESP32 Wi-Fi function

圖 1 主機和分機之間的通信

創建日期和時間的“RTC”

對於Arduino等微控制器來說,通常能夠獲取在啟動程式後經過的時間。但是,您獲得的時間通常不是很準確,因為斷電時會重置經過時間。

而如果使用ESP32,則可以透過Wi-Fi連接到互聯網,以定期從互聯網上的NTP伺服器獲取日期和時間,並將其設置到ESP32上。但Arduino Uno等部分微控制器沒有互聯網連接功能,因此,擁有一種可以更輕鬆地處理日期和時間的機制會很方便。

這就是為什麼經常使用一種被稱作“RTC”(即時時鐘)的IC。 RTC是基於週期性發出信號的元件來計時的IC。此外,透過將其連接到電池等外部電源,即使在微控制器斷電時也可以繼續計時。

許多產品都採用RTC,此次,我們將使用一種名為“DS3231”的RTC模組。

在電子設計所用的RTC模組當中,DS3231模組很受歡迎,且很容易獲得。由於介面是I2C,因此只需要4根線。除了RTC功能,還具有溫度感測器功能(不過本文不會用到溫度感測器)。

此外,在照片1所示的DS3231上,安裝一個名為“LIR2032”的鈕扣電池,這樣即使在微控制器關閉的情況下也能繼續記錄日期和時間。LIR2032的電池尺寸與CR2032的相同,但不同的是它可充電。

RTC real time clock

照片1 DS3231模組

在ESP32 LCD上顯示日期和時間

由於鬧鐘用於查看當前日期和時間,因此需要以易於理解的方式顯示日期和時間。以下設備用於顯示日期和時間。

  • 7段LED
  • LED 矩陣
  • OLED 顯示器
  • 字元液晶顯示器
  • 圖形液晶顯示器

根據設備的不同,有不同的庫和不同的程式設計方法。這還取決於它是否適合您想要製作的作品。例如,7段LED僅適合以低成本顯示數位,但不適合顯示詳情。其中,圖形液晶顯示器是最通用的,可以用於許多不同的項目,所以我這次決定使用它。

市面上有各種類型的液晶顯示器模組,但對於今天的項目,我們將使用一個名為“ILI9341”的控制器,並使用SPI介面(照片2)。此外,液晶顯示器通常以2.2英寸/2.4英寸/2.8英寸尺寸出售,因此,請根據您正在做的作品類型進行相應調整。

LCD display

照片2 控制器用ILI9341 2.8英寸液晶顯示器

使用MP3模組發出鬧鐘鈴聲

既然是鬧鐘,在指定時間發出鈴聲是必需的。您可以將蜂鳴器連接到ESP32以產生單一鈴聲,但如果您願意,也可以使用自己喜歡的鈴聲。為此,我們將使用一個名為“DFPlayer Mini”的模組,它可以播放任何MP3資料(照片3)。
DFPlayer Mini是一個可以透過串口發送命令來播放microSD卡中MP3的模組。可以將一個小型揚聲器連接到揚聲器輸出引腳以產生鈴聲。

DFPlayer Mini to play MP3 in a microSD card

照片3 DFPlayer Mini

給鬧鐘主機接線

讓我們進入實際構建吧。首先,給鬧鐘接線。

使用兩個麵包板,一個配有ESP32和DS3231,另一個配有液晶顯示器(LCD)和DFPlayer Mini。各部件接線如圖2所示。

由於ESP32很寬,您只能在普通麵包板的一面放一根跳線。因此,請改用電源線只在一側、多一排插孔的麵包板(例如Sanhayato的SAD-101)。

ESP32和液晶顯示器透過SPI進行連接。ESP32可以使用兩個 SPI(VSPI和HSPI),但使用的是VSPI(引腳18/19/23)(表1)。

ESP32和DS3231透過I2C進行連接。在ESP32中,I2C可以分配給任何引腳,但我們使用標準引腳(SDA=21和SCL=22)(表 2)。

DFPlayer Mini 進行串列連接。ESP32可以使用3個串口,但為此請同時使用引腳16和引腳17(表3)。此外,將揚聲器連接到DFPlayer Mini“SPK1”和“SPK2”兩個引腳。

wiring alarm clock body

圖2 鬧鐘主機接線

ESP32引腳 液晶顯示器引腳
5V VCC
GND GND
5 CS
4 RESET
2 DC
23 MOSI
18 SCK
19 MISO

表 1:ESP32 與液晶顯示器的連接

 

ESP32 引腳 DS3231 引腳
5V VCC
GND GND
21 SDA
22 SCL

表 2:ESP32與DS3231的連接

 

ESP32 引腳 DFPlayer Mini 引腳
5V VCC
GND GND
16 TX
17 RX

表 3:ESP32與DFPlayer Mini的連接

給ESP32鬧鐘分機接線

接下來,我們將給分機接線。分機接線應按圖3所示進行。您所要做的就是將開關和 LED連接到ESP32。將開關的一側連接到ESP32的3V3引腳,另一側連接到引腳4。透過電阻器→LED再透過ESP32的引腳13連接到GND。

在讀取開關狀態的電路上插入一個上拉電阻或下拉電阻。但是,由於ESP32可以透過內部電阻進行上拉/下拉,因此省略了外部電阻。

wiring for the extension

圖3 分機接線

安裝庫和字體檔

完成接線工作後,您可以創建程式。首先,從安裝下面的各個庫開始。

  • Adafruit GFX
  • Adafruit ILI9341
  • RTCLib
  • DFRobotDFPlayerMini

安裝步驟如下:

  1. 啟動Arduino IDE。
  2. 選擇“Sketch”->“Include Library”->“Manage Library”菜單,以打開Library Manager。
  3. 在“Filter search”欄位中輸入“Adafruit GFX”。
  4. Adafruit GFX將在庫清單中顯示。按一下“Install”按鈕(圖 4)。
  5. 以相同的方式安裝每個庫。

有幾個名稱相似的RTCLib和DFPlayer庫。RTCLib 安裝“RTCLib by Adafruit”,而DFPlayer安裝“DFRobotDFPlayerMini by DFRobot”。

install library and font files

圖 4 Adafruit GFX庫安裝

此外,為透過大字元顯示時間,需要安裝字體檔。如果您下載並解壓縮以下zip檔,將可以獲得一個名為“FreeSans40pt7b.h”的文件。

打開Arduino IDE的標準草圖目的檔案夾,再打開“libraries”->“Adafruit_GFX_Library”->“Fonts”資料夾,將字體檔複製到那裡。
https://www.h-fj.com/deviceplus/font.zip

Arduino IDE鬧鐘程式

接下來,在Arduino IDE中創建一個鬧鐘程式並將其寫入ESP32。程式內容如清單1所示。

清單1:鬧鐘主機程式
程式內容(放在這裡)

但是,第17行到第21行需要改寫如下:

・第17/18行
根據您的Wi-Fi路由器的SSID/密碼重寫。
・第19行
指定要分配給ESS32的IP地址。根據您的Wi-Fi路由器的網路配置自行決定IP位址。
在普通IP位址中,四組數位用句點分隔,但在這一行中,它是函數參數的形式,所以四組數字用逗號分隔。
・第20行
指定网络默认网关的IP地址。通常,它是Wi-Fi路由器的IP地址。用逗號分隔IP位址中的四組數位。
・第21行
根據分配給分機ESP32的IP位址重寫。

例如,如果您想按照表4所示進行設置,請重寫第17行至第21行,如清單2所示。

項目 設定值
Wi-Fi 路由器 SSID my_wifi
Wi-Fi 路由器密碼 my_password
分配給主機ESP32的IP位址 192.168.1.101
預設閘道器IP地址 192.168.1.1
分配給分機ESP32的IP地址 192.168.1.102

分機程式

分機程式如清單3所示。

以與鬧鐘主機相同的方式重寫第5行到第9行。 但是,在第7行,指定分配給分機的IP地址。 此外,在第9行的“Main console IP address(主控台IP地址)”中指定鬧鐘的IP地址。

清單 3:分機程式

程式內容

 

確認運行情況

程式寫入主機/分機後,我們來確認一下運行情況。步驟如下:

    1. 準備一張32GB或以下的microSD卡,並創建一個名為“mp3”的資料夾。
    2. 準備好要用作鬧鐘鈴聲的MP3文件,將其命名為“0001.mp3”,並將其保存在mp3資料夾中。
    3. 將microSD卡插入DFPlayer Mini。
    4. 啟動主機和分機。
    5. 初始化和Wi-Fi設置完成後,當前日期和時間將顯示在主機上。
    6. 在與主機/分機處於同一網路的電腦上啟動Web流覽器,並連接到位址“http: // 主機IP位址/”。
    7. 鬧鐘設置表單將顯示在Web流覽器上,如照片4所示。指定時間並按一下“Alarm Settings”按鈕。
alarm clock settings

照片 4 鬧鐘設置

  1. 鬧鐘響起的時間設置為“Alarm set to 10:00:00”。
  2. 確認設置鬧鐘時主機會響起鈴聲。
  3. 確認設置鬧鐘時分機的LED亮起。
  4. 按分機上的開關檢查鬧鐘是否關閉。

如要取消鬧鐘設置,請使用Web流覽器連接到位址“http: //主機IP位址/”,然後按一下“Alarm Off”按鈕。

結論

ESP32可以透過Wi-Fi連接到網路。不僅可以聯網,還可以像今天的專案一樣,與網路上的各種適用的電子產品連接使用。

相關文章

想繼續探索Arduino的功能嗎?歡迎查看相關的文章: