【花雕学编程】Arduino LCD 之显示点阵像素

在这里插入图片描述

Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。

Arduino的特点是:
1、开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
2、易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
3、便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
4、多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。

在这里插入图片描述
Arduino LCD:专业视角下的全面解析
在嵌入式系统开发中,LCD(Liquid Crystal Display)液晶显示屏是实现信息可视化和人机交互的重要组成部分。Arduino 作为广泛应用的开源硬件平台,其对多种类型 LCD 屏幕的良好支持,使得开发者能够快速构建低成本、高可用性的显示系统。

一、主要特点

  1. 接口种类丰富
    字符型 LCD(如 16x2、20x4):使用 HD44780 控制器,常见于基础教学项目;
    图形点阵 LCD(如 128x64 OLED、TFT 彩色屏):支持自由绘图,适合复杂界面;
    通信方式多样:
    并行接口(8位/4位模式)
    I²C 接口(节省引脚资源)
    SPI 接口(高速数据传输)
  2. 低功耗与稳定性强
    多数 LCD 模块(尤其是OLED)具有较低功耗特性,适用于电池供电设备;
    工作电压范围宽(3.3V~5V),兼容性强;
    支持长时间连续运行,稳定性好。
  3. 图形与文本混合显示能力强
    字符型 LCD 可自定义字符(最多8个用户定义字符);
    图形型 LCD 支持绘制线条、矩形、圆形、图像等;
    支持多字体、中文字符(需加载字库)及动态刷新。
  4. 开发资源成熟
    社区提供大量现成库函数,例如:
    LiquidCrystal(用于HD44780字符屏)
    U8g2lib / SSD1306(用于OLED图形屏)
    TFT_eSPI / ILI9341(用于TFT彩色屏)
    支持 Arduino IDE、PlatformIO 等主流开发环境。
  5. 可扩展性与集成度高
    可与其他传感器、执行器、无线模块(如蓝牙、Wi-Fi)协同工作;
    适合作为小型监控终端、状态面板、操作引导界面;
    支持远程控制更新内容(通过串口或网络协议)。

二、典型应用场景

  1. 工业控制系统
    显示PLC状态、温度、压力、液位等实时参数;
    提供本地操作提示与报警信息;
    替代传统按钮+LED指示灯组合,提升操作效率。
  2. 智能家居与物联网
    智能网关设备显示连接状态、传感器数据、Wi-Fi强度;
    家庭气象站展示温湿度、风速、空气质量等;
    智能门锁显示“开锁成功”、“密码错误”等反馈信息。
  3. 教育与实验教学
    编程入门教学中展示变量值、调试信息;
    嵌入式课程讲解GPIO、I²C/SPI通信、中断等核心概念;
    学生创新项目中实现信息反馈与人机交互。
  4. 商业与零售设备
    自助服务终端显示操作指引;
    POS收银机显示商品名称、价格、支付状态;
    智能售货机显示商品介绍与购买提示。
  5. 农业与环境监测
    土壤湿度、光照强度、CO₂浓度等传感器数据显示;
    温室大棚控制器的状态反馈;
    水质检测仪、气象站的数据输出。
  6. 艺术装置与互动展览
    数字艺术展中的文字说明与引导;
    科技馆互动装置的操作提示;
    商场数字标牌系统的静态/动态信息展示。

三、注意事项

  1. 合理选择LCD类型与尺寸
    根据功能需求选择字符型或图形型屏幕;
    小型项目优先考虑 I²C 接口的 OLED 屏幕(如 SSD1306);
    高分辨率或彩色需求则选择 TFT 类屏幕(如 ILI9341)。
  2. 避免频繁全屏刷新
    对图形型屏幕而言,每次全屏重绘会显著增加CPU负载;
    应采用局部刷新策略,仅更新变化部分区域;
    使用双缓冲机制可减少画面闪烁,但需权衡内存占用。
  3. 注意电源管理与背光控制
    OLED 屏幕无需背光,功耗更低;
    LCD 背光亮度应根据环境调整,避免过亮刺眼;
    若为低功耗设计,可在空闲时关闭背光或进入休眠模式。
  4. 字体与图标资源优化
    中文显示需加载字库,可能占用较大Flash空间;
    合理裁剪字库,仅包含常用汉字以节省资源;
    图标建议使用点阵格式并压缩存储。
  5. 兼容性与接口配置
    不同型号的LCD模块可能需要不同的初始化设置;
    注意I²C地址冲突问题(可通过逻辑分析仪或扫描工具排查);
    使用电平转换器确保3.3V模块与5V主控兼容。
  6. 代码结构与维护性
    将LCD相关逻辑封装为独立模块或类,便于复用;
    注释清晰,命名规范,提高后期维护效率;
    提供串口调试接口或OTA升级能力,方便远程修改显示内容。
    在这里插入图片描述
    Arduino LCD 之 显示点阵像素
    在嵌入式图形系统中,使用 Arduino 驱动的 LCD 屏幕 实现 “点阵像素”显示 是掌握基础图形绘制能力的重要一步。相比字符型 LCD 的固定字符库限制,图形化 LCD(如 OLED、TFT)允许开发者直接操作每一个像素点,从而实现自定义图形、动画和复杂界面。

