萌新Arduino 火焰检测保姆级教程

1.前言

这个实验教程献给所有大一想努力的新手

2.欣赏成果

Arduino 火焰检测 成果(1/2)

Arduino 外部中断火焰检测成果

3.安装对应软件

首先先安装对应软件Arduino

网址arduino.cc/en/software

4.学习软件的使用

安装结束,我们进入首页选择我们对应的开发板Arduino UNO

在这里插入图片描述
选择之后就会将UNO开发板作为默认**(UNO开发板适合初学者简单易上手)**
在这里插入图片描述
并将开发板连接到电脑**(注意:后面一定带有后缀,我前面买的盗版无法识别就没有后缀)**

如果没有出现开发板(com)请检查链接器是否连接好或者开发板是否接触不良。

5.知识准备

#define NOTE_ALARM 1047 是定义一个 NOTE_ALARM为1047的频率
可以用#define定义一个标识符来表示一个常量。其特点是:定 义的标识符不占内存,只是一个临时的符号,预编译后的这个符 号就不存在了。 #define又称宏定义,标识符为所定义的宏名,简称宏。宏名表 示的是一个常量,可以给变量赋值

Serial.begin(9600);设置波特率与电脑的保持一致(9600)

delay(500);是将灯泡延迟500毫秒

noTone(buzzerPin);是是当电流到达引脚3的时候停止(const int buzzerPin = 3; )

pinMode(2, OUTPUT)是通过pinMode()函数,你可以将Arduino的引脚配置为以下三种模式:
输出(OUTPUT)模式
输入(INPUT)模式
输入上拉(INPUT_PULLUP)模式

if …else是询问一个函数是否符合if里的内容,如果不符合将执行else的内容

文章应用了函数传参的方法void LED(int pin,int state)赋值了(pin和state)两个形参
详细可以看这个文章https://junshuai.blog.youkuaiyun.com/article/details/102208507?fromshare=blogdetail&sharetype=blogdetail&sharerId=102208507&sharerefer=PC&sharesource=stm_fox&sharefrom=from_link

6.准备道具

Arduino Uno控制器
1个LED
1个220 欧姆电阻
1个面包版
1个火焰传感器

在这里插入图片描述

7.代码

#define NOTE_ALARM 1047 // 警报音
#define FlAME_VALUE 0
// 定义引脚
int sensorValue = 1; //传感器读取结果0表示检测到火灾,传感器读取结果1表示没有火灾。
const int FlameSensorPin = 13; //火焰传感器连接引脚13
const int buzzerPin = 3; //蜂鸣器模块连接引脚3
const int LED_PIN = 8;//函数声明
void playNote(int frequency, int duration);
void FlameAlarm();
void NoAlarm();
void LED(int pin,int state);
void setup() {
// 初始化串口通信
Serial.begin(9600);
pinMode(FlameSensorPin, INPUT);
pinMode(buzzerPin,OUTPUT);
digitalWrite(buzzerPin,HIGH);
pinMode(LED_PIN, OUTPUT);
LED(LED_PIN,LOW);
Serial.println("火焰传感器初始化完成!");
Serial.println("---------------------");
} 
void loop() {
// 读取传感器值
sensorValue = digitalRead(FlameSensorPin);
if(sensorValue == FlAME_VALUE)
{
FlameAlarm();
LED(LED_PIN,HIGH);
} else
{NoAlarm();
LED(LED_PIN,LOW);
} // 短暂延时
delay(500);
} 
void LED(int pin,int state)
{
digitalWrite(pin, state);
} 
void NoAlarm()
{
digitalWrite(buzzerPin, HIGH);
Serial.println("没有检测到火灾");
} 
void FlameAlarm() {
Serial.println("检测到火灾");
playNote(NOTE_ALARM, 300);
playNote(NOTE_ALARM, 300);
noTone(buzzerPin);
} 
// 基础工具函数:播放指定音符
// 参数:frequency - 频率,duration - 持续时间(毫秒)1.4. 程序说明
void playNote(int frequency, int duration) {
tone(buzzerPin, frequency);
delay(duration);
}

接下验证 ,左上角的勾是验证符号

在这里插入图片描述

查看是否验证成功,然后上传

在这里插入图片描述

上传成功就可以欣赏到开头的结果了

8.进阶版实验Arduino 外部中断火焰检测

准备阶段

– Arduino Uno控制器
– 1个LED
– 1个220 欧姆电阻
– 1个面包版
– 1个火焰传感器
-1个有源蜂鸣器
在这里插入图片描述
其他与上图一致

进阶版代码

const int FLAME_PIN = 2; // 传感器引脚(中断0)
const int BUZZER_PIN = 3; // 蜂鸣器引脚(低电平触发)
const int LED_PIN = 8;
bool fireDetected = false;
void FlameAlarm(int buzzer_pin,int state);
void LED(int pin,int state);void setup() {
// 引脚初始化
pinMode(FLAME_PIN, INPUT_PULLUP);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, HIGH); // 初始高电平,蜂鸣器关闭
LED(LED_PIN,LOW);
// 设置中断
attachInterrupt(digitalPinToInterrupt(FLAME_PIN)
, fireAlert, FALLING);
Serial.begin(9600);
Serial.println("低电平触发蜂鸣器报警系统就绪");
}
void fireAlert() {
fireDetected = true;
} 
void loop() {
if (fireDetected) {
// 确认火焰状态
if (digitalRead(FLAME_PIN) == LOW) {
// 触发报警 - 输出低电平
FlameAlarm(BUZZER_PIN, LOW);
LED(LED_PIN,HIGH);
// 等待火焰消失
while (digitalRead(FLAME_PIN) == LOW) {
delay(100);} 

FlameAlarm(BUZZER_PIN, HIGH);
LED(LED_PIN,LOW);
} fireDetected = false;
} delay(100);
} void LED(int pin,int state)
{
digitalWrite(pin, state);
} 
void FlameAlarm(int buzzer_pin,int state) {
digitalWrite(buzzer_pin, state);
if(state == HIGH)
{
Serial.println("报警!检测到火焰!蜂鸣器低电平触发");
} else
{
Serial.println("火焰消失,蜂鸣器高电平关闭");
}
}

代码注释

while (digitalRead(FLAME_PIN) == LOW) {
delay(100);}
是判断当条件满足时就执行delay(100)延迟100毫秒

其余在上面知识储备有解答

接下来就可以欣赏成果了

9.心得

我认为这是个新的开始我也遇到了很多问题(见下面),但是当我成功做出来了后感到非常自豪,所以我认为在这个时代人类要不断走出自己的舒适圈,才能前进,如果觉得有帮助就请点一下赞,我火速更新下一章,我是FOX,励志做一个博学的萌新。

10.花絮

我第一次做甚至把蜂鸣器的连线接错了,接地和VCC接反的,导致我感应到火灾,但是却蜂鸣器并没有响噢,所以一定要检查好,慢一点

问题一:这个LED(int pin, int state)函数为什么要使用参数传递,而不是直接操作全局变量?

解答:因为使用参数传参可以使函数更加灵活,而全局变量虽然方便但是并没有这么灵活

问题二:设计一个专门的BuzzerControl函数模块,包含:

void initBuzzer() - 初始化蜂鸣器
void playAlarm() - 播放警报音
void stopBuzzer() - 停止蜂鸣器

我将用

if (a == 1) {
    initBuzzer();
  } 
  else if (a == 2) {
    playAlarm();
  } 
  else if (a == 3) {
    stopBuzzer();
  }

判断封装

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值