/*
* 超声波测距与数码管显示实验 (Wokwi仿真)
* 使用Arduino UNO、HC-SR04超声波传感器、TM1637四位数码管
*/
#include <TM1637Display.h> // 导入TM1637数码管驱动库
// --- 引脚定义 ---
// 超声波传感器引脚
#define TRIG_PIN 7 // 触发信号输出引脚
#define ECHO_PIN 6 // 回响信号输入引脚
// TM1637数码管引脚
#define CLK_PIN 2 // 时钟信号引脚
#define DIO_PIN 3 // 数据输入/输出引脚
// --- 变量和对象 ---
TM1637Display display(CLK_PIN, DIO_PIN); // 创建数码管显示对象
float duration_us, distance_cm; // 存储脉冲时长和计算出的距离
void setup() {
Serial.begin(9600); // 初始化串口通信,用于调试
display.setBrightness(7); // 设置数码管亮度 (0-7)
// 设置超声波传感器引脚模式
pinMode(TRIG_PIN, OUTPUT); // TRIG引脚设为输出
pinMode(ECHO_PIN, INPUT); // ECHO引脚设为输入
// 开机时数码管显示"----"作为初始化提示
uint8_t initSegments[] = { 0x40, 0x40, 0x40, 0x40 };
display.setSegments(initSegments);
delay(1000); // 持续1秒
}
void loop() {
// 1. 触发超声波传感器
// 确保TRIG引脚为低电平
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
// 发送一个10微秒的高电平脉冲
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// 2. 接收回响信号并计算时长
duration_us = pulseIn(ECHO_PIN, HIGH, 30000); // 读取ECHO引脚高电平持续时间(微秒),设置30ms超时,单位μs
// 3. 计算距离
// 如果返回0,表示超时或未收到回响,距离设为无效值
if (duration_us == 0) {
distance_cm = -1; // 用-1表示测量无效
} else {
// 距离(厘米) = 持续时间(微秒) / 58
distance_cm = duration_us / 58.0;
}
// 4. 在数码管上显示距离
if (distance_cm >= 0) {
display.showNumberDec((int)distance_cm, false); // 显示整数距离,不显示前导零
} else {
// 显示 "----" 表示测量无效
uint8_t errorSegments[] = { 0x40, 0x40, 0x40, 0x40 };
display.setSegments(errorSegments);
}
// 5. (可选) 在串口监视器中打印距离值,方便调试
Serial.print("Distance: ");
Serial.print(distance_cm);
Serial.println(" cm");
// 6. 短暂延时,避免刷新过快
delay(200);
}