【Arduino实验09 外部中断触发报警】

目录

一、实验目的

二、实验设备与环境

三、实验重点

四、实验难点

五、实验内容

5.1实验任务

5.2实验原理

5.3实验内容

5.4实验结果

5.5思考题


一、实验目的

        (1)熟悉外部中断函数、自定义函数的功能;

        (2)掌握外部中断函数、自定义函数的使用;

        (3)编写红外触发外部中断报警程序

        (4)学会中断函数的应用

二、实验设备与环境

        Arduino UNO套件、Arduino IDE、计算机、蜂鸣器、LED、火焰传感器、震动传感器、电阻等等

三、实验重点

        (1)实验电路连接;(2)控制程序代码编写;(3)程序功能调试

四、实验难点

        (1)程序代码编写、调试

五、实验内容

5.1实验任务

        任务描述:通过按键、传感器产生一个触发事件,触发外部中断,调用中断函数发出声光警报。

5.2实验原理

        1.外部中断函数

        attachInterrupt ()

        格式:attachInterrupt(interrupt,function,mode)

        功能:attachInterrupt ()函数用于在程序运行过程中监测外部事件的发生,根据事件触发中断并进行中断程序处理,实现实时响应事件的结果。当触发中断事件,即暂停当前执行的主程序,转去运行中断程序,中断程序执行完成后,再回到主程序,从之前暂停位置语句后继续运行。

        参数:

        中断函数有三个参数,interrupt-表示中断源(引脚号)、function-中断处理函数、mode-触发模式。具体含义如下:

        中断处理函数:指定中断运行的处理函数,当中断发生时执行该子程序,其中参数为函数的指针。

        中断触发模式:

        LOW-低电平触发;CHANGE-跳变时触发;RISING-上升沿触发;FALLING-下降沿触发。

        注意:要在主程序的setup()部分配置好中断函数;中断函数没有形参,也没有返回值。        

        detachInterrupt(interrupt)

        格式:detachInterrupt(interrupt)

        功能:中断分离函数,用于取消中断函数

        参数:interrupt,中断号

         不同的Arduino型号上外部中断的位置也不同,只有外部中断发生在以下端口,Arduino才能捕获到,常见的几种型号的外部中断引脚标号。

//中断程序示例
int testPin= 2;  
//中断号0,接数字引脚2
void setup() {
    ......
    //下降沿触发中断0,调用中断处理程序testProgram函数
    attachInterrupt(0, testProgram, FALLING);
    ......
}
void loop() {
    ......;
}
void testProgram() {      
      //中断处理函数testProgram()
      ......    
}

        2.自定义函数

        将一个重复使用的功能定义为函数,只需要在LOOP主程序里调用就可以实现该功能,使程序结构清晰,使程序简化、编程效率提高。

        3.震动传感器

        震动传感器,根据其结构又分为弹簧开关和滚珠开关。弹簧开关,其内部由一根中心金属导电脚和环绕在其外部的弹簧导电脚组成。弹簧震动时会接触到中心导电脚,形成短路闭合状态。滚珠开关,其内部包含有一颗金属滚珠,当震动时滚珠滚动短路两个导电脚,形成短路闭合状态。

        4.火焰传感器

        火焰的热辐射具有离散光谱的气体辐射和连续光谱的固体辐射。不同燃烧物的火焰辐射强度、波长分布有所差异,但总体来说,其对应火焰温度的近红外波长域及紫外光域具有很大的辐射强度,根据这种特性可制成火焰传感器。火焰传感器利用红外线对火焰非常敏感癿特点,使用特制癿红外线接叐管来检测火焰,然后把火焰癿亮度转化为高低发化癿电平信号。

        火焰传感器的短引脚线未负极,长引脚线为正极,将火焰传感器与10K电阻相连,电路连接方式如图:

5.3实验内容

        1.外部中断函数的使用

        (1)按钮事件触发外部中断

        步骤1:连接电路

        步骤2:写源程序

//按键触发中断检测程序
int ledPin = 9; //LED 接数字引脚 9
int buttonPin = 2; //按键接中断 0,即数字引脚 2
void setup() {
     pinMode(ledPin, OUTPUT);
     pinMode(buttonPin,INPUT_PULLUP); //按键设为输入模式,内部上拉
     attachInterrupt(0, testProgram, FALLING); //下降沿触发中断 0,调用 testProgram 函数
}
void loop(){ }
 
