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);
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
|