[Arduino] ESP32开发 - LCD1602显示实验

news2024/11/17 6:26:03

目录

      • LCD1602
        • 硬件准备
        • 环境搭设
        • 接线
        • 获取 IIC 地址
        • 显示第一行文本
        • 可滚动字符串
        • 点灯小案例

LCD1602

实验将利用 LCD1602 显示文本
参考文献:https://randomnerdtutorials.com/esp32-esp8266-i2c-lcd-arduino-ide/


硬件准备

4 条母对母杜邦线
LCD1602
Esp32-Devkit-V1
I2C 转接板(LCD1602 专用)
一块面包板

一把小螺丝刀(用于调节电位器)

如果手头上没有对应硬件,可以去 https://wokwi.com/ 简单模拟实验一下


环境搭设

基于 arduino 的 esp32 开发环境搭设这里就不废话了,网上有很多,大家可以自行去查看

LCD1602 显示内容,我们需要借用国外大神编写的一个库:
前往 github 下载 LiquidCrystal_I2C 库 点击前往

直接把整个仓库下载下来,得到的 ZIP 包就是库文件;
然后打开 arduino,点击顶部菜单栏的 项目->加载库->添加ZIP库 ,选中下载好的 ZIP 文件即可导入库


接线

确保 LCD1602 以及对应的 I2C 转接板的接口一一对应

在这里插入图片描述

下面是转接板四个引脚与 ESP32 上的引脚对应情况(使用 IIC)
GND - GND
VCC - VIN
SDA - D21
SCL - D22

由于 LCD1602 需要的电压比较大,必须使用 5v 的,所以 VCC 需要连接到 ESP32 上的 5v 输出端 VIN


获取 IIC 地址

在启用 LCD1602 之前,我们需要对 IIC 地址进行检测
使用默认的 IIC Scanner 代码即可查找到地址

这是查找地址的代码,直接复制粘贴到 IDE 里面烧录即可
从串口监视器上输出 IIC 地址

#include <Wire.h>

 void setup() {
   Wire.begin(); // 初始化 I2C 总线
   Serial.begin(115200); // 初始化串口通信,波特率为 115200
   Serial.println("\nI2C 扫描器"); // 输出提示信息
 }

 void loop() {
   byte error, address; // 定义变量 error 和 address,类型为 byte
   int nDevices; // 定义变量 nDevices,类型为 int
   Serial.println("扫描中..."); // 输出提示信息
   nDevices = 0; // 初始化 nDevices 为 0
   for(address = 1; address < 127; address++ ) { // 遍历 I2C 地址
     Wire.beginTransmission(address); // 开始传输数据
     error = Wire.endTransmission(); // 结束传输数据,并返回传输状态
     if (error == 0) { // 如果传输状态为 0,表示找到了 I2C 设备
       Serial.print("在地址 0x"); // 输出提示信息
       if (address<16) {
         Serial.print("0"); // 如果地址小于 16,前面补 0
       }
       Serial.println(address,HEX); // 输出 I2C 设备地址
       nDevices++; // 统计找到的 I2C 设备数量
     }
     else if (error==4) { // 如果传输状态为 4,表示未知错误
       Serial.print("在地址 0x"); // 输出提示信息
       if (address<16) {
         Serial.print("0"); // 如果地址小于 16,前面补 0
       }
       Serial.println(address,HEX); // 输出 I2C 设备地址
     }
   }
   if (nDevices == 0) { // 如果没有找到 I2C 设备
     Serial.println("未找到 I2C 设备\n"); // 输出提示信息
   }
   else { // 如果找到了 I2C 设备
     Serial.println("扫描完成\n"); // 输出提示信息
   }
   delay(5000); // 延时 5 秒钟
 }

如果你的电路链接没有任何问题,且保证所有元器件均无损坏的情况下
你可以从串口监视器看到对应的地址如下:

我这边得到的地址是 0x27

在这里插入图片描述


显示第一行文本

特别注意!!!如果你发现写完代码成功烧录后屏幕啥都没有甚至有些暗,那可能就是电阻不对,拿出你的螺丝刀扭动电位器,直到屏幕正常显示文本即可!

新建一个项目,写入如下代码

#include <LiquidCrystal_I2C.h>

// 定义行列数,默认不用更改,因为大家的LCD1602规格都是一致的
int lcdColumns = 16;
int lcdRows = 2;

// 初始化LCD1602
// 参数一为IIC地址
// 参数二为列数
// 参数三为行数
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);

void setup(){
  // 初始化LCD
  lcd.init();
  // 打开LCD背光显示
  lcd.backlight();
}

void loop(){
  // 将光标移动到显示器0列0行位置
  lcd.setCursor(0, 0);
  // 打印字符
  lcd.print("Hello, World!");

  // 设置delay使其形成无效死循环,用于保持文本的显示
  delay(1000);
}

