鱼C论坛

 找回密码
 立即注册
查看: 596|回复: 3

arduino oled显示

[复制链接]
发表于 2024-3-31 17:57:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
@fishc

arduino oled 超过行数限制,自动换行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[i]) > maxWidth) { // 超过屏幕宽度,换行
      x = 0;
      y += lineHeight;
    }
    u8g2.drawGlyph(x, y, text[i]); // 在指定位置绘制字符
    x += u8g2.getGlyphWidth(text[i]);
  }

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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  调整代码,超过行数 自动换行

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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(¤tChar);

      // 如果当前字符加上当前行的字符宽度小于屏幕宽度,就将字符添加到当前行
      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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 15:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表