void testProgram() { //中断函数 testProgram() for (i=1;i<=10;i++){
     digitalWrite(ledPin,HIGH);
     delay(200); 
     digitalWrite(ledPin,LOW);
     delay(200);
     }
}

        步骤3:程序功能调试

        步骤4:改变中断触发模式为LOW、CHANGE、RISING,进行中断触发模式测试。

        (2)震动事件触发外部中断

        将按钮开关换成震动传感器,先进行震动传感器实验数据测试,再进行震动触发外部中断事件程序实验。

        步骤:......

        2.火焰传感器参数测试

        步骤1:测试电路连接

        步骤2:程序源代码(参考)

int SensorLED1 = 7; 
int SensorLED2 = 8; 
int SensorINPUT = 2; 
volatile int state = LOW;
 
void setup()
 {
      pinMode(SensorLED1, OUTPUT);
      pinMode(SensorLED2, OUTPUT);
      pinMode(SensorINPUT, INPUT_PULLUP); 
  
      attachInterrupt(0, blink, FALLING);
}
void loop() {
      if (state == HIGH) { 
        state = LOW;
        digitalWrite(SensorLED1, LOW); 
        digitalWrite(SensorLED2, HIGH); 
        delay(500);
      }
      else {
        digitalWrite(SensorLED1, HIGH); 
        digitalWrite(SensorLED2, LOW); 
      }
}
void blink() {        
      state = !state;
}

        步骤3: 程序编译与调试

        3.火焰触发外部中断报警

        任务:根据上一步的火焰传感器测试数据参考设置,实现一个火焰触发中断报警装置,通过火焰触发中断事件,进行中断程序处理。中断处理程序实现火警警灯闪烁效果(红蓝交替闪烁),同时响起消防警报声(高、低交替声响)的功能。

        步骤1:中断报警电路连接

        步骤2:中断报警源程序

int beep=8;
int flamVal=0;
const int sensorPin=A0;
int ledPin=7;
int ledPin1=8;
int buttonPin=2;
int buttonPin1=3;
void setup() {
  // put your setup code here, to run once:
    pinMode(beep,OUTPUT);
    Serial.begin(9600);
    pinMode(ledPin,OUTPUT);
    pinMode(buttonPin,INPUT_PULLUP);
    attachInterrupt(0,testProgram,FALLING);
    pinMode(ledPin1,OUTPUT);
    pinMode(buttonPin,INPUT_PULLUP);
    attachInterrupt(0,testProgram,FALLING);
}

void loop() {
      // put your main code here, to run repeatedly:
      Serial.begin(9600);
      flamVal=analogRead(A0);
      if(flamVal>=200){
          digitalWrite(beep,HIGH);
  
    }
    else{
      digitalWrite(beep,LOW);
    }
    int sensorValue;
    sensorValue=analogRead(sensorPin);
    Serial.print("fire_Value=:");
    Serial.println(sensorValue);
    Serial.println(sensorValue,DEC);
    Serial.println(sensorValue,BIN);
    Serial.println(sensorValue,HEX);
    delay(500);
}
void testProgram(){
      int i=0;
      for(i=1;i<=10;i++){
        digitalWrite(ledPin,HIGH);
        delay(200);
        digitalWrite(ledPin,LOW);
        delay(200);
      }
}

        步骤3:功能调试

5.4实验结果

        结论:本次实验结果为通过震动使其亮灯,然后蜂鸣器响。通过火焰触发中断事件,进行中断程序处理。中断处理程序实现火警警灯闪烁效果(红蓝交替闪烁),同时响起消防警报声。

        反思:首先,通过本次实验,我学到了一些新知识,熟悉了外部中断函数、自定义函数的功能,掌握了外部中断函数、自定义函数的使用,学会了中断函数的应用。其次,本次实验结果为通过震动使其亮灯,然后蜂鸣器响。通过火焰触发中断事件,进行中断程序处理。中断处理程序实现火警警灯闪烁效果(红蓝交替闪烁),同时响起消防警报声。最后,在实验中仍存在一些问题,仍需要继续努力。

        作品:

5.5思考题

1.外部中断函数与主程序中函数的调用有什么联系与区别?

2.外部事件触发中断函数可以有哪些场景应用?

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张小花-Soleil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值