yc0526vip 发表于 2024-1-10 17:27:38

Arduino oled显示

@fishc
Arduino oled显示"你好"

FishC 发表于 2024-1-10 17:27:54

要在Arduino上使用oled显示屏显示文本,你首先需要连接oled显示屏到Arduino。

oled显示屏通常通过I2C通信协议进行连接。在Arduino上,有两个引脚(A4和A5)专门用于I2C通信。你需要将oled屏幕的SDA引脚连接到A4引脚,SCL引脚连接到A5引脚。

接下来,你需要安装支持oled显示屏的库。在Arduino IDE中,点击“工具”->“管理库”,然后在搜索栏中输入“SSD1306”,找到适合你的oled型号的库并安装。

一旦库安装完成,你可以尝试下面的代码:

#include <Wire.h>//引入I2C通信库
#include <Adafruit_GFX.h> //引入oled显示库
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4// OLED重置引脚,默认为4
Adafruit_SSD1306 display(OLED_RESET);// 创建SSD1306对象

void setup() {
// 初始化I2C通信
Wire.begin();
// 启动oled显示屏
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);// 0x3C是oled显示屏的地址(可以根据你的显示屏型号进行修改)
// 清空显示屏
display.clearDisplay();
}

void loop() {
// 设置字体大小
display.setTextSize(1);
// 设置文本颜色(白色)
display.setTextColor(WHITE);
// 显示文本
display.setCursor(0, 0);
display.println("你好");
// 更新显示
display.display();
delay(1000);// 延迟1秒,然后再次显示"你好"
}

当你上传这段代码到Arduino后,你的oled显示屏上将会显示"你好"。每隔1秒钟,"你好"都会重新显示一次。

希望这能帮到你!如果有任何问题,请随时提问。

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

yc0526vip 发表于 2024-1-10 17:43:42

FishC 发表于 2024-1-10 17:27
要在Arduino上使用oled显示屏显示文本,你首先需要连接oled显示屏到Arduino。

oled显示屏通常通过I2C通 ...

中文乱码

FishC 发表于 2024-1-10 17:43:56

yc0526vip 发表于 2024-01-10 17:43
中文乱码

如果在OLED显示屏上显示中文出现乱码,可能是因为默认的字体库不支持中文字符。为了解决这个问题,你可以下载一个支持中文字符的字体库并替换原来的字体库。以下是一些步骤:

1. 找到一个支持中文的字体库文件(.ttf或者.bdf格式)。你可以在互联网上搜索“Arduino OLED中文字库”来找到一些可用的字体库文件。

2. 将字体库文件转换成C语言数组。你可以使用一些在线工具或者字体库生成器来完成这个步骤。将生成的C语言数组复制到你的Arduino代码中。

3. 调用新的字体库。在你的代码中,找到设置字体大小和颜色的部分,并添加一行代码来调用新的字体库。例如,使用`display.setFont(字体名)`来设置新的字体。

下面是一个示例代码,演示了如何使用新的支持中文字符的字体库:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

// 替换为你的中文字库数组
const uint8_t ChineseFont[] PROGMEM = {
// 中文字符的C语言数组
};

void setup() {
Wire.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();

// 设置新的字体库
display.setFont(ChineseFont);

display.setTextSize(1);
display.setTextColor(WHITE);

display.setCursor(0, 0);
display.println("你好");

display.display();
}

void loop() {

}

记得在`ChineseFont`数组中替换为你自己的中文字库数组。上传这段代码到Arduino后,你的OLED显示屏应该能正确显示中文字符了。

希望这对你有所帮助!如果还有其他问题,请随时提问。

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

yc0526vip 发表于 2024-1-10 17:45:41

FishC 发表于 2024-1-10 17:43
如果在OLED显示屏上显示中文出现乱码,可能是因为默认的字体库不支持中文字符。为了解决这个问题,你可 ...

使用u8g2 实现显示中文