一、主要特点

  1. 逐像素控制
    图形LCD(如SSD1306 OLED、ILI9341 TFT)支持逐像素绘图;
    可通过绘图函数设置任意坐标位置的像素状态(点亮/熄灭);
    支持黑白或彩色模式,取决于屏幕类型。
  2. 图形绘制灵活
    基于点阵像素可构建各种图形元素:
    点、线、矩形、圆、椭圆
    自定义图标、字体、图像
    多数图形库提供封装好的绘图API(如drawPixel()、drawLine()等),简化开发流程。
  3. 资源占用可控
    在低端MCU(如 ATmega328P)上也可运行简单点阵图形;
    使用帧缓冲(Frame Buffer)会占用较多RAM,需根据内存容量优化;
    对于无帧缓存的OLED模块(如SSD1306 I²C模式),采用页模式刷新,节省内存但牺牲部分灵活性。
  4. 支持局部刷新机制
    可仅更新屏幕上发生变化的区域,避免全屏刷新带来的性能损耗;
    对电池供电设备尤为重要,有助于延长续航时间;
    部分TFT控制器(如ILI9341)支持DMA加速提升绘图效率。
  5. 开发工具链成熟
    支持主流图形库:
    Adafruit_GFX + Adafruit_SSD1306 / Adafruit_ILI9341
    U8g2lib(适用于多种OLED/ST7565)
    TFT_eSPI(高性能TFT驱动)
    提供丰富的示例代码,便于快速入门与扩展。

二、典型应用场景

  1. 嵌入式图形界面设计
    实现按钮、进度条、滑块等控件的自定义绘制;
    构建菜单导航、状态面板、设置界面等交互式UI;
    替代传统按键+LED指示灯组合,提升操作效率。
  2. 数据可视化展示
    绘制实时波形图(如心率、温度、电压等传感器信号);
    显示柱状图、饼图、趋势图等统计信息;
    用于工业仪表、实验室仪器、环境监测终端等设备。
  3. 游戏与娱乐设备
    开发小型像素风格游戏(如贪吃蛇、俄罗斯方块);
    实现简单的动画效果(如滚动文字、闪烁星星);
    制作电子宠物、互动玩具等趣味项目。
  4. 教育与实验教学
    编程入门课程中讲解变量、循环、条件判断与图形绘制结合应用;
    嵌入式课程讲解GPIO、I²C/SPI通信协议的实际应用;
    学生创新项目中实现信息反馈与人机交互。
  5. 艺术装置与互动展览
    数字艺术展中的动态图案生成器;
    科技馆互动装置的操作提示与反馈界面;
    商场数字标牌系统的个性化视觉内容展示。

