非过热
#include <Rtc_Pcf8563.h>
#include <LiquidCrystal.h>
#include "dht11.h"
Rtc_Pcf8563 rtc; // Define an RTC object
dht11 DHT11;
#define DHT11PIN 2 // Define DHT11 module pin
// LCD1602 pins
const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
byte day, weekday, month, century, year; // Date variables
byte hr, minute, sec; // Time variables
char time_str[16]; // Time string
char date_str[16]; // Date string
char strout[8];
char time_out[16];
int key_in = A0; // Analog button pin
int key_v[4] = {0x2D, 0x13, 0x8, 0x00}; // Predefined key values
int flag = 0; // Clock display state
int flag1 = 0xFF; // Initial button state
int key = 0; // Pressed button
int key1 = 0; // Previous button press
String week[7] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
byte Centigrade[8] = { // Custom character for "C" symbol
B10000,
B00110,
B01001,
B01000,
B01000,
B01001,
B00110,
B00000
};
void setup() {
lcd.begin(16, 2); // Initialize the LCD
lcd.createChar(0, Centigrade); // Create custom character for "C"
getClock(); // Read the current time from RTC
}
void loop() {
readKey();
if (key != 0) {
switch (key) {
case 1: Select(); break; // Select key
case 2: Reduce(); break; // Reduce key
case 3: Increase(); break; // Increase key
case 4: Return(); break; // Confirm key
}
key = 0;
}
if (flag == 0)
timeDisplay();
else if (flag == 1)
tempDisplay();
else if (flag == 2)
setDisplay();
}
void getClock() {
rtc.getDateTime();
sec = rtc.getSecond();
minute = rtc.getMinute();
hr = rtc.getHour();
day = rtc.getDay();
month = rtc.getMonth();
year = rtc.getYear();
weekday = rtc.getWeekday();
}
void setDisplay() {
lcd.cursor();
lcd.blink();
if (flag1 != 0xFF) {
switch (flag1) {
case 0:
lcd.setCursor(10, 0);
lcd.print(sec / 10);
lcd.print(sec % 10);
lcd.setCursor(11, 0);
break;
case 1:
lcd.setCursor(7, 0);
lcd.print(minute / 10);
lcd.print(minute % 10);
lcd.setCursor(8, 0);
break;
case 2:
lcd.setCursor(4, 0);
lcd.print(hr / 10);
lcd.print(hr % 10);
lcd.setCursor(5, 0);
break;
case 3:
lcd.setCursor(12, 1);
lcd.print(week[weekday - 1]);
lcd.setCursor(15, 1);
break;
case 4:
lcd.setCursor(8, 1);
lcd.print(day / 10);
lcd.print(day % 10);
lcd.setCursor(9, 1);
break;
case 5:
lcd.setCursor(5, 1);
lcd.print(month / 10);
lcd.print(month % 10);
lcd.setCursor(6, 1);
break;
case 6:
lcd.setCursor(0, 1);
lcd.print("20");
lcd.print(year / 10);
lcd.print(year % 10);
lcd.setCursor(3, 1);
break;
}
}
}
void timeDisplay() {
lcd.noCursor();
lcd.noBlink();
lcd.setCursor(4, 0);
lcd.print(rtc.formatTime());
lcd.setCursor(0, 1);
lcd.print(rtc.formatDate());
lcd.setCursor(12, 1);
lcd.print(week[rtc.getWeekday() - 1]);
}
void tempDisplay() {
DHT11.read(DHT11PIN);
int temperature = DHT11.temperature;
int humidity = DHT11.humidity;
lcd.setCursor(4, 0);
lcd.print("T=");
lcd.print(temperature);
lcd.write(byte(0));
lcd.print("C");
lcd.setCursor(4, 1);
lcd.print("H=");
lcd.print(humidity);
lcd.print("%");
}
void readKey() {
int key_Value = analogRead(key_in) >> 4; // Read the analog button value (high 8 bits)
if (key_Value != 0x3F) { // No button pressed condition
delay(120);
key_Value = analogRead(key_in) >> 4; // Read again to confirm button press
if (key_Value != 0x3F) {
for (int i = 0; i < 4; i++) {
if (key_Value >= key_v[i] - 1 && key_Value <= key_v[i] + 1) {
key = i + 1; // Button value starts from 1
}
}
}
if (key1 != key) // Prevent multiple button presses
key1 = key;
else
key = 0;
}
}
void Select() {
getClock();
rtc.setDateTime(day, weekday, month, 0, year, hr, minute, sec);
if (flag == 1) {
flag = 0;
} else {
flag = 2;
if (flag1 == 0xFF)
flag1 = 0;
else if (flag1 < 6) {
flag1 += 1;
rtc.setDateTime(day, weekday, month, 0, year, hr, minute, sec);
} else {
flag1 = 0;
}
}
}
void Reduce() {
if (flag1 != 0xFF) {
switch (flag1) {
case 0:
if (sec == 0)
sec = 59;
else
sec -= 1;
break;
case 1:
if (minute == 0)
minute = 59;
else
minute -= 1;
break;
case 2:
if (hr == 0)
hr = 23;
else
hr -= 1;
break;
case 3:
if (weekday == 1)
weekday = 7;
else
weekday -= 1;
break;
case 4:
if (day == 1)
day = 31;
else
day -= 1;
break;
case 5:
if (month == 1)
month = 12;
else
month -= 1;
break;
case 6:
if (year == 0)
year = 99;
else
year -= 1;
break;
}
rtc.setDateTime(day, weekday, month, 0, year, hr, minute, sec);
}
}
void Increase() {
if (flag1 != 0xFF) {
switch (flag1) {
case 0:
if (sec == 59)
sec = 0;
else
sec += 1;
break;
case 1:
if (minute == 59)
minute = 0;
else
minute += 1;
break;
case 2:
if (hr == 23)
hr = 0;
else
hr += 1;
break;
case 3:
if (weekday == 7)
weekday = 1;
else
weekday += 1;
break;
case 4:
if (day == 31)
day = 1;
else
day += 1;
break;
case 5:
if (month == 12)
month = 1;
else
month += 1;
break;
case 6:
if (year == 99)
year = 0;
else
year += 1;
break;
}
rtc.setDateTime(day, weekday, month, 0, year, hr, minute, sec);
}
}
void Return() {
if (flag1 != 0xFF) {
rtc.setDateTime(day, weekday, month, 0, year, hr, minute, sec);
flag1 = 0xFF;
flag = 0;
} else {
flag = !flag;
lcd.clear();
flag1 = 0xFF;
}
}