本次实验我们采用红外线检测模块检测火焰(模拟燃烧),并将检测信号发送到Arduino中,Arduino接收到信号之后,控制一个红色LED灯闪烁报警,并通过蜂鸣器发出报警声音。
一、功能说明
当红外线检测模块检测到燃烧火焰时,红色LED灯闪烁报警,蜂鸣器发出报警声音。
第六课 制作火焰检测报警器 - 图1
二、所需器材
Arduino控制主板、红外线检测模块、红色LED灯模块、蜂鸣器模块。
三、电路设计及端口分配
红外线检测模块使用模拟量输入,从模拟端口A0输入,红色LED灯模块和蜂鸣器模块分别通过数字端口9、10脚输出。
第六课 制作火焰检测报警器 - 图2
电路框图
四、程序流程图
图片1.png
五、程序编写

  1. //定义变量,设置端口输入输出模式
  2. int huoyanPin = 0;
  3. int ledPin = 9;
  4. int fengmingPin = 10;
  5. void setup()
  6. {
  7. pinMode(ledPin,OUTPUT);
  8. pinMode(fengmingPin,OUTPUT);
  9. pinMode(huoyanPin,INPUT);
  10. }
  11. //根据控制过程编写主函数
  12. void loop()
  13. {
  14. int huoyanSJ = analogRead(huoyanPin);
  15. huoyanSJ = huoyanSJ/4;
  16. if(huoyanSJ >= 200)
  17. {
  18. digitalWrite(ledPin,HIGH);
  19. tone(fengmingPin,800);
  20. delay(1000);
  21. digitalWrite(ledPin,LOW);
  22. noTone(fengmingPin);
  23. delay(1000);
  24. }
  25. }

下载程序,观察效果
六、重要函数语法
1.tone()
tone()函数可以产生固定频率的PWM信号来驱动扬声器发声。发声时间长度和声调都可以通过参数控制。定义发声时间长度有两种方法,第一种是通过tone()函数的参数来定义发声时长,另一种是使用noTone()函数来停止发声。如果您在使用tone()函数时没有定义发声时间长度,那么除非您通过noTone()函数来停止声音,否则Arduino将会一直通过tone()函数产生声音信号。
Arduino一次只能产生一个声音。假如Arduino的某一个引脚正在通过tone()函数产生发声信号,那么此时让Arduino使用另外一个引脚通过tone()函数发声是不行的。

语法

tone(pin, frequency)
tone(pin, frequency, duration)

参数

pin: 发声引脚(该引脚需要连接扬声器)
frequency: 发声频率(单位:赫兹) – 无符号整数型
duration: 发声时长(单位:微秒,此参数为可选参数) – 无符号长整型

返回值


示例

  1. /*
  2. 多音调发声 在Arduino的不同引脚产生不同的声音
  3. 电路连接:
  4. * 在引脚 6, 7, 8分别连接8欧姆扬声器
  5. */
  6. void setup() {
  7. }
  8. void loop() {
  9. noTone(8); //停止8号引脚发声
  10. tone(6, 440, 200); //6号引脚发声200毫秒
  11. delay(200);
  12. noTone(6); //停止6号引脚发声
  13. tone(7, 494, 500); //7号引脚发声500毫秒
  14. delay(500);
  15. noTone(7); //停止7号引脚发声
  16. tone(8, 523, 300); //8号引脚发声300毫秒
  17. delay(300);
  18. }

六、思考拓展
1.常见的火宅报警器除了可以自动检测火焰触发报警外,还可以通过人按动按钮进行报警,请思考任何实现该功能。
第六课 制作火焰检测报警器 - 图4
编写控制程序如下:

  1. int huoyanPin = 0;
  2. int ledPin = 9;
  3. int fengmingPin = 10;
  4. int kaiguanPin =8;
  5. void setup()
  6. {
  7. pinMode(ledPin,OUTPUT);
  8. pinMode(fengmingPin,OUTPUT);
  9. pinMode(huoyanPin,INPUT);
  10. pinMode(kaiguanPin,INPUT);
  11. }
  12. //根据控制过程编写主函数
  13. void loop()
  14. {
  15. int huoyanSJ = analogRead(huoyanPin);
  16. int kaiguanSJ = digitalWrite(kaiguanPin);
  17. huoyanSJ = huoyanSJ/4;
  18. if((huoyanSJ >= 200)||(kaiguanSJ == 1))
  19. {
  20. digitalWrite(ledPin,HIGH);
  21. tone(fengmingPin,800);
  22. delay(1000);
  23. digitalWrite(ledPin,LOW);
  24. noTone(fengmingPin);
  25. delay(1000);
  26. }
  27. }

2.如果火宅报警器被误触发,如检测到生活用火,请问如何避免这种情况。