py0526vip 发表于 2024-3-31 17:57:04

arduino oled显示

@fishc

arduino oled 超过行数限制,自动换行

FishC 发表于 2024-3-31 17:57:25

要在Arduino上使用OLED显示屏,并实现自动换行功能,您需要将以下步骤:

1. 安装U8g2库:首先,打开Arduino IDE并选择“工具”->“库管理器”。在搜索框中,输入“U8g2”,然后点击安装该库。

2. 连接OLED显示屏:将OLED显示屏通过I2C接口连接到Arduino板上。确保在正确的引脚上正确地连接VCC、GND、SCL和SDA。

3. 编写代码:

#include <U8g2lib.h>

// U8g2库的屏幕驱动
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup() {
u8g2.begin(); // 初始化u8g2库
u8g2.setFont(u8g2_font_ncenB14_tr); // 设置字体大小,可以根据需要更改
}

void loop() {
u8g2.clearBuffer(); // 清除缓冲区

// 要显示的文本
char text[] = "欢迎来到FishC";

// 设置文本换行
int maxWidth = u8g2.getWidth();
int lineHeight = u8g2.getAscent() - u8g2.getDescent();
int x = 0;
int y = 0;

// 循环遍历文本,进行自动换行
for (int i = 0; i < strlen(text); i++) {
    if (x + u8g2.getGlyphWidth(text) > maxWidth) { // 超过屏幕宽度,换行
      x = 0;
      y += lineHeight;
    }
    u8g2.drawGlyph(x, y, text); // 在指定位置绘制字符
    x += u8g2.getGlyphWidth(text);
}

u8g2.sendBuffer(); // 将缓冲区的内容发送到OLED显示屏
}

此代码使用了U8g2库来驱动OLED显示屏。在setup()函数中,初始化u8g2库并设置字体大小。在loop()函数中,首先清除缓冲区,然后循环遍历文本,根据屏幕宽度进行自动换行,并在指定位置绘制字符。最后,将缓冲区的内容发送到OLED显示屏。

希望这可以帮助到您!如果您还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

py0526vip 发表于 2024-3-31 17:59:39

#include <Arduino.h>
#include <U8g2lib.h>
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2
(U8G2_R0, SCL,SDA,U8X8_PIN_NONE);
void setup() {
Serial.begin(115200);
u8g2.setBusClock(800000);
u8g2.begin();
u8g2.enableUTF8Print();
}
void loop() {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_wqy12_t_chinese3);
u8g2.setCursor(0, 12);
u8g2.print("一二三四五六七八");
u8g2.sendBuffer();
}

@fishc调整代码,超过行数 自动换行

FishC 发表于 2024-3-31 18:01:17

py0526vip 发表于 2024-03-31 17:59
#include
#include
U8G2_SSD1306_128X32_UNIVISIO ...

要实现文本超过行数自动换行的效果,可以使用U8g2库中的`u8g2.setFontMode()`函数来设置字体模式为“裁剪”模式。在“裁剪”模式下,如果文本超出屏幕宽度,将会被截断并且不会显示在屏幕上。

以下是调整后的代码,实现了超过行数自动换行的效果:

#include <U8g2lib.h>
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup() {
Serial.begin(115200);
u8g2.setBusClock(800000);
u8g2.begin();
u8g2.enableUTF8Print();
}

void loop() {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_wqy12_t_chinese3);
u8g2.setFontMode(1); // 设置字体模式为“裁剪”

// 设置文本位置和行高
int x = 0;
int y = 12;
int lineHeight = 13;

// 要显示的文本
String text = "一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十";

// 计算屏幕宽度和文本长度
int screenWidth = u8g2.getDisplayWidth();
int textLength = u8g2.getUTF8Width(text.c_str());

// 检查文本是否超过屏幕宽度
if (textLength > screenWidth) {
    // 当文本长度超过屏幕宽度时,进行换行处理
    String tempText = ""; // 临时存储每行的文本
    int index = 0; // 当前字符索引

    while (index < text.length()) {
      char currentChar = text.charAt(index);
      int currentCharWidth = u8g2.getUTF8Width(&currentChar);

      // 如果当前字符加上当前行的字符宽度小于屏幕宽度,就将字符添加到当前行
      if (u8g2.getUTF8Width((tempText + currentChar).c_str()) <= screenWidth) {
      tempText += currentChar;
      index++;
      }
      // 如果当前字符加上当前行的字符宽度大于屏幕宽度,就换行
      else {
      u8g2.setCursor(x, y);
      u8g2.print(tempText);

      // 重置当前行的文本和坐标
      tempText = "";
      y += lineHeight;
      }
    }

    // 打印最后一行文本
    u8g2.setCursor(x, y);
    u8g2.print(tempText);
} else {
    // 当文本长度小于或等于屏幕宽度时,直接打印
    u8g2.setCursor(x, y);
    u8g2.print(text);
}

u8g2.sendBuffer();
}

这样修改后的代码会根据屏幕的宽度,自动将文本进行换行显示。在此代码中,设置了一个行高`lineHeight`,用于控制每行文本之间的间距。在示例代码中,行高设置为13,可以根据实际需要进行调整。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: arduino oled显示