// // IIC oled
// #include <SPI.h>
// #include <Wire.h>
// #include <Adafruit_GFX.h>
// #include <Adafruit_SSD1306.h>
// //屏幕分辨率
// #define SCREEN_WIDTH 128 // OLED display width, in pixels
// #define SCREEN_HEIGHT 64 // OLED display height, in pixels
// #define I2C_ADDRESS 0x3C
// // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// #define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
// // 构造类函数 IIC版本
// Adafruit_SSD1306 oled1(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// // U8g2 pled
#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
// 构造类函数 U8g2版本
// U8G2_SSD1306_128X64_NONAME_2_HW_I2C u8g2(U8G2_R0, /* clock=*/ 9, /* data=*/ 8, /* reset=*/ U8X8_PIN_NONE);
U8G2_SSD1306_128X64_NONAME_2_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
// U8X8_SSD1306_128X64_NONAME_HW_I2C u8g2(U8X8_PIN_NONE);
#define MENU_SIZE 4
char *menu[MENU_SIZE] = {"Item 1", "Item 2", "Item 3", "Item 4"};
#define BUTTON_UP 1
#define BUTTON_DOWN 2
// 定义当前选项
unsigned int order = 0;
// 初始化进度条变量
int progress = 0;
uint8_t m = 50;
void execClock(void) {
char m_str[3];
strcpy(m_str, u8x8_u8toa(m, 2));
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_logisoso62_tn);
u8g2.drawStr(0, 63, "9");
u8g2.drawStr(33, 63, ":");
u8g2.drawStr(50, 63, m_str);
} while ( u8g2.nextPage() );
delay(1000);
if ( m++ == 60 ) m = 0;
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, ESP32-S3!");
//setIicOled();
//setU8g2Oled();
setU8g2OledMenu();
}
void loop()
{
//execIicOled();
//execU8g2Oled();
execU8g2OledMenu();
}
// void setIicOled()
// {
// // 第一个步骤 begin启动函数 创建buffer缓存
// // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
// if(!oled1.begin(SSD1306_SWITCHCAPVCC, I2C_ADDRESS)) { // Address 0x3D for 128x64
// Serial.println(F("SSD1306 allocation failed"));
// for(;;); // Don't proceed, loop forever
// }
// delay(100); // Pause for 2 seconds
// oled1.clearDisplay(); // 清除显示
// oled1.drawFastHLine(1, 1, 30, SSD1306_WHITE); // 绘制水平线
// oled1.drawLine(1, 1, 30, 20, SSD1306_WHITE); // 绘制线
// oled1.drawRect(40, 5, 20, 20, SSD1306_WHITE); // 绘制矩形
// oled1.fillRect(75, 2, 15, 20, SSD1306_WHITE); // 绘制实心矩形
// oled1.setCursor(0, 30); // 设置光标位置
// oled1.setTextSize(1); // 设置字体大小
// oled1.setTextColor(WHITE); // 设置文本颜色
// oled1.println("Hello world."); // 显示文字
// // 显示内容 默认显示 Adafruit 启动页面
// oled1.display();
// }
// void execIicOled() {
// // 清空屏幕
// //oled1.clearDisplay();
// // 设置光标位置
// oled1.setCursor(40, 40);
// // 显示文字
// oled1.println("Process");
// // 显示进度条边框
// oled1.drawRoundRect(0, 50, 128, 10, 3, SSD1306_WHITE);
// // 显示进度
// oled1.fillRoundRect(2, 52, progress, 6, 2, SSD1306_WHITE);
// // 进度递增
// if (progress < 128)
// {
// progress++;
// }
// else
// {
// progress = 0;
// }
// // 刷新屏幕
// oled1.display();
// delay(50); // 延迟一段时间后更新显示
// }
void setU8g2Oled()
{
// 初始化 oled 对象
u8g2.begin();
// 开启中文字符集支持
u8g2.enableUTF8Print();
}
void execU8g2Oled()
{
//打印一些文字
// // 设置字体
// u8g2.setFont(u8g2_font_unifont_t_chinese2);
// // 设置字体方向
// u8g2.setFontDirection(0);
// //
// u8g2.clearBuffer();
// u8g2.setCursor(0, 15);
// u8g2.print("Hello GeeksMan!");
// u8g2.setCursor(0, 40);
// u8g2.print("你好, ESP32!");
// u8g2.sendBuffer();
// delay(1000);
//分页模式实现进度条效果
// 进入第一页
u8g2.firstPage();
do
{
// 显示进度条边框
u8g2.drawFrame(0, 10, 128, 20);
// 显示进度
u8g2.drawBox(5, 15, progress, 10);
} while (u8g2.nextPage()); // 进入下一页,如果还有下一页则返回true
// 进度递增
if (progress < 118)
{
progress++;
}
else
{
progress = 0;
}
}
void setU8g2OledMenu()
{
// 初始化 OLED 对象
u8g2.begin();
u8g2.setFont(u8g2_font_6x12_tr);
// 配置输入按键
pinMode(BUTTON_UP, INPUT_PULLDOWN);
pinMode(BUTTON_DOWN, INPUT_PULLDOWN);
}
void execU8g2OledMenu()
{
// 判断按键是否按下,并记录当前箭头位置
if (digitalRead(BUTTON_UP))
{
Serial.println("u");
order = (order - 1) % 4;
}
else if (digitalRead(BUTTON_DOWN))
{
Serial.println("d");
order = (order + 1) % 4;
}
// 显示菜单
// 进入第一页
u8g2.firstPage();
do
{
// 绘制页面内容
u8g2.drawStr(0, 12, "Menu");
u8g2.drawHLine(0, 14, 128);
for (int i = 0; i < MENU_SIZE; i++)
{
if (i == order)
{
u8g2.drawStr(5, (i + 2) * 12 + 2, ">");
u8g2.drawStr(20, (i + 2) * 12 + 2, menu[i]);
}
else
{
u8g2.drawStr(5, (i + 2) * 12 + 2, menu[i]);
}
}
} while (u8g2.nextPage()); // 进入下一页,如果还有下一页则返回 True.
// 延时
delay(100);
}