三、注意事项

  1. 合理选择LCD类型与分辨率
    根据功能需求选择合适的屏幕尺寸与分辨率;
    小型项目:128x64 SSD1306 OLED(黑白图形)
    中大型项目:240x240、320x240 ILI9341 TFT(彩色图形)
    注意引脚数量与通信接口是否匹配主控平台(如 Uno/Nano/ESP32)
  2. 注意内存与帧缓冲管理
    若使用帧缓冲(frame buffer),需确保有足够的RAM空间;
    对于资源受限平台,应避免同时加载过多图形数据;
    考虑使用局部刷新策略,减少内存占用和功耗。
  3. 避免频繁全屏刷新
    全屏刷新会导致CPU负载增加并缩短屏幕寿命;
    推荐仅更新变化部分区域,提高系统响应速度;
    对于低频更新场景,可设定刷新间隔(如每秒一次)。
  4. 电源管理与背光控制
    OLED屏幕无需背光,功耗较低;
    LCD背光亮度应根据环境调整,避免过亮刺眼;
    若为低功耗设计,可在空闲时关闭背光或进入休眠模式。
  5. 图形资源优化
    自定义图形建议使用点阵格式,并压缩存储;
    图标、字体尽量复用,减少重复加载;
    使用位图转换工具(如ImageConverter、LCD Assistant)将图片转为数组形式嵌入代码。
  6. 兼容性与接口配置
    不同型号的LCD模块可能需要不同的初始化设置;
    注意I²C地址冲突问题(可通过扫描工具排查);
    使用电平转换器确保3.3V模块与5V主控兼容。
  7. 代码结构与维护性
    将图形相关逻辑封装为独立模块或类,便于复用;
    注释清晰,命名规范,提高后期维护效率;
    提供串口调试接口或OTA升级能力,方便远程修改显示内容。

在这里插入图片描述

1、使用ST7565 LCD显示点阵像素

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

#define LCD_CS 10
#define LCD_RST 9
#define LCD_A0 8

Adafruit_ST7565 display(LCD_CS, LCD_RST, LCD_A0);

void setup() {
  display.begin();
  display.display(); // 显示启动画面
  delay(2000);
  display.clearDisplay(); // 清屏
  display.display(); // 应用清屏
}

void loop() {
  // 绘制点阵图形
  for (int x = 0; x < display.width(); x++) {
    for (int y = 0; y < display.height(); y++) {
      display.drawPixel(x, y, WHITE); // 绘制白色像素
      display.display(); // 更新显示
      delay(10); // 控制绘制速度
    }
  }
}

要点解读:
图形模式:ST7565支持图形模式,可以通过drawPixel函数操作单个像素。
显示更新:每次调用display()函数更新显示内容。
绘制速度:通过delay函数控制绘制速度,便于观察。

2、使用SSD1306 OLED显示点阵像素

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

#define SCREEN_WIDTH 128 // OLED显示屏幕的宽度,以像素计
#define SCREEN_HEIGHT 64 // OLED显示屏幕的高度,以像素计
#define OLED_RESET     -1 // 不使用复位引脚

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 连接到OLED显示屏
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // 进入无限循环,无法初始化显示屏
  }
  display.clearDisplay(); // 清屏
  display.display(); // 应用清屏
}

void loop() {
  // 绘制点阵图形
  for (int x = 0; x < display.width(); x++) {
    for (int y = 0; y < display.height(); y++) {
      display.drawPixel(x, y, SSD1306_WHITE); // 绘制白色像素
      display.display(); // 更新显示
      delay(10); // 控制绘制速度
    }
  }
}

要点解读:
OLED显示屏:SSD1306是一种常见的OLED显示屏控制器,支持图形模式。
显示初始化:通过display.begin初始化显示屏,指定I2C地址。
绘制像素:使用drawPixel函数绘制单个像素。
显示更新:每次调用display()函数更新显示内容。

3、使用ST7735 TFT LCD显示点阵像素

#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>

#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

void setup() {
  tft.initR(INITR_BLACKTAB); // 初始化TFT屏幕
  tft.setRotation(1); // 设置屏幕方向
  tft.fillScreen(ST7735_BLACK); // 填充屏幕为黑色
}

void loop() {
  // 绘制点阵图形
  for (int x = 0; x < tft.width(); x++) {
    for (int y = 0; y < tft.height(); y++) {
      tft.drawPixel(x, y, ST7735_WHITE); // 绘制白色像素
      delay(10); // 控制绘制速度
    }
  }
}

要点解读:
TFT显示屏:ST7735是一种常见的TFT显示屏控制器,支持图形模式。
显示初始化:通过initR函数初始化显示屏,指定初始化参数。
绘制像素:使用drawPixel函数绘制单个像素。
显示更新:TFT显示屏通常不需要像OLED那样频繁调用display()函数,因为它们是直接在屏幕上绘制的。

在这里插入图片描述

4、自定义点阵图形显示

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C地址0x27,16列2行
 
void setup() {
  lcd.init();
  lcd.backlight();
  
  // 定义箭头点阵(5x8像素)
  byte arrow[8] = {
    B00100,
    B01110,
    B11111,
    B01110,
    B00100,
    B00000,
    B00000,
    B00000
  };
  lcd.createChar(0, arrow); // 存储到字符0
  
  lcd.setCursor(5, 0);
  lcd.write(byte(0)); // 显示箭头
}
 
