在便携式环境状态检测器的设计中,对于检测的环境状态是需要有时间标定的,为此可通过ESP32 S2内置了RTC时钟来实现。在与OLED屏相配合的情况下,其实现电子时钟功能的效果如图所示。
电子时钟效果
为实现电子时钟功能,需有3部分的内容:
1)头文件及相关定义
所涉及的头文件如下:
#include<time.h>
#include<sys/time.h>
所涉及的定义为:
#define RTC_TASK_PRIO (10U)
#define RTC_TASK_SIZE (2048U)
2)功能处理函数
所涉及的初始化函数为:
voidRtc_TimeInit(void)
{
portBASE_TYPE xReturn = pdPASS;
structtimeval tv =
{
// 默认时间:2022年08月21日 14:58:05
.tv_sec = 1661065085,
.tv_usec = 0
};
// 初始化时间
settimeofday(&tv, NULL);
xReturn = xTaskCreatePinnedToCore(&Rtc_TaskPrint,
"Time_print_task",
RTC_TASK_SIZE,
NULL,
RTC_TASK_PRIO,
Rtc_TaskHandle,
CONFIG_ESP_MAIN_TASK_AFFINITY);
// 启动任务调度
if(pdPASS != xReturn)
ESP_LOGE(TAG, "Rtc task create failed!");
}
所涉及的RTC显示函数为:
static void Rtc_TaskPrint(void *pvParameters)
{
time_t now;
char strftime_buf[64];
structtmtimeinfo;
while (1)
{
time(&now);
setenv("TZ", "CST-8", 1);
tzset();
localtime_r(&now, &timeinfo);
OLED_ShowNum(24,6,timeinfo.tm_hour,2,16);
OLED_ShowNum(48,6,timeinfo.tm_min,2,16);
OLED_ShowNum(72,6,timeinfo.tm_sec,2,16);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
3)主程序
实现电子时钟功能的主程序为:
voidapp_main(void)
{
configure_Oled();
OLED_Init();
OLED_Clear();
OLED_ShowChar(40,6,':',16);
OLED_ShowChar(64,6,':',16);
OLED_ShowString(0,0,"ESP32-S2-Kaluga",16);
OLED_ShowString(16,2,"OLED & RTC",16);
Rtc_TimeInit();
while(1);
}