当你使用 Arduino 控制超声波传感器时,你可能需要实时监测超声波传感器与目标物体之间的距离。为了更方便地实时显示超声波传感器的测距结果,我们可以使用 OLED 屏幕来显示测距结果。本篇博客将向你展示如何使用 Arduino 和 OLED 屏幕来实现这一功能。
所需材料
Arduino 开发板
超声波传感器
OLED 屏幕
杜邦线若干
步骤
1、连接电路
将超声波传感器和 OLED 屏幕分别连接到 Arduino 开发板上。超声波传感器的 VCC 引脚连接到 Arduino 的 5V 引脚,GND 引脚连接到 Arduino 的 GND 引脚,Trig 引脚连接到 Arduino 的 12 号引脚,Echo 引脚连接到 Arduino 的 11 号引脚。OLED 屏幕的 VCC 引脚连接到 Arduino 的 3.3V或者5v 引脚,GND 引脚连接到 Arduino 的 GND 引脚,SDA 引脚连接到 Arduino 的 A4 引脚,SCL 引脚连接到 Arduino 的 A5 引脚。
2、引入库
在 Arduino 开发环境中,需要添加一些库文件,以便控制 OLED 屏幕。首先,在 Arduino 开发环境中选择“工具” -> “管理库”,然后搜索并安装 Adafruit_SSD1306 库和 Adafruit_GFX 库。这两个库是用于控制 OLED 屏幕的必备库文件。
初始化 OLED 屏幕
在程序的开头,添加以下代码,以初始化 OLED 屏幕:
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define OLED_RESET 4
Adafruit_SSD1306 OLED(OLED_RESET);//定义oled对象
#define TRIGGER_PIN A0//定义超声波引脚
#define ECHO_PIN A1
void setup() {
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Serial.begin(9600);
OLED.begin(SSD1306_SWITCHCAPVCC, 0x3C);//SSD1306_SWITCHCAPVCC 是电源类型,表示使用内部电源,0x3C 是 I2C 地址,指定 OLED 屏幕的地址。必须写
OLED.clearDisplay();//清除 OLED 屏幕上的显示内容
OLED.setTextColor(WHITE);//设置字体颜色
OLED.setTextSize(1);//设置字体大小
}
}
在这段代码中,我们首先引入了 Wire.h、Adafruit_SSD1306.h 和 Adafruit_GFX.h 库文件,然后定义了 OLED 屏幕的复位引脚号,接着定义了一个 OLED 对象,用于控制 OLED 屏幕的操作。在 setup() 函数中,我们需要将超声波传感器的 TRIGGER 引脚和 ECHO 引脚分别设置为输出和输入,我们使用 OLED.begin() 函数初始化 OLED 屏幕,并使用 OLED.clearDisplay() 函数清空屏幕上的显示内容,最后使用 OLED.display() 函数将清空的屏幕显示出来。
4、测量距离并显示
在 loop() 函数中,我们使用 ping() 函数测量超声波传感器和目标物体之间的距离,并将测量结果保存在 duration 变量中。然后,我们使用 cm 函数将毫秒数转换为厘米数,保存在 distance 变量中。最后,我们使用 OLED.setCursor() 函数将光标移动到 OLED 屏幕的左上角,并使用 OLED.println() 函数将距离显示在屏幕上。
void loop() {
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
unsigned long duration = pulseIn(ECHO_PIN, HIGH);
unsigned int distance = duration / 58; // 将微秒转换为厘米
OLED.clearDisplay();//刷新屏幕内容
OLED.setCursor(0, 0);//文本显示位置,这里表示从0行0列的位置开始显示
OLED.println("Distance:");//在屏幕上换行打印distance
OLED.setCursor(0, 10);
OLED.print(distance);
OLED.print(" cm");
OLED.display();
Serial.println(distance);//在串口打印
delay(100); // 刷新屏幕的时间间隔
}
}
在这段代码中,我们首先定义了 duration 和 distance 变量,用于保存测量结果。然后,我们设置 TRIGGER_PIN引脚为输出模式,并将其输出低电平,延时 2 微秒后将其输出高电平,延时 10 微秒后将其输出低电平,从而触发超声波传感器的测距操作。接着使用 pulseIn() 函数测量超声波传感器和目标物体之间的距离。
测量距离后,我们使用 OLED.clearDisplay() 函数清空 OLED 屏幕上的显示内容,并使用 OLED.setCursor() 函数将光标移动到 OLED 屏幕的左上角。然后,我们使用 OLED.println() 函数将“Distance:”和测量结果显示在 OLED 屏幕上,并使用 OLED.display() 函数将显示内容显示出来。最后,我们使用 delay() 函数延时 500 毫秒,以便更好地观察显示结果。
接下来就可以上传程序了,看下显示效果
完整代码
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 OLED(OLED_RESET);
#define TRIGGER_PIN A0
#define ECHO_PIN A1
void setup() {
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Serial.begin(9600);
OLED.begin(SSD1306_SWITCHCAPVCC, 0x3C);//SSD1306_SWITCHCAPVCC 是电源类型,表示使用内部电源,0x3C 是 I2C 地址,指定 OLED 屏幕的地址。必须写
OLED.clearDisplay();//清除 OLED 屏幕上的显示内容
OLED.setTextColor(WHITE);//设置字体颜色
OLED.setTextSize(1);//设置字体大小
}
void loop() {
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
unsigned long duration = pulseIn(ECHO_PIN, HIGH);
unsigned int distance = duration / 58; // 将微秒转换为厘米
OLED.clearDisplay();//刷新屏幕内容
OLED.setCursor(0, 0);//文本显示位置,这里表示从0行0列的位置开始显示
OLED.println("Distance:");//在屏幕上换行打印distance
OLED.setCursor(0, 10);
OLED.print(distance);
OLED.print(" cm");
OLED.display();
Serial.println(distance);//在串口打印
delay(100); // 刷新屏幕的时间间隔
}