#include <Wire.h>
#include <RTClib.h>
#include <TM1637TinyDisplay.h>
#include <DHT.h>
// TM1637引脚定义
#define CLK 2
#define DIO 3
uint8_t displayData[4];
// 按键和DHT22引脚定义
#define BUTTON_PIN 4 // 按键连接引脚
#define DHT_PIN 5 // DHT22数据引脚
#define DHT_TYPE DHT22 // DHT传感器类型
// 创建显示对象
TM1637TinyDisplay display(CLK, DIO);
// 创建RTC对象
RTC_DS1307 rtc;
// 创建DHT对象
DHT dht(DHT_PIN, DHT_TYPE);
// 显示状态变量
bool showColon = true;
unsigned long lastBlinkTime = 0;
unsigned long tempDisplayStart = 0;
bool showingTemp = false;
void setup() {
// 初始化数码管
display.begin();
display.setBrightness(7); // 最高亮度
display.clear();
// 初始化RTC
if (!rtc.begin()) {
display.showNumberDec(0, true);
while (1); // 停止程序
}
// 初始化DHT传感器
dht.begin();
// 初始化按键引脚
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
DateTime now = rtc.now(); // 获取当前时间
// 检查按键是否被按下(低电平有效)
if (digitalRead(BUTTON_PIN) == LOW) {
showingTemp = true;
tempDisplayStart = millis();
delay(200); // 简单防抖
displayData[0] = display.encodeDigit(round(dht.readHumidity()) / 10);
displayData[1] = display.encodeDigit(round(dht.readHumidity()) % 10);
displayData[2] = 0b01110110; // 空格
displayData[3] = 0b00000000; // 空
display.setSegments(displayData);
delay(3000);
}
// 如果正在显示温度且超过3秒,则返回时间显示
if (showingTemp && (millis() - tempDisplayStart >= 6000)) {
showingTemp = false;
}
// 冒号闪烁控制(500ms切换) - 仅在显示时间时有效
if (!showingTemp && millis() - lastBlinkTime >= 500) {
lastBlinkTime = millis();
showColon = !showColon;
}
// 准备显示数据
if (showingTemp) {
// 显示温度模式
float temperature = dht.readTemperature();
// 检查温度读数是否有效
if (!isnan(temperature)) {
int tempInt = round(temperature); // 四舍五入取整
// 显示温度值(格式:C 12 或 C-12)
displayData[2] = 0b01100011; // 显示"C"
displayData[3] = 0b00111001; // 显示"°"
// 处理正负温度
if (tempInt < 0) {
displayData[0] = 0b01000000; // 显示"-"
tempInt = abs(tempInt);
displayData[1] = display.encodeDigit(tempInt / 10);
displayData[2] = display.encodeDigit(tempInt % 10);
} else {
displayData[0] = display.encodeDigit(tempInt / 10);
}
} else {
// 温度读取失败显示"Err"
displayData[0] = 0b01111001; // E
displayData[1] = 0b01010000; // r
displayData[2] = 0b01010000; // r
displayData[3] = 0b00000000; // 空格
}
} else {
// HH:MM模式
displayData[0] = display.encodeDigit(now.hour() / 10);
displayData[1] = display.encodeDigit(now.hour() % 10) | (showColon ? 0x80 : 0);
displayData[2] = display.encodeDigit(now.minute() / 10);
displayData[3] = display.encodeDigit(now.minute() % 10);
}
// 更新显示
display.setSegments(displayData);
}