void loop() {} // 保持静态显示

要点解读:
createChar()将5x8点阵数据存入CGRAM,每个字节代表一列像素(1为点亮)。
适用于状态指示、方向提示等场景,需注意点阵分辨率受限于字符尺寸(5x8)。

5、动态点阵动画

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
 
byte heart[8] = {
  B00000,
  B01010,
  B11111,
  B11111,
  B01110,
  B00100,
  B00000,
  B00000
};
 
void setup() {
  lcd.init();
  lcd.backlight();
  lcd.createChar(0, heart);
}
 
void loop() {
  // 心跳放大缩小动画
  for (int size = 1; size <= 3; size++) {
    lcd.setCursor(7 - size, 0);
    for (int i = 0; i < 2 * size; i++) {
      lcd.write(byte(0));
    }
    delay(300);
    lcd.clear();
  }
}

要点解读:
通过循环调整字符显示位置和数量模拟动画效果,delay(300)控制帧率。
适用于动态图标、简单游戏等场景,需注意动画流畅度与刷新率的平衡。

6、交互式点阵绘图板

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12); // 引脚定义
 
int cursorX = 0, cursorY = 0;
bool drawMode = false;
 
void setup() {
  lcd.begin(16, 2);
  lcd.print("Press BTN to Draw");
  pinMode(2, INPUT_PULLUP); // 按键接D2
}
 
void loop() {
  if (digitalRead(2) == LOW) { // 按键按下
    delay(200); // 防抖
    drawMode = !drawMode;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(drawMode ? "Drawing..." : "Idle");
  }
 
  // 简单光标移动(示例仅水平)
  static unsigned long lastTime = 0;
  if (millis() - lastTime > 500) {
    cursorX = (cursorX + 1) % 16;
    lcd.setCursor(cursorX, cursorY);
    lcd.write(drawMode ? '*' : ' '); // 绘制或擦除
    lastTime = millis();
  }
}

要点解读:
结合按键切换绘制模式,通过write(‘*’)在特定位置点亮像素。
适用于简易绘图工具、用户交互界面,需扩展代码以实现完整光标控制(如十字键)。

注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。

在这里插入图片描述

### 关于在Arduino上使用LVGL库的示例教程 #### 示例代码解析 为了帮助理解如何在Arduino平台上利用LVGL库构建图形用户界面,下面提供了一个简单的`HelloWorld`实例。此例子展示了基本的初始化过程以及创建一个按钮的方法。 ```cpp #include "lvgl/lvgl.h" #include "lv_arduino.h" void setup() { Serial.begin(9600); // 初始化TFT屏幕和触摸屏 tft.init(); ts.begin(); // 初始化LVGL库 lv_init(); lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); /*Basic display driver initialization*/ disp_drv.flush_cb = my_disp_flush; // 设置刷新回调函数 lv_disp_drv_register(&disp_drv); // 创建一个按钮并设置其属性 lv_obj_t * btn1 = lv_btn_create(lv_scr_act()); lv_obj_set_pos(btn1, 10, 10); /*Set its position*/ lv_obj_set_size(btn1, 120, 50); /*Set its size*/ // 给按钮添加标签 lv_obj_t * label = lv_label_create(btn1); lv_label_set_text(label, "Button"); } void loop() { lv_task_handler(); /*Let the GUI do its work*/ delay(5); /*Sleep a bit not to waste resources*/ } ``` 这段代码首先包含了必要的头文件,并定义了`setup()`函数来完成硬件初始化工作[^2]。接着,在屏幕上创建了一个按钮对象,并通过调用`lv_btn_create()`方法将其放置到当前活动窗口中;之后调整位置大小并通过`lv_label_create()`给该按钮附加文字说明。最后,在主循环里不断更新GUI状态以响应事件处理程序。 #### 主要组件解释 - **lvgl/** 文件夹下存放着核心图形引擎及相关模块; - **examples/** 中有多个子目录分别对应不同类型的案例研究,比如最基础的`HelloWorld`入门级应用; - **libraries/** 收录了第三方依赖项和其他支持包; - **tools/** 提供了一些实用工具,例如图像转换器等辅助开发的小应用程序[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值