FishC 发表于 2024-1-10 17:46:43

yc0526vip 发表于 2024-01-10 17:45
使用u8g2 实现显示中文

使用U8g2库可以实现在Arduino上显示中文。首先,你需要确保已经安装了U8g2库。在Arduino IDE中,点击“工具”->“管理库”,然后搜索“U8g2”,找到适合你的OLED型号的库并安装。

下面是一个示例代码,演示了如何使用U8g2库显示中文:

#include <U8g2lib.h>
#include <Wire.h>

U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup() {
// 初始化I2C通信
Wire.begin();
// 启动OLED显示屏
u8g2.begin();
}

void loop() {
u8g2.clearBuffer();// 清空显示缓冲区

// 设置字体大小和样式
u8g2.setFont(u8g2_font_wqy12_t_gb2312);// 使用内置的中文字体

// 显示中文
u8g2.setCursor(0, 30);
u8g2.print("你好,世界!");

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

delay(1000);// 延迟1秒钟
}

在这个示例代码中,我们使用了U8g2库的SSD1306_128X64_NONAME_1_HW_I2C驱动,并使用了内置的中文字体u8g2_font_wqy12_t_gb2312。你可以根据自己的OLED型号来选择合适的驱动和字体。

上传这段代码到Arduino后,你的OLED显示屏将会显示中文字符"你好,世界!"。

希望这对你有所帮助!如果还有其他问题,请随时提问。

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

yc0526vip 发表于 2024-1-10 18:00:19

FishC 发表于 2024-1-10 17:46
使用U8g2库可以实现在Arduino上显示中文。首先,你需要确保已经安装了U8g2库。在Arduino IDE中,点击“ ...

调整代码,将代码改成"你好"世界",循环显示

//by lingshunlab.com

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>

// 定义u8g2实例
// 选择正确的屏幕芯片SH1106,分辨率128X64,接线方式I2C
U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup() {
u8g2.begin(); // 初始化u8g2
u8g2.enableUTF8Print();// 启动UTF8,需要显示中文,必须要开启
}

void loop() {
// 定义字体,该u8g2_font_unifont_t_chinese2字库只支持一些常见的中文
u8g2.setFont(u8g2_font_unifont_t_chinese2);
u8g2.setFontDirection(0);
u8g2.firstPage();
do { // 显示的内容
    u8g2.setCursor(18, 20);
    u8g2.print("Hello World!!");
    u8g2.setCursor(28, 45);
    u8g2.print("你好,世界!");    // Chinese "Hello World"
} while ( u8g2.nextPage() );
delay(1000);
}

FishC 发表于 2024-1-10 18:00:34

yc0526vip 发表于 2024-01-10 18:00
调整代码,将代码改成"你好"世界",循环显示

//b ...

以下是已经调整过的代码:

++
#include <Wire.h>
#include <U8g2lib.h>

// 定义u8g2实例
// 选择正确的屏幕芯片SH1106,分辨率128X64,接线方式I2C
U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup() {
u8g2.begin(); // 初始化u8g2
u8g2.enableUTF8Print(); // 启动UTF8,需要显示中文,必须要开启
}

void loop() {
// 定义字体,该u8g2_font_wqy12_t_gb2312字库只支持一些常见的中文
u8g2.setFont(u8g2_font_wqy12_t_gb2312);
u8g2.setFontDirection(0);

u8g2.firstPage();
do {
    // 显示的内容
    u8g2.setCursor(18, 20);
    u8g2.print("你好");
    u8g2.setCursor(24, 45);
    u8g2.print("世界!");
} while ( u8g2.nextPage() );

delay(1000);
}

此代码将在OLED显示屏上循环显示"你好世界!"。确保正确连接并选择了适合你的屏幕驱动和字库。上传代码后,OLED显示屏将显示"你好世界!"并每秒刷新一次。希望可以帮助到你!如有其他问题,请随时提问。

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

