非過熱
#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;
? }
}