Arduino通过中断方式实现超声波测距

最近做一个小车项目,为了实现高效准确的测距,我使用定时器和外部中断写了一个测距的模块,分享给大家参看,如果有不对的地方,请留言批评指正。
代码分享:

#include <FlexiTimer2.h>
int Ul_trigPin = 7, Ul_echoPin = 2;     // 定义超声波的引脚
long Ul_duration;                       // 测到的距离
unsigned long Ul_starttime;             // 超声波测距的启动时间
int Ul_startflag = 0;                  // 超声波测距的启动标志位
/**
 * 定时器2的中断子程序,用于超声波延时20ms
 */
void timer2()
{
  FlexiTimer2::stop();
  digitalWrite(Ul_trigPin, LOW);
  Ul_starttime = micros();  
}
/**
 * 外部中断2的延时子程序,用于超声波回波接收,接Echo
 */
void interrupt_0(){
  Ul_duration = (micros() - Ul_starttime-2240) / 59;   // 需要减去trig和echo变化之间的延迟2240us  time/2/1000 * 34cm/ms
  Ul_startflag = 0;
}
void setup()
{
  Serial.begin(38400);   // 设定串口的波特率
  FlexiTimer2::set(20, 1.0/1000, timer2); // 初始化定时器2
  pinMode(Ul_trigPin, OUTPUT);
  pinMode(Ul_echoPin, INPUT);
  digitalWrite( Ul_trigPin , LOW );
  // 初始化外部中断0
  attachInterrupt(0, interrupt_0, FALLING);  //interrupt为你中断通道编号,function为中断函数,mode为中断触发模式
}

void loop()
{
  if (Ul_startflag == 0){   //启动测距
    Ul_startflag = 1;
    digitalWrite(Ul_trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(Ul_trigPin, HIGH);
    FlexiTimer2::start();
    Serial.print("message");
    Serial.print(Ul_duration	);
    Serial.println();
  } 
}

执行此代码可以不断获取超声波测距的信息,并通过串口发送。
更多关于Arduino的外部中断请查看

你可以使用Arduino超声波传感器来实现测距报警功能,并使用中断来及时处理报警事件。下面是一个简单的示例代码: ```cpp // 引入必要的库 #include <NewPing.h> // 定义超声波传感器的引脚 #define TRIGGER_PIN 2 #define ECHO_PIN 3 // 定义报警距离(单位:厘米) #define ALARM_DISTANCE 50 // 创建一个超声波传感器对象 NewPing sonar(TRIGGER_PIN, ECHO_PIN); // 中断函数 void alarmInterrupt() { // 在此处编写你的报警逻辑,例如触发蜂鸣器或发送警报通知等 // 注意:中断函数应该尽可能短小和快速,避免耗时操作或延迟。 } void setup() { // 初始化串口通信 Serial.begin(9600); // 配置中断引脚为输入模式 pinMode(ALARM_PIN, INPUT_PULLUP); // 绑定中断函数到中断引脚 attachInterrupt(digitalPinToInterrupt(ALARM_PIN), alarmInterrupt, CHANGE); } void loop() { // 发送超声波信号并接收回波 unsigned int distance = sonar.ping_cm(); // 输出距离值到串口监视器 Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); // 如果距离小于报警距离,触发中断 if (distance < ALARM_DISTANCE) { // 触发中断函数 alarmInterrupt(); } // 等待一段时间再进行下一次测量 delay(100); } ``` 你可以根据自己的需求修改代码中的报警距离和报警逻辑。在中断函数中,你可以添加触发蜂鸣器、发送警报通知等操作。记得在中断函数中避免耗时操作和延迟,以确保中断能够及时响应。同时,还需要注意超声波传感器的引脚配置与连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值