目錄
- 1. 專案功能簡介
- 2. 硬體準備
- 3. 原始碼分析
- 3.1 NTP時間獲取分析
- 3.2 MAX7219 八位數碼管驅動分析
- 3.3 DS1302 RTC時鐘模塊驅動分析
- 3.4 工程原始碼獲取
- 4. 效果展示
- 更多資料
1. 專案功能簡介
物聯網時鐘應用以安信可ESP-C3-12F模組為主控模塊,外接MAX7219 八位數碼管、DS1302 RTC時鐘模塊、5個功能按鍵以及兩個只是燈組成,設備訪問NTP服務器獲取本地時間,并存盤到DS1302 RTC時鐘中,RTC時鐘基于當前的時間計時,同時,實時時間通過數碼管顯示出來,設備可通過按鍵指示進入各種模式,模式包括:時間自動校準模式、手動校準模式、以及配網模式,
物聯網時鐘主要由五個功能模塊組成:
a. NTP時間獲取,用于時間校準
b. RTC實時時鐘,用于系統計時
c. 8位數碼管顯示模塊,用于顯示當前時間或模式切換
d. 按鍵,用于作業模式的切換
e. LED燈,用于網路狀態指示
2. 硬體準備
| 硬體名稱 | 數量 |
|---|---|
| ESP-C3-12F模組 | 1 |
| 4位陰極數碼管 | 2 |
| MAX7219驅動芯片 | 1 |
| DS1302 RTC時鐘模塊 | 1 |
| 按鍵 | 5 |
| LED燈 | 2 |
| LED燈 | 2 |
| AMS1117 | 1 |
| 電容、電阻 | 若干 |
3. 原始碼分析
整個設備原始碼主要分為三大塊:NTP時間獲取、MAX7219 八位數碼管驅動以及DS1302 RTC時鐘模塊驅動,

3.1 NTP時間獲取分析
NTP時間的獲取,我們通過呼叫ESP32C3官方SDK中的SNTP函式庫的API即可實作NTP時間的獲取,具體操作步驟如下:
- 初始化sntp:
sntp_setoperatingmode(SNTP_OPMODE_POLL);
sntp_setservername(0, "ntp1.aliyun.com); //配置訪問的NTP服務器
sntp_init();
- 獲取時間戳并決議:
setenv("TZ", "CST-8", 1); //設定中國時區——東八區
tzset();
time(&now); //讀取時間戳
SNTP_SET_SYSTEM_TIME(now);
localtime_r(&now, &timeinfo); ///決議時間戳,獲取年月日時分秒周等資訊
3.2 MAX7219 八位數碼管驅動分析
MAX7219 八位數碼管模塊由MAX7219芯片以及兩個4位陰極數碼管組成,其中MAX7219芯片用于驅動并點亮數碼管,從而實作實時時間的顯示功能,
MAX7219芯片主要通過半雙工的SPI總線實作驅動,在本設備中,我們通過模擬SPI總線的方法實作對改芯片的驅動,驅動該芯片主要用到的API有:
- 引腳初始化:max7219_spi_gpio_init(void)
gpio_config_t max7219_io = {
.intr_type = GPIO_INTR_DISABLE,
.mode = GPIO_MODE_OUTPUT,
.pin_bit_mask = MAX7219_PIN_SEL,
.pull_down_en = 0,
.pull_up_en = 0,
};
gpio_config(&max7219_io);
- 寫一個位元組資料:** spi_max7129_write_byte(uint8_t data) **
uint8_t i = 0;
gpio_set_level(PIN_NUM_CS, 0);
for (;i < 8;i++) {
gpio_set_level(PIN_NUM_CLK, 0);
gpio_set_level(PIN_NUM_MOSI, data & 0X80);
data = data << 1;
gpio_set_level(PIN_NUM_CLK, 1);
}
- 寫資料到指定暫存器中:** write_max7129(uint8_t address, uint8_t data) **
gpio_set_level(PIN_NUM_CS, 0);
spi_max7129_write_byte(address);
spi_max7129_write_byte(data);
gpio_set_level(PIN_NUM_CS, 1);
最后,用戶根據max7129的芯片資料手冊寫資料至對應的配置暫存器中,用于配置數碼管的顯示亮度等引數以及設定顯示內容,這里我們通過配置顯示檢測暫存器用以檢測數碼管是否正常作業,
通過資料手冊描述(如下圖)可得,顯示檢測我們需要往0x0F暫存器寫入0x01資料:

代碼實作:
max7219_spi_gpio_init();
write_max7129(0x0f, 0x01);
3.3 DS1302 RTC時鐘模塊驅動分析
DS1302 RTC時鐘模塊主要通過同步半雙工通訊串口完成驅動,該模塊的驅動需要用到一根時鐘線(I/O)、一根資料線(SCLK)以及一根控制線,用戶根據該模塊資料手冊中關于驅動的時序圖寫驅動程式,相關驅動代碼如下:
- 讀、寫以及傳輸介面:
void DS1302_transferBegin(DS1302_Dev* dev);
void DS1302_transferEnd(DS1302_Dev* dev);
void DS1302_writeAddrCmd(DS1302_Dev* dev, uint8_t value);
void DS1302_writeByte(DS1302_Dev* dev, uint8_t value);
uint8_t DS1302_readByte(DS1302_Dev* dev);
void DS1302_readBuffer(DS1302_Dev* dev, void* buf, uint8_t len);
- 時間獲取以及寫入介面:
void DS1302_setDateTime(DS1302_Dev* dev, DS1302_DateTime* dateTime);
bool DS1302_getDateTime(DS1302_Dev* dev, DS1302_DateTime* dateTime);
void DS1302_setTime(DS1302_Dev* dev, uint8_t hour, uint8_t minute, uint8_t second);
bool DS1302_getTime(DS1302_Dev* dev, uint8_t* hour, uint8_t* minute, uint8_t* second);
- 資料格式轉換介面:
uint8_t bcdToDec(uint8_t bcd);
uint8_t decToBcd(uint8_t dec);
3.4 工程原始碼獲取
原始碼獲取鏈接:https://gitee.com/seahi007/esp-c3_-io-ttimer.git
4. 效果展示

更多資料
以上就是本期分享的內容,目的在于讓大家快速適應新品方案的開發,以上提供的驅動原始碼聯系我們可以免費提供
官方官網:https://www.ai-thinker.com
開發資料:https://docs.ai-thinker.com/
官方論壇:http://bbs.ai-thinker.com
公司地址: 深圳市寶安區西鄉固戍華豐智慧創新港C棟410
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/332160.html
標籤:其他
