#include "RtcDS1307.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include "Button.h"
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
#define DHTPIN 5 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
RtcDS1307<TwoWire> Rtc(Wire);
Button hourButton(A0);
Button minuteButton(A1);
Button alarmButton(A2);
unsigned long timee;
bool flag_zhayan = false;
void setup() {
Serial.begin(9600);
pinMode(7, OUTPUT);
dht.begin();
Rtc.Begin();
Rtc.SetIsRunning(true);
hourButton.begin();
hourButton.set_repeat(500, 200);
minuteButton.begin();
minuteButton.set_repeat(500, 200);
alarmButton.begin();
alarmButton.set_repeat(500, 200);
lcd.init();
lcd.backlight();
lcd.setCursor(3, 0);
lcd.print("Hello, world!");
lcd.setCursor(2, 1);
lcd.print("Wokwi Online IoT");
delay(1000);
lcd.clear();
Rtc.SetDateTime(RtcDateTime("Jan/01/2023", "08:00:00"));
}
char flag_H = 0;
char flag_N_H = 0;
char flag_M = 0;
bool flag_H_zy = false;
int H_num = 0, M_num = 0;
int Nh = 0, Nm = 0;
bool flag_N_E = false;
bool flag_ZD_E = false;
bool flag_ZD_T = false;
bool flag_FS_E = false;
char flag_FS = 0;
int UP_T = 0, DW_T = 0;
void loop() {
if (hourButton.pressed()) {
lcd.clear();
if (flag_FS == 1) {
UP_T++;
} else if (flag_FS == 2) {
DW_T++;
} else if (flag_FS == 3) {
flag_FS_E = true;
} else {
if (flag_N_E) {
digitalWrite(7, LOW);
flag_N_E = false;
} else {
if (flag_M == 1) {
flag_N_H++;
if (flag_N_H >= 3) {
flag_N_H = 0;
flag_N_E = true;
}
} else {
flag_H++;
if (flag_H >= 3) flag_H = 0;
}
}
}
}
if (minuteButton.pressed()) {
lcd.clear();
if (flag_FS == 1) {
UP_T--;
} else if (flag_FS == 2) {
DW_T--;
} else if (flag_FS == 3) {
flag_FS_E = false;
} else {
if (flag_N_H == 1) {
Nh++;
if (Nh >= 24) Nh = 0;
} else if (flag_N_H == 2) {
Nm++;
if (Nm >= 60) Nm = 0;
} else {
if (flag_H == 1) {
H_num = Rtc.GetDateTime().Hour() + 1;
if (H_num >= 24) H_num = 0;
Rtc.SetDateTime(RtcDateTime("Jan/01/2023", String(String(H_num) + ":" + String(Rtc.GetDateTime().Minute()) + ":" + "00").c_str()));
} else if (flag_H == 2) {
M_num = Rtc.GetDateTime().Minute() + 1;
if (M_num >= 60) M_num = 0;
Rtc.SetDateTime(RtcDateTime("Jan/01/2023", String(String(Rtc.GetDateTime().Hour()) + ":" + String(M_num) + ":" + "00").c_str()));
} else {
lcd.clear();
flag_M++;
if (flag_M >= 2) {
flag_M = 0;
flag_N_H = 0;
}
}
}
}
}
if (alarmButton.pressed()) {
lcd.clear();
if (flag_ZD_T) {
digitalWrite(7, LOW);
flag_ZD_T = false;
} else {
flag_FS++;
if (flag_FS >= 4) flag_FS = 0;
}
}
float h = dht.readHumidity();
float t = dht.readTemperature();
if (flag_FS == 1) {
lcd.setCursor(0, 0);
lcd.print("UP TEMP:" + String(UP_T));
} else if (flag_FS == 2) {
lcd.setCursor(0, 0);
lcd.print("DW TEMP:" + String(DW_T));
} else if (flag_FS == 3) {
lcd.setCursor(0, 0);
if (flag_FS_E) {
lcd.print("fan on");
//电机使能
} else {
lcd.print("fan off");
//电机使能
}
} else {
if (flag_M == 1) {
lcd.setCursor(0, 0);
if (flag_N_H == 1) {
if (flag_H_zy) {
lcd.print(" ");
} else {
if (Nh / 10)lcd.print(String(Nh));
else lcd.print("0" + String(Nh));
}
} else {
if (Nh / 10)lcd.print(String(Nh));
else lcd.print("0" + String(Nh));
}
if (flag_zhayan)lcd.print(String(":"));
else lcd.print(String(" "));
if (flag_N_H == 2) {
if (flag_H_zy) {
lcd.print(" ");
} else {
if (Nm / 10)lcd.print(String(Nm));
else lcd.print("0" + String(Nm));
}
} else {
if (Nm / 10)lcd.print(String(Nm));
else lcd.print("0" + String(Nm));
}
lcd.setCursor(6, 0);
lcd.print("*");
} else {
lcd.setCursor(0, 0);
if (flag_H == 1) {
if (flag_H_zy) {
lcd.print(" ");
} else {
if (Rtc.GetDateTime().Hour() / 10)lcd.print(String(Rtc.GetDateTime().Hour()));
else lcd.print("0" + String(Rtc.GetDateTime().Hour()));
}
} else {
if (Rtc.GetDateTime().Hour() / 10)lcd.print(String(Rtc.GetDateTime().Hour()));
else lcd.print("0" + String(Rtc.GetDateTime().Hour()));
}
if (flag_zhayan)lcd.print(String(":"));
else lcd.print(String(" "));
if (flag_H == 2) {
if (flag_H_zy) {
lcd.print(" ");
} else {
if (Rtc.GetDateTime().Minute() / 10)lcd.print(String(Rtc.GetDateTime().Minute()));
else lcd.print("0" + String(Rtc.GetDateTime().Minute()));
}
} else {
if (Rtc.GetDateTime().Minute() / 10)lcd.print(String(Rtc.GetDateTime().Minute()));
else lcd.print("0" + String(Rtc.GetDateTime().Minute()));
}
if (Nh <= Rtc.GetDateTime().Hour() && Nm <= Rtc.GetDateTime().Minute()) {
if (flag_N_E) {
if (flag_H_zy) {
digitalWrite(7, HIGH);
} else {
digitalWrite(7, LOW);
}
}
}
lcd.setCursor(0, 1);
lcd.print("H:");
lcd.print(h);
lcd.print(" T:");
lcd.print(t);
}
}
if (Rtc.GetDateTime().Minute() == 0) {
if (8 <= Rtc.GetDateTime().Hour() && 20 >= Rtc.GetDateTime().Hour()) {
flag_ZD_E = true;
}
}
if (flag_ZD_E) {
flag_ZD_T = true;
if (flag_ZD_T) {
if (flag_zhayan) {
digitalWrite(7, HIGH);
} else {
digitalWrite(7, LOW);
}
}
}
if (millis() - timee > 500) {
timee = millis();
flag_H_zy = !flag_H_zy;
if (flag_H_zy)flag_zhayan = !flag_zhayan;
}
}