// Learn about the ESP32 WiFi simulation in
// https://docs.wokwi.com/guides/esp32-wifi

#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);

#define NTP_SERVER     "pool.ntp.org"
#define UTC_OFFSET     0
#define UTC_OFFSET_DST 0

//定义报警时间
//#define ALARM_TIME 8,0,0 //8:00:00
// 定义用于保存警报时间的结构
struct AlarmTime {
  int hour;
  int min;
  int sec;
};

//定义结构的实例以保存警报时间
AlarmTime alarmTime = { 8, 0, 0 };

//定义报警音

#define BUZZER_PIN 23



void spinner() {
  static int8_t counter = 0;
  const char* glyphs = "\xa1\xa5\xdb";
  LCD.setCursor(15, 1);
  LCD.print(glyphs[counter++]);
  if (counter == strlen(glyphs)) {
    counter = 0;
  }
}

void printLocalTime() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    LCD.setCursor(0, 1);
    LCD.println("Connection Err");
    return;
  }

  LCD.setCursor(8, 0);
  LCD.println(&timeinfo, "%H:%M:%S");

  LCD.setCursor(0, 1);
  LCD.println(&timeinfo, "%d/%m/%Y   %Z");
}

void setup() {
  Serial.begin(115200);

  LCD.init();
  LCD.backlight();
  LCD.setCursor(0, 0);
  LCD.print("Connecting to ");
  LCD.setCursor(0, 1);
  LCD.print("WiFi ");

  //初始化报警音
   pinMode(BUZZER_PIN, OUTPUT);

  WiFi.begin("Wokwi-GUEST", "", 6);
  while (WiFi.status() != WL_CONNECTED) {
    delay(250);
    spinner();
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  LCD.clear();
  LCD.setCursor(0, 0);
  LCD.println("Online");
  LCD.setCursor(0, 1);
  LCD.println("Updating time...");

  configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
}


void loop() {
 printLocalTime();
 // 获取当前时间
time_t now = time(nullptr);
struct tm* timeinfo = localtime(&now);

// 检查当前时间是否与报警时间一致
if (timeinfo->tm_hour == alarmTime.hour &&
    timeinfo->tm_min == alarmTime.min &&
    timeinfo->tm_sec == alarmTime.sec) {
  // 触发警报
  tone(BUZZER_PIN, 440, 1000); //播放440赫兹的声音1秒
}

}