如何在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的亮度调节:
- 先卸载默认的
LiquidCrystal_I2C库,然后在Arduino库管理器里搜索安装LiquidCrystal_PCF8574。 - 示例代码:
#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库(适合动手能力强的同学)
如果你坚持要用默认库,也可以自己给它加调光功能:
- 找到
LiquidCrystal_I2C.h文件,在类声明里添加一个函数:
void setBacklightBrightness(uint8_t brightness);
- 打开
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(); } }
- 然后在你的代码里就可以调用
lcd.setBacklightBrightness(128)来设置亮度了。
小提示
- 不确定你的I2C地址?可以用Arduino的I2C扫描程序先扫一下,常见的地址是
0x27或0x3F。 - 如果用软件模拟PWM,低亮度下的闪烁问题可以通过提高PWM频率来缓解,但需要修改定时器配置,相对复杂。
内容的提问来源于stack exchange,提问作者Xasevu
相关产品推荐
相关产品推荐

