/**
   @author bszydxh([email protected])
   @brief 单片机开发演示程序-WiFi进阶 串口输出诗歌以及时间
   @version 0.1
   @date 2023-12-08
*/
// 单次编译时间较长约60s,请耐心等待
#include <Wire.h>
#include <SPI.h>
#include <WiFi.h>
#include <HTTPClient.h>
const char *ntpServer1 = "ntp.ntsc.ac.cn"; // 时间服务器1
const char *ntpServer2 = "cn.ntp.org.cn";  // 时间服务器2
const char *ntpServer3 = "ntp.aliyun.com"; // 时间服务器3
#define UTC_OFFSET 8 * 3600
#define UTC_OFFSET_DST 0
HTTPClient httpClient;
int try_times = 0;

void esp32_Http_hitokoto()
{
  Serial.printf("esp32 -> hitokoto server\n");                               // 打印信息到串口,指示ESP32正在与“一言”服务器通信
  httpClient.begin("https://v1.hitokoto.cn/?encode=text&max_length=10&c=i"); // 使用HTTPClient库开始与“一言”服务器的通信,并指定请求的URL
  httpClient.addHeader("charset", "utf-8");                                  // 添加HTTP头信息,指定字符集为UTF-8
  int httpCode = httpClient.GET();                                           // 发送GET请求,并获取HTTP响应状态码
  if (httpCode == 200)
  {
    const String &payload = httpClient.getString(); // 如果响应状态码为200,获取服务器返回的文本内容
    Serial.printf("hitokoto server -> esp32:\n");   // 打印信息到串口,指示服务器的响应已成功接收
    Serial.println(payload);                        // 打印服务器返回的文本内容到串口
  }
  else
  {
    Serial.printf("hitokoto server /> esp32:\n"); // 打印信息到串口,指示服务器的响应未成功接收
    Serial.println(httpCode);                     // 打印HTTP错误码到串口
  }
  httpClient.end(); // 结束与服务器的通信,释放资源
}

void printLocalTime()
{
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo))
  {
    Serial.println("get time error"); // 如果获取本地时间失败,打印错误信息到串口
    return;
  }
  Serial.println(&timeinfo, "%H:%M:%S"); // 打印本地时间的时、分、秒到串口
  Serial.println(&timeinfo, "%Y/%m/%d"); // 打印本地时间的年、月、日到串口
}

void setup()
{
  Serial.begin(115200); // 初始化串口通信,波特率为115200

  WiFi.begin("Wokwi-GUEST", ""); // 尝试连接到WiFi网络(SSID为"Wokwi-GUEST",密码为空)
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(250); // 等待WiFi连接成功
  }

  Serial.println("");
  Serial.println("WiFi connected"); // 打印信息到串口,指示WiFi连接成功
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP()); // 打印ESP32的本地IP地址到串口

  configTime(UTC_OFFSET, UTC_OFFSET_DST, ntpServer1, ntpServer2, ntpServer3); // 配置本地时间,使用指定的NTP服务器
}

void loop()
{
  try_times++;
  printLocalTime(); // 打印本地时间信息到串口
  delay(250);       // 延时250毫秒
  if (try_times == 5)
  {
    try_times = 0;
    esp32_Http_hitokoto(); // 每5次循环调用一次与“一言”服务器通信的函数
  }
}