yc0526vip 发表于 2024-1-10 18:07:20

FishC 发表于 2024-1-10 18:00
以下是已经调整过的代码:




让你好 世界 闪烁

FishC 发表于 2024-1-10 18:07:34

yc0526vip 发表于 2024-01-10 18:07
让你好 世界 闪烁

要让"你好 世界"闪烁,你可以在代码中添加一个变量来控制显示的开关状态。下面是已经修改的代码:
#include <U8g2lib.h>
#include <Wire.h>

U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

bool displayOn = true;

void setup() {
u8g2.begin(); // 初始化u8g2
u8g2.enableUTF8Print(); // 启用UTF8打印
}

void loop() {
u8g2.setFont(u8g2_font_wqy12_t_gb2312); // 设置字体,该字库只支持一些常见的中文字符
u8g2.setFontDirection(0);

u8g2.firstPage();
do {
    u8g2.setCursor(18, 20);
    if (displayOn) {
      u8g2.print("你好");
    } else {
      u8g2.print("    "); // 空格来覆盖之前的文字
    }
    u8g2.setCursor(24, 45);
    if (displayOn) {
      u8g2.print("世界!");
    } else {
      u8g2.print("      "); // 空格来覆盖之前的文字
    }
} while (u8g2.nextPage());

delay(500); // 延迟500毫秒

displayOn = !displayOn; // 切换显示开关状态
}
这段代码会使 "你好" 和 "世界!" 在显示屏上闪烁。每500毫秒,显示的文本会切换一次。希望这对你有所帮助!如果还有其他问题,请随时提问。

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

yc0526vip 发表于 2024-1-10 18:11:33

FishC 发表于 2024-1-10 18:07
要让"你好 世界"闪烁,你可以在代码中添加一个变量来控制显示的开关状态。下面是已经修改的代码:

...

调整代码,你好 世界 不同频率闪烁

FishC 发表于 2024-1-10 18:11:49

yc0526vip 发表于 2024-01-10 18:11
调整代码,你好 世界 不同频率闪烁

要使"你好"和"世界"以不同的频率闪烁,你可以为每个文本使用不同的闪烁频率。下面是已经调整的代码:#include #include U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);bool displayOn1 = true;// 控制"你好"的显示开关状态bool displayOn2 = true;// 控制"世界"的显示开关状态unsigned long previousMillis1 = 0;// 用于计算时间间隔unsigned long previousMillis2 = 0;void setup() {u8g2.begin(); // 初始化u8g2u8g2.enableUTF8Print(); // 启用UTF8打印}void loop() {unsigned long currentMillis = millis();if (currentMillis - previousMillis1 >= 1000) {    previousMillis1 = currentMillis;    displayOn1 = !displayOn1; // 切换"你好"的显示开关状态}if (currentMillis - previousMillis2 >= 500) {    previousMillis2 = currentMillis;    displayOn2 = !displayOn2; // 切换"世界"的显示开关状态}u8g2.setFont(u8g2_font_wqy12_t_gb2312);u8g2.setFontDirection(0);u8g2.firstPage();do {    u8g2.setCursor(18, 20);    if (displayOn1) {      u8g2.print("你好");    } else {      u8g2.print("    "); // 空格来覆盖之前的文字    }    u8g2.setCursor(24, 45);    if (displayOn2) {      u8g2.print("世界!");    } else {      u8g2.print("      "); // 空格来覆盖之前的文字    }} while (u8g2.nextPage());}在这个修改后的代码中,"你好"每隔1秒闪烁一次,"世界"每隔0.5秒闪烁一次。希望这样满足了你的需求!如果还有其他问题,请随时提问。

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

yc0526vip 发表于 2024-1-10 18:16:44

FishC 发表于 2024-1-10 18:11
要使"你好"和"世界"以不同的频率闪烁,你可以为每个文本使用不同的闪烁频率。下面是已经调整的代码:#i ...

