Arduino 雷达测距案例

硬件需要

  • Arduino 开发板(如 Arduino Uno)
  • 雷达传感器(如 HC-SR04 超声波传感器)
  • 蜂鸣器(如有源蜂鸣器模块)
  • LED 灯(红色和绿色各一个)
  • 电阻2个(适用于 LED 灯的电阻,如:1K电阻)
  • 连接线和面包板

软件需要

  • Arduino IDE(用于编写和上传代码到 Arduino)
  • Visual Studio 或 Visual Studio Code(用于编写和调试.NET 代码)
  • .NET 库(System.IO.Ports 库,用于串口通信)(.NET 9 平台)

步骤

  • 将 HC-SR04 超声波传感器的 VCC 连接到 Arduino 的 5V,GND 连接到 Arduino 的 GND,Trig 引脚连接到 Arduino 的数字引脚(如 D9),Echo 引脚连接到 Arduino 的数字引脚(如 D10)。
  • 将蜂鸣器的正极连接到 Arduino 的数字引脚(如 D11),负极连接到 GND。
  • 将红色 LED 的正极连接到 Arduino 的数字引脚(如 D12),负极通过电阻连接到 GND。
  • 将绿色 LED 的正极连接到 Arduino 的数字引脚(如 D13),负极通过电阻连接到 GND。

Arduino 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// trigPin和echoPin是用于超声波传感器的引脚
const int trigPin = 9;
const int echoPin = 10;
// buzzerPin是蜂鸣器的引脚
const int buzzerPin = 11;
// redLedPin和greenLedPin是LED灯的引脚
const int redLedPin = 12;
const int greenLedPin = 13;

// 启动函数
void setup() {
// 定义每个引脚的模式(是输入还是输出)
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(redLedPin, OUTPUT);
pinMode(greenLedPin, OUTPUT);

// 用于初始化串口通信,波特率为9600
Serial.begin(9600);
}

// 主循环
void loop() {
long duration, distance;
// 触发超声波传感器发送一个信号
digitalWrite(trigPin, LOW);
delayMicroseconds(2); // 2微妙
digitalWrite(trigPin, HIGH);
delayMicroseconds(10); // 10微妙
digitalWrite(trigPin, LOW);
// 测量信号返回的时间
duration = pulseIn(echoPin, HIGH);
// 将时间转换为距离 29.1是将微秒转换为厘米的一个常数。
distance = (duration / 2) / 29.1;

// 距离小于10厘米,蜂鸣器和红色LED亮起,绿色LED熄灭;否则,蜂鸣器和红色LED熄灭,绿色LED亮起。
if (distance < 10) {
digitalWrite(buzzerPin, HIGH);
digitalWrite(redLedPin, HIGH);
digitalWrite(greenLedPin, LOW);
} else {
digitalWrite(buzzerPin, LOW);
digitalWrite(redLedPin, LOW);
digitalWrite(greenLedPin, HIGH);
}

// 将距离值输出到串口监视器
Serial.println(distance);

// 程序暂停100毫秒
delay(100);
}

.NET 代码

  • 在 Visual Studio 中创建一个新的 Windows Forms 应用程序。
  • 添加两个 lable,一个按钮,并改名为startButton
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System.IO.Ports;

namespace ArduinoExperiment
{
public partial class FormMain : Form
{
SerialPort serialPort = new SerialPort("COM5", 9600);
public FormMain()
{
InitializeComponent();
serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
}


private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
string data = serialPort.ReadLine();
Console.WriteLine(data);
this.Invoke(new MethodInvoker(delegate
{
if (int.TryParse(data, out int distance))
{
label2.Text = $@"当前距离:{data}";

if (distance < 10)
{
label1.Text = "距离过近!";
label1.BackColor = System.Drawing.Color.Red;
}
else
{
label1.Text = "安全距离!";
label1.BackColor = System.Drawing.Color.Green;
}
}
}));
}

private void startButton_Click(object sender, EventArgs e)
{
Console.WriteLine(1);
if (!serialPort.IsOpen)
{
serialPort.Open();
}
}
}
}