setCursor 设置光标的参数前后对应列和行;
也就是说如果我要在第二行第一列开始输入文本,就需要设置 setCursor(0,1)

loop 代码块末尾的 delay 一定要加


你可以使用 clear 清除当前显示屏上的所有文本,然后重新打印一个新的

lcd.clear();

下图即为静态文本显示测试成功后的结果图

在这里插入图片描述


可滚动字符串

#include <LiquidCrystal_I2C.h>

int lcdColumns = 16;
int lcdRows = 2;

LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);

// 设置静态字符串(第一行显示)
// 设置动态滚动字符串(第二行显示)
String messageStatic = "Static message";
String messageToScroll = "helloworld an esp32 platform devkit desktop funny for everyone.";

// 文本向左滚动的代码实现
void scrollText(int row, String message, int delayTime, int lcdColumns) {
  // 如果滚动文本长度小于屏幕最大一次显示长度,那就直接打印
  for (int i=0; i < lcdColumns; i++) {
    message = " " + message;
  }

  // 如果大于
  // 每次循环输出文本中的一小段,之后每次循环pos后移一位并显示,达到滚动显示的视觉效果
  message = message + " ";
  for (int pos = 0; pos < message.length(); pos++) {
    lcd.setCursor(0, row);
    lcd.print(message.substring(pos, pos + lcdColumns));
    delay(delayTime);
  }
}

void setup(){
  lcd.init();
  lcd.backlight();
}

void loop(){
  // 设置默认光标
  lcd.setCursor(0, 0);
  // 首先第一行打印静态字符串
  lcd.print(messageStatic);
  // 调用滚动输出函数,输出文本
  scrollText(1, messageToScroll, 250, lcdColumns);
}

点灯小案例

GPIO 点灯配合 LCD1602 显示当前状态

功能很简单,我们把 LCD 显示的代码抽离成一个方法 LCD_Setting
之后每次小灯点亮或者熄灭一次,就调用该方法,判断小灯状态来显示对应的文本

记住要把 LCD 显示的代码写到 loop 循环里面哦!

LCD 显示内容之前记得 lcd.clear() 清屏哦!

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

const int LED = 2;

void setup() {
  // put your setup code here, to run once:
  lcd.init();
  lcd.backlight();

  pinMode(LED,OUTPUT);
}

void loop() {
  digitalWrite(LED, HIGH);
  LCD_Setting(1);
  delay(500);
  digitalWrite(LED, LOW);
  LCD_Setting(0);
  delay(500);
}

void LCD_Setting(int status){
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("LED Status");
  lcd.setCursor(0, 1);
  lcd.print(status?"ON":"OFF");
}

此案例采用板卡默认自带小灯(GPIO2)实现,不需要额外接电路


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700495.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JProfiler 使用中文说明文档

JProfiler 是一款用于 Java 应用程序性能分析和优化的工具。它可以帮助开发人员识别性能瓶颈、内存泄漏等问题&#xff0c;并提供可视化的分析报告和建议。JProfiler 支持各种 Java 虚拟机、应用服务器和操作系统&#xff0c;可以在本地或远程环境中运行。下载安装完成后对应的…

目标检测模型中的Bells and wisthles

目标检测模型中的Bells and wisthles 目标检测模型中的Bells and wisthles1. Data augmentation 数据增强2. Multi-scale Training/Testing 多尺度训练/测试3. Global Context 全局语境4. Box Refinement/Voting 预测框微调/投票法5. OHEM 在线难例挖掘6. Soft NMS 软化非极大抑…

云原生——云平台操作

❄️作者介绍&#xff1a;奇妙的大歪❄️ &#x1f380;个人名言&#xff1a;但行前路&#xff0c;不负韶华&#xff01;&#x1f380; &#x1f43d;个人简介&#xff1a;云计算网络运维专业人员&#x1f43d; 前言 云&#xff1a;云是网络、互联网的一种比喻说法。 平台&am…

【爬虫】5.2 Selenium编写爬虫程序

1. Selenium 框架介绍 Selenium自动化测试框架是实现自动化测试的一个软件结构和功能组件集合。Selenium自动化测试框架是一个半成品&#xff0c;能够帮助用户实现自动化测试。Selenium是模仿浏览器行为的&#xff0c;当你运行测试类&#xff08;爬虫&#xff09;的时候&…

【AIGC】Chatglm2-lora微调

ChatGLM2介绍 ChatGLM2-6B源码地址&#xff1a;https://github.com/THUDM/ChatGLM2-6B ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本&#xff0c;在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上&#xff0c;ChatGLM2-6B 引入了如下新特性&…

【Java】Java中的异常

文章目录 一、什么是异常1.1 异常的概念1.2 异常的分类 二、异常的体系结构三、异常的处理3.1 异常的抛出3.2 异常的捕获与处理3.3 异常的处理流程 四、自定义异常类4.1 自定义异常类的规则4.2 自定义异常案例 一、什么是异常 1.1 异常的概念 在Java中&#xff0c;异常&#…

