/**
   @author bszydxh([email protected])
   @brief 单片机开发演示程序-入门 oled显示&led闪烁
   @version 0.1
   @date 2023-12-08
*/
// 单次编译时间较长约60s,请耐心等待~

#include "Arduino.h"
#include "U8g2lib.h"

U8G2_SSD1306_128X64_NONAME_F_HW_I2C
u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE, /* clock=*/16, /* data=*/17); // 定义u8g2

int print_times = 1;
char str_buf[40];

// setup() 函数在程序开始运行时仅执行一次。它用于进行一次性的初始化设置,例如配置引脚、初始化变量或者启动通信端口
void setup() {
  Serial.begin(115200);  // 初始化串口通信,波特率为115200
  Serial.println("ESP32 start!");  // 打印信息到串口,指示ESP32开始运行
  pinMode(23, OUTPUT);  // 将引脚23设置为输出模式,用于连接LED
  u8g2.begin();  // 初始化u8g2库
  u8g2.enableUTF8Print();  // 启用UTF-8打印
  u8g2.clearBuffer();  // 清除u8g2缓冲区
  u8g2.setFont(u8g2_font_10x20_me);  // 设置字体为10x20
  u8g2.setCursor(0, 13);  // 设置光标位置
  u8g2.print("esp start!");  // 在OLED上打印信息
  u8g2.sendBuffer();  // 发送缓冲区的内容到OLED显示
}

// loop() 函数是Arduino程序的主要执行部分。一旦 setup() 函数执行完毕,Arduino将不断地在 loop() 函数中循环执行。
void loop() {
  Serial.printf("Hello, ESP32![%d]\n", print_times++);  // 打印信息到串口,显示ESP32的问候和循环次数
  delay(500);  // 延时500毫秒
  digitalWrite(23, HIGH);  // 将引脚23设置为高电平,点亮LED
  delay(500);  // 延时500毫秒
  digitalWrite(23, LOW);  // 将引脚23设置为低电平,熄灭LED
  sprintf(str_buf, "times:%d", print_times);  // 将循环次数格式化为字符串
  u8g2.clearBuffer();  // 清除u8g2缓冲区
  u8g2.setFont(u8g2_font_10x20_me);  // 设置字体为10x20
  u8g2.setCursor(0, 13);  // 设置光标位置
  u8g2.print(str_buf);  // 在OLED上打印循环次数信息
  u8g2.sendBuffer();  // 发送缓冲区的内容到OLED显示
}