You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在I2C连接的Arduino Uno上调节20x4 LCD显示屏背光亮度?

如何给I2C连接的20x4 LCD实现背光调光

用默认的LiquidCrystal_I2C库确实只能开关背光,我之前折腾这个的时候也踩过坑,下面给你几种可行的方法,按需选择:

方法一:硬件改线+直接PWM控制(最稳定的方案)

大多数基于PCF8574芯片的I2C LCD模块,背光LED是由芯片的一个GPIO引脚直接通断控制的——但GPIO只能输出高低电平,没法直接调光。要实现平滑调光,咱们可以把背光控制切换到Arduino的PWM引脚:

  • 拆开LCD模块的外壳,找到背光的控制引脚(一般电路板上会标BL或者看线路连接,通常是PCF8574的第3个引脚,对应二进制0x08)。
  • 断开这个引脚和PCF8574的连接,把它接到Arduino的任意PWM引脚(比如D9,Uno的PWM引脚是D3、D5、D6、D9、D10、D11)。
  • 代码里直接用analogWrite()控制亮度,范围0-255:
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4); // 替换成你的I2C地址
const int backlightPin = 9;

void setup() {
  lcd.init();
  lcd.backlight(); // 这里可以不用管,因为背光已经由PWM引脚控制了
  pinMode(backlightPin, OUTPUT);
  analogWrite(backlightPin, 128); // 初始中等亮度
}

void loop() {
  // 示例:亮度渐变
  static int brightness = 0;
  static int step = 1;
  analogWrite(backlightPin, brightness);
  brightness += step;
  if (brightness <= 0 || brightness >= 255) {
    step *= -1;
  }
  delay(10);
}

这个方案的好处是亮度调节平滑,不会有闪烁,唯一缺点是需要拆模块改线。

方法二:换用支持调光的第三方库(最省心的方案)

如果你不想动硬件,可以试试LiquidCrystal_PCF8574库(和默认的LiquidCrystal_I2C不是同一个),这个库原生支持0-255的亮度调节:

  1. 先卸载默认的LiquidCrystal_I2C库,然后在Arduino库管理器里搜索安装LiquidCrystal_PCF8574。
  2. 示例代码:
#include <LiquidCrystal_PCF8574.h>

LiquidCrystal_PCF8574 lcd(0x27); // 你的I2C地址
void setup() {
  lcd.begin(20, 4); // 初始化20列4行的LCD
  lcd.setBacklight(128); // 设置中等亮度,0是全关,255是最亮
}

void loop() {
  // 可以在这里实现各种亮度动态调节逻辑
  static int brightness = 0;
  static int direction = 1;
  lcd.setBacklight(brightness);
  brightness += direction;
  if (brightness == 0 || brightness == 255) {
    direction *= -1;
  }
  delay(5);
}

这个库的底层是通过软件模拟PWM实现调光,低亮度下可能会有轻微闪烁,但日常使用基本感知不到。

方法三:修改默认的LiquidCrystal_I2C库(适合动手能力强的同学)

如果你坚持要用默认库,也可以自己给它加调光功能:

  1. 找到LiquidCrystal_I2C.h文件,在类声明里添加一个函数:
void setBacklightBrightness(uint8_t brightness);
  1. 打开LiquidCrystal_I2C.cpp文件,实现这个函数(注意背光控制位可能因模块不同而变化,下面假设是第3位,对应0x08):
void LiquidCrystal_I2C::setBacklightBrightness(uint8_t brightness) {
  const uint8_t backlightBit = 0x08; // 对应PCF8574的P3引脚,根据你的模块调整
  static unsigned long lastUpdate = 0;
  if (brightness == 0) {
    _backlight = false;
    send(0, false);
    return;
  }
  if (brightness == 255) {
    _backlight = true;
    send(0, false);
    return;
  }
  // 非阻塞软件模拟PWM
  if (millis() - lastUpdate >= 1) {
    _backlight = (millis() % 255) < brightness;
    send(0, false);
    lastUpdate = millis();
  }
}
  1. 然后在你的代码里就可以调用lcd.setBacklightBrightness(128)来设置亮度了。

小提示

  • 不确定你的I2C地址?可以用Arduino的I2C扫描程序先扫一下,常见的地址是0x27或0x3F。
  • 如果用软件模拟PWM,低亮度下的闪烁问题可以通过提高PWM频率来缓解,但需要修改定时器配置,相对复杂。

内容的提问来源于stack exchange,提问作者Xasevu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:08:41