/* Hello Wokwi! */
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
int ledPin = 13; // LED connected to digital pin 13
int arr[6];
int clock[6];
int hour = 0, minute = 0, second = 0;
long temp = 1000;
int flag = 0;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600); //以9600的速率初始化串口
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
for(int j = 0; j < 3; j++){arr[j] = -1; clock[j] = -1;}
lcd.print("The clock!");
Serial.println("请选择要进行的操作:1修改时间 2闹钟设置(后面要输入修改的时间,eg:12 13 14)");
while(Serial.read()>= 0){} //读入字符
pinMode(ledPin, OUTPUT);
}
void add(){
second++;
while(second > 59 || minute > 59 || hour > 23){
if(second > 59){
second -= 60;
minute++;
}
if(minute > 59){
minute -= 60;
hour++;
}
if(hour > 23){
hour -= 24;
}
}
}
void printtime(){
lcd.setCursor(3,1);
lcd.print(hour);
lcd.setCursor(5,1);
lcd.print(":");
lcd.setCursor(7,1);
lcd.print(minute);
lcd.setCursor(9,1);
lcd.print(":");
lcd.setCursor(11, 1);
lcd.print(second);
if(second < 10)
{
lcd.setCursor(12,1);
lcd.print(" ");
}
if(minute < 10)
{
lcd.setCursor(8,1);
lcd.print(" ");
}
if(hour < 10)
{
lcd.setCursor(4,1);
lcd.print(" ");
}
}
bool high(int arr[])
{
if(arr[0] == hour && arr[1] == minute && arr[2] == second)
{
return true;
}
return false;
}
bool low(int arr[])
{
if(arr[0] == hour && arr[1] == minute && arr[2] == second - 5)
{
return true;
}
return false;
}
bool valid(int arr[])
{
if(arr[0] < 24 && arr[1] < 60 && arr[2] < 60 &&
arr[0] > -1 && arr[1] > -1 && arr[2] > -1)
{
return true;
}
return false;
}
void loop()
{
if(Serial.available()>0)
{
delay(1000);
flag = Serial.parseInt();
Serial.print("flag = ");
Serial.println(flag);
}
if(flag == 1)
{
int i = 0;
while(Serial.available()>0)
{
delay(1000);
arr[i++] = Serial.parseInt();
}
if(valid(arr))
{
Serial.println("修改成功");
flag = 0;
hour = arr[0];
minute = arr[1];
second = arr[2];
for(int j = 0; j < 3; j++){
arr[j] = -1;
}
}
}
else if(flag == 2)
{
int i = 0;
while(Serial.available()>0)
{
delay(1000);
arr[i++] = Serial.parseInt();
}
if(valid(arr))
{
Serial.println("闹钟设置成功!(到时间L灯亮,5s后自动关闭)");
flag = 0;
for(int j = 0; j < 3; j++)
{
clock[j] = arr[j];
arr[j] = -1;
}
}
}
while(Serial.read()>= 0){}
unsigned long nowtime=millis(); //获取当前的系统运行时间长度
if(nowtime > temp){
add();
temp+=1000; //延长时间
}
printtime();
if(high(clock))
{
digitalWrite(ledPin, HIGH);
}
if(low(clock))
{
digitalWrite(ledPin, LOW);
}
}