《Linux操作系统编程》第八章 Shell程序设计: shell 语言结构,包括测试、分支、循环、跳转、函数、语句组

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

C++ DAY3

1.思维导图 2.有以下类定义&#xff0c;按要求实现剩余功能 #include <iostream> using namespace std;class Person { private:int age;int *p; public://无参构造Person():p(new int(89)){age 18;}//有参构造Person(int age,int num){this->age age;this->pne…

基于Java实验室开放管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Servlet实现留言墙

目录 1.创建工程 2.构建目录工程结构 3.设置编码格式尾utf-8 4.查看Maven配置 5.一些其他配置​编辑 6.导入依赖 7.导入HTML和JS、配置tomcat 8.测试网站是否可以正常访问 9.编写业务代码 开发环境&#xff1a;idea2022.2社区版 1.创建工程 2.构建目录工程结构 web.xml中的…

《程序员的AI书_从代码开始》第一章 机器学习的Hello World

文章目录 1.3 从代码开始1.3.2 一段简单的代码 1.3 从代码开始 1.3.2 一段简单的代码 python导入tensflow.keras报错解决方法 import tensorflow as tf from tensorflow.python.keras.models import Sequential from tensorflow.python.keras.layers import DensemodelSeque…

为什么网络攻击绝大多数发生在游戏行业

近年来&#xff0c;游戏行业欣欣向荣&#xff0c;游戏玩家也呈指数级增长&#xff0c;全球数以亿计的游戏玩家享受着网络游戏广泛的互动体验&#xff0c;然而&#xff0c;由于游戏的崛起和受欢迎程度也使其成为网络黑客寻求利用其漏洞的首选目标。 出于多种原因&#xff0c;游…

MybatisPlus的分页插件自动优化LeftJoin语句导致参数不匹配

所报的错误&#xff1a; java.sql.SQLException: Parameter index out of range (3 &#xff1e; number of parameters, which is 2). 首先会去检查自己传了哪些参数&#xff1f;是否都用上了&#xff1f;反复检查&#xff0c;发现并没有多余的参数&#xff1a; controller…

目前主流的软件开发模型:瀑布模型,增量模型(渐增模型,快速原型模型),螺旋模型,喷泉模型,敏捷模型。

目录 前言&#xff1a; 一、瀑布模型&#xff1a; 二、增量模型&#xff1a; 三、螺旋模型&#xff1a; 四、喷泉模型&#xff1a; 五、敏捷开发模型&#xff1a; 前言&#xff1a; 软件开发模型是用来指导和组织软件开发过程的模式或方法。随着软件行业的发展和不断变化…

Hue 后台编辑器 远程命令执行漏洞

描述 Hue 后台编辑器存在命令执行漏洞&#xff0c;攻击者通过编辑上传 xxx.sh 文件即可达到命令执行的目的。 FOFA title"Hue - 欢迎使用 Hue" "/hue/accounts/login?next/"复现过程 默认密码&#xff1a;admin:admin 上传并编辑文件为执行的命令

5、DataX(DataX简介、DataX架构原理、DataX部署、使用、同步MySQL数据到HDFS、同步HDFS数据到MySQL)

1、DataX简介 1.1 DataX概述 DataX 是阿里巴巴开源的一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。源码地址&#xff1a;https://github.com/alibaba/Dat…

SpringBoot3.0整合RocketMQ时出现未能加载bean文件

SpringBoot3.0整合RocketMQ时出现未能加载bean文件 问题 APPLICATION FAILED TO START Description: Field rocketMQTemplate in com.spt.message.service.MqProducerService required a bean of type ‘org.apache.rocketmq.spring.core.RocketMQTemplate’ that could not …

Scala里的WordCount 案例

7.7.5 普通 WordCount 案例 package chapter07object TestWordCount__简单版 {def main(args: Array[String]): Unit {//单词计数&#xff1a;将集合中出现的相同单词计数&#xff0c;进行计数&#xff0c;取计数排名的前三的结果val stringList List("Hello Scala Hbas…

2023年前端面试汇总-React

1. 组件基础 1.1. React事件机制 <div onClick{this.handleClick.bind(this)}>点我</div> React并不是将click事件绑定到了div的真实DOM上&#xff0c;而是在document处监听了所有的事件&#xff0c;当事件发生并且冒泡到document处的时候&#xff0c;React将事…

C语言进阶--动态内存管理

目录 一.为什么使用动态内存分配&#xff1f; 二.动态内存函数 2.1.malloc和free malloc函数 free函数 2.2.calloc和realloc calloc函数 realloc函数 三.常见的动态内存错误 对NULL指针的解引用 对动态开辟空间的越界访问 对非动态开辟内存使用free释放 使用free释…