排版错误,重新输出

FishC 发表于 2024-1-10 18:16:57

yc0526vip 发表于 2024-01-10 18:16
排版错误,重新输出

非常抱歉排版错误,下面是重新调整过的代码:
#include <U8g2lib.h>
#include <Wire.h>

U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

bool displayOn1 = true;// 控制"你好"的显示开关状态
bool displayOn2 = true;// 控制"世界"的显示开关状态
unsigned long previousMillis1 = 0;// 用于计算时间间隔
unsigned long previousMillis2 = 0;

void setup() {
u8g2.begin(); // 初始化u8g2
u8g2.enableUTF8Print(); // 启用UTF8打印
}

void loop() {
unsigned long currentMillis = millis();

if (currentMillis - previousMillis1 >= 1000) {
    previousMillis1 = currentMillis;
    displayOn1 = !displayOn1; // 切换"你好"的显示开关状态
}

if (currentMillis - previousMillis2 >= 500) {
    previousMillis2 = currentMillis;
    displayOn2 = !displayOn2; // 切换"世界"的显示开关状态
}

u8g2.setFont(u8g2_font_wqy12_t_gb2312);
u8g2.setFontDirection(0);

u8g2.firstPage();
do {
    u8g2.setCursor(18, 20);
    if (displayOn1) {
      u8g2.print("你好");
    } else {
      u8g2.print("    "); // 空格来覆盖之前的文字
    }
   
    u8g2.setCursor(24, 45);
    if (displayOn2) {
      u8g2.print("世界!");
    } else {
      u8g2.print("      "); // 空格来覆盖之前的文字
    }
} while (u8g2.nextPage());
}
现在你可以上传这段代码到Arduino,屏幕上会显示"你好"和"世界",并且它们以不同的频率闪烁。每隔1秒钟,"你好"会闪烁一次,而"世界"则每隔0.5秒闪烁一次。希望这次的输出没有排版错误!如果还有其他问题,请随时提问。

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

yc0526vip 发表于 2024-1-10 18:19:46

FishC 发表于 2024-1-10 18:16
非常抱歉排版错误,下面是重新调整过的代码:

现在你可以上传这段代码到Arduino,屏幕上会显示"你好 ...

调整代码 随机位置,随机时间

FishC 发表于 2024-1-10 18:19:56

yc0526vip 发表于 2024-01-10 18:19
调整代码 随机位置,随机时间

好的,你想要在随机位置和随机时间显示文本。下面是调整过的代码实现这个功能:

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>

Adafruit_SSD1306 display(128, 64, &Wire, -1);

int pos_x = 0;// 文本的X坐标位置
int pos_y = 0;// 文本的Y坐标位置
unsigned long previousMillis = 0;// 上一次文本更新的时间
unsigned long interval = 0;// 更新文本的时间间隔

void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
}

void loop() {
unsigned long currentMillis = millis();

if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    interval = random(500, 2000);// 随机生成更新时间间隔(500ms到2000ms之间)

    pos_x = random(0, display.width() - 16);// 随机生成X坐标位置
    pos_y = random(0, display.height() - 8);// 随机生成Y坐标位置

    display.clearDisplay();// 清空屏幕
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(pos_x, pos_y);
    display.println("你好");

    display.display();
}
}

在这段代码中,我们使用了`random()`函数来生成随机的位置和时间间隔。在每次更新文本之前,我们会重新生成随机的X坐标、Y坐标和时间间隔。然后,我们使用`display.setCursor()`函数将文本放置到随机位置,并使用`display.print()`函数打印文本。

你可以上传这段代码到Arduino,并观察屏幕上的效果。每隔一段随机的时间,屏幕上会出现一个随机位置的"你好"文本。希望这次的代码符合你的需求!如果还有其他问题,请随时提问。

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

yc0526vip 发表于 2024-1-10 18:38:52

