|
|
ESP32-C3 + DS12C887 + TM1637 桌面时钟系统 (模块化版)
/*
* 项目名称: ESP32-C3 + DS12C887 + TM1637 桌面时钟系统 (模块化版)
* 硬件平台: ESP32-C3
| 文件 | 职责 | 说明 |
|------|------|------|
| ClockProject.ino | 主程序 | `setup()` / `loop()`,编排各模块协作 |
| config.h | 配置层 | 引脚定义、DS12C887 寄存器地址、Wi-Fi/NTP 参数 |
| ds12c887.h | DS12C887 驱动(头) | 函数声明 + `dataBusPins` 数组 |
| ds12c887.cpp | DS12C887 驱动(实现) | `setBusOutput`、`ds_read`、`ds_write`、BCD 转换 |
| tm1637.h | TM1637 驱动(头) | 段码表声明 + 函数声明 + `tm_brightness` extern |
| tm1637.cpp | TM1637 驱动(实现) | `tm_init`、`tm_display_time`、`tm_set_brightness` |
| commands.h | 串口命令(头) | `handleSerialCommand` 声明 |
| commands.cpp | 串口命令(实现) | C/R/B/D/S 五组命令处理逻辑 |
ClockProject.ino
└─ includes → commands.h ──┬→ config.h
├→ ds12c887.h ──→ config.h
└→ tm1637.h ────→ config.h
*/
#include "config.h"
#include "ds12c887.h"
#include "tm1637.h"
#include "commands.h"
// 【修复】在这里定义 serialBuffer,让 ClockProject.ino 也能使用
String serialBuffer;
void setup() {
Serial.begin(115200);
delay(1000);
// 初始化 DS12C887 控制引脚
pinMode(DS_AS, OUTPUT);
pinMode(DS_RD, OUTPUT);
pinMode(DS_WR, OUTPUT);
pinMode(DS_CS, OUTPUT);
digitalWrite(DS_CS, HIGH);
digitalWrite(DS_AS, LOW);
digitalWrite(DS_RD, HIGH);
digitalWrite(DS_WR, HIGH);
// 初始化 TM1637
tm_init();
// 检查 RTC 是否初始化,若未配置则写入默认时间
uint8_t regB = ds_read(REG_B);
if (regB == 0x00 || regB == 0xFF) {
Serial.println("⚠️ RTC not initialized. Setting default time...");
ds_write(REG_YEAR, dec2bcd(26));
ds_write(REG_MON, dec2bcd(8));
ds_write(REG_DATE, dec2bcd(7));
ds_write(REG_HOUR, dec2bcd(12));
ds_write(REG_MIN, dec2bcd(0));
ds_write(REG_SEC, dec2bcd(0));
ds_write(REG_B, 0x06);
}
Serial.println("\n=================================");
Serial.println(" DS12C887 Clock System Ready");
Serial.println("=================================");
Serial.println("C:<ts> | R: | B:<0-7> | D: | S:");
Serial.println("=================================\n");
Syncing_NTP_Time();
}
void loop() {
// 处理串口命令
while (Serial.available()) {
char c = Serial.read();
if (c == '\n' || c == '\r') {
if (serialBuffer.length() > 0) {
handleSerialCommand(serialBuffer);
serialBuffer = "";
}
} else {
serialBuffer += c;
if (serialBuffer == "C:") { Serial.print("\n>> Format: C:<UTC_Timestamp>\n>> Input: C:"); }
}
}
// 读取并显示时间
uint8_t sec = bcd2dec(ds_read(REG_SEC));
uint8_t min = bcd2dec(ds_read(REG_MIN));
uint8_t hour = bcd2dec(ds_read(REG_HOUR));
bool colon = (sec % 2 == 0);
tm_display_time(hour, min, colon);
delay(500);
}
全部源码可编译(Arduino)、烧录到ESP32-C3中,源码详情见附件:
|
评分
-
查看全部评分
|