搜索代码

第20/31课:在LCD1602上显示超声波距离

第20/31课:在LCD1602上显示超声波距离

本项目演示了如何将HC-SR04超声波距离传感器与支持I2C的LCD1602显示屏相结合,打造一个实时距离测量系统。通过本指南的学习,您将拥有一个能够持续测量并以厘米为单位显示物体距离的工作设备。这是Arduino电子学中的一项基础技能,因为它将传感器输入与视觉输出结合在了一起。

Sunfounder 20-LCD1602-ultrasonic

这一实用设置可用于多种现实应用,包括:

  • 打造智能停车辅助系统,帮助您判断与墙壁或其他车辆的距离。
  • 通过测量从顶部到液面的距离,构建简单的储罐液位监测器。
  • 开发自动洗手液分配器或感应式垃圾桶,当物体靠近时自动开启。
  • 构建基本的安全警报系统,当有人进入特定区域时触发。

硬件与组件

要构建此项目,您需要以下组件:

  • Arduino开发板(例如Uno)
  • 带I2C接口模块的LCD1602显示屏
  • HC-SR04超声波距离传感器
  • 跳线
  • 面包板(可选,便于连接)

了解LCD1602与I2C

LCD1602是一款流行的显示屏,能够在两行上每行显示16个字符。其背面的“I2C”模块是一个显著优势,因为它将控制显示屏所需的引脚数从6个或更多减少到仅需2个用于通信(SDA和SCL)以及2个用于电源(VCC和GND)。这种简化使接线更加整洁,并释放了Arduino上宝贵的数字引脚,可用于其他传感器,例如本项目中的超声波传感器。(视频中01:30处)

I2C模块还配备了一个小型电位器,用于调节显示屏的对比度。如果显示屏通电后无显示,请尝试旋转此螺丝,直到文字可见。(视频中02:47处)

接线指南

LCD1602_wiring_ultrasonic_bb

连接组件非常简单。LCD的I2C模块有四个引脚需要连接到Arduino。超声波传感器同样有四个引脚。

以下是连接明细:

LCD1602 I2C模块到Arduino:

  • GND 连接到Arduino的 GND
  • VCC 连接到Arduino的 5V
  • SDA 连接到Arduino的 A4
  • SCL 连接到Arduino的 A5

HC-SR04超声波传感器到Arduino:

  • VCC 连接到Arduino的 5V
  • Trig 连接到Arduino的数字引脚 12
  • Echo 连接到Arduino的数字引脚 11
  • GND 连接到Arduino的 GND

本项目的接线图在视频中有展示。

安装所需库

本项目依赖两个关键库。第一个是LiquidCrystal_I2C,用于控制LCD,Arduino IDE默认不包含该库。您可以从视频描述中提供的链接或Robojax网站下载。(视频中06:16处)

第二个库是NewPing,用于与超声波传感器交互。它简化了发送脉冲和读取回波时间的过程。这两个库都可以通过Arduino IDE的库管理器安装,路径为Sketch -> Include Library -> Manage Libraries,然后搜索它们的名称。

代码说明

此代码将LCD和超声波传感器的功能结合在一起。代码结构设计为便于根据您的具体设置进行配置。

在代码顶部,您会找到可能需要调整的关键变量:

// 将LCD地址设置为0x27,适用于16字符2行显示
LiquidCrystal_I2C lcd(0x27, displayChars, displayRows);

#define TRIGGER_PIN  12  // Arduino引脚连接到超声波传感器的触发引脚。
#define ECHO_PIN     11  // Arduino引脚连接到超声波传感器的回波引脚。
#define MAX_DISTANCE 190 // 我们想要探测的最大距离(以厘米为单位)。
  • LCD地址(0x27): 这是LCD模块的I2C地址。大多数模块使用0x27,但有些可能使用0x3F。如果显示屏无显示,您可能需要运行I2C扫描代码来找到正确的地址并更新此值。(视频中08:11处)
  • TRIGGER_PIN和ECHO_PIN: 这些定义了连接到超声波传感器Trig和Echo引脚的Arduino数字引脚。如果您使用不同的引脚,请更改这些定义。
  • MAX_DISTANCE: 这设置了传感器将测量的最大距离(以厘米为单位)。HC-SR04可以测量到400-500厘米,但设置较低的值可以提高读数的准确性和可靠性,尤其是在较短距离时。

loop()函数中,代码执行以下步骤:

  1. 它使用sonar.ping_cm()函数来测量距离,并将其存储在distance变量中。
  2. 它清除LCD并在第一行打印文本“Robojax.com”。
  3. 然后它将光标设置到第二行并打印“Distance: ”。
  4. 最后,它将光标移动到第二行的第10个位置,以打印测量到的distance值,后跟“cm”。

循环末尾的delay(200)控制传感器进行新读数并更新显示的频率。

代码演示

一旦代码上传到您的Arduino,LCD将亮起并开始显示距离。您可以通过将手或物体靠近和远离超声波传感器来测试设置。屏幕上的数字应实时更新,以厘米为单位显示距离。(视频中在38:07处)

本视频中的相关项目

章节

  • [00:00] LCD1602简介和项目概述
  • [01:30] LCD1602硬件和I2C模块详解
  • [03:14] LCD引脚排列和I2C地址配置
  • [05:28] LCD1602的接线图
  • [06:16] 安装所需的LCD库
  • [07:24] 在LCD上打印文本的基本代码
  • [08:11] 查找您的LCD的I2C地址
  • [11:10] LCD示例:闪烁光标和自定义字符
  • [18:51] LCD示例:串行显示和滚动文本
  • [24:36] 在LCD上显示DHT11温度和湿度
  • [33:00] 在LCD上显示电位器的电压
  • [35:56] 将超声波传感器代码与LCD结合
  • [38:07] 超声波距离显示演示

图像

Sunfounder car assembled
Sunfounder car assembled
Sunfounder 20-LCD1602-ultrasonic
Sunfounder 20-LCD1602-ultrasonic
LCD1602_wiring_ultrasonic_bb
LCD1602_wiring_ultrasonic_bb
921-Lesson 20/31: Displaying distance from ultrasonic sensor on LCD1602
语言: C++
/*
This sketch reads the distance using the ultrasonic sensor and displays on LCD1602
Download and resource page https://robojax.com/RJT878
watch video https://www.youtube.com/watch?v=NXAswOc_2zg
*/
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
const int displayChars =16;
const int displayRows =2;

// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, displayChars, displayRows);
int shomar =0;
#include <NewPing.h>

#define TRIGGER_PIN  12  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     11  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 190 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
int distance;

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

void setup() {
  Serial.begin(9600); // Open serial monitor at 9600 baud to see ping results.
  // Robojax code for LCD with I2C
  // initialize the LCD, 
  lcd.begin();
 // Turn on the blacklight and print a message.
  lcd.backlight();

}

void loop() {
  
   distance  = sonar.ping_cm();//get the distance in cm
   lcd.clear();
   lcd.print("Robojax.com");
   lcd.setCursor (0,1);//set cursor to char 0 line 2
   lcd.print("Distance: ");  
   lcd.setCursor (10,1); 
   lcd.print(distance);
   lcd.print("cm"); 
   
   delay(200); 
  

}

文件📁

Arduino 库(zip 格式)

用户手册