FishC 发表于 2024-1-10 18:19
好的,你想要在随机位置和随机时间显示文本。下面是调整过的代码实现这个功能:




调整代码 "你好 哈哈 世界" 随机出现在别的地方

yc0526vip 发表于 2024-1-10 18:39:08

yc0526vip 发表于 2024-1-10 18:38
调整代码 "你好 哈哈 世界" 随机出现在别的地方

调整代码 "你好 哈哈 世界" 随机出现在别的地方

#include <U8g2lib.h>
#include <Wire.h>

U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

bool displayOn1 = true;// 控制"你好"的显示开关状态
bool displayOn2 = true;// 控制"世界"的显示开关状态
bool displayOn3 = true;// 控制"世界"的显示开关状态
unsigned long previousMillis1 = 0;// 用于计算时间间隔
unsigned long previousMillis2 = 0;
unsigned long previousMillis3 = 0;// 用于计算时间间隔

void setup() {
u8g2.begin(); // 初始化u8g2
u8g2.enableUTF8Print(); // 启用UTF8打印
}

void loop() {
unsigned long currentMillis = millis();

if (currentMillis - previousMillis1 >= 1000) {
    previousMillis1 = currentMillis;
    displayOn1 = !displayOn1; // 切换"你好"的显示开关状态
}

if (currentMillis - previousMillis2 >= 500) {
    previousMillis2 = currentMillis;
    displayOn2 = !displayOn2; // 切换"世界"的显示开关状态
}

if (currentMillis - previousMillis2 >= 100) {
    previousMillis2 = currentMillis;
    displayOn3 = !displayOn3; // 切换"哈哈"的显示开关状态
}

u8g2.setFont(u8g2_font_wqy12_t_gb2312);
u8g2.setFontDirection(0);

u8g2.firstPage();
do {
    u8g2.setCursor(18, 20);
    if (displayOn1) {
      u8g2.print("你好");
    } else {
      u8g2.print("    "); // 空格来覆盖之前的文字
    }
   
    u8g2.setCursor(24, 45);
    if (displayOn2) {
      u8g2.print("世界!");
    } else {
      u8g2.print("      "); // 空格来覆盖之前的文字
    }

    u8g2.setCursor(32, 32);
    if (displayOn3) {
      u8g2.print("哈哈!");
    } else {
      u8g2.print("      "); // 空格来覆盖之前的文字
    }
} while (u8g2.nextPage());
}

FishC 发表于 2024-1-10 18:40:08

yc0526vip 发表于 2024-01-10 18:38
调整代码 "你好 哈哈 世界" 随机出现在别的地方

好的,我来为你调整代码,使得文本"你好 哈哈 世界"能随机出现在屏幕的任意位置。下面是更新后的代码:

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

int textPosX = 0;
int textPosY = 0;

void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
}

void loop() {
display.clearDisplay();

// 随机生成文本的位置
textPosX = random(0, SCREEN_WIDTH - 16);
textPosY = random(0, SCREEN_HEIGHT - 8);

// 设置文本样式
display.setTextSize(1);
display.setTextColor(WHITE);

// 在随机位置显示文本
display.setCursor(textPosX, textPosY);
display.print("你好 哈哈 世界");

display.display();
delay(2000);
}

通过随机生成文本的X和Y坐标位置,文本将会出现在屏幕的任意位置。你可以尝试将这段代码上传到Arduino并观察屏幕上文本的随机位置变化。每2秒钟,文本会重新随机出现在屏幕的另一个位置。

希望这次的调整能满足你的需求!如果还有其他问题,请随时提问。

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

yc0526vip 发表于 2024-1-10 18:46:50

FishC 发表于 2024-1-10 18:40
好的,我来为你调整代码,使得文本"你好 哈哈 世界"能随机出现在屏幕的任意位置。下面是更新后的代码: ...

调整代码"你好 哈哈 世界"随机出现在别的地方
页: [1] 2
查看完整版本: Arduino oled显示