主要由系统模块组成Arduino UNO R3开发板 MQ-2烟雾浓度传感器 火焰传感器 舵机 无源蜂鸣器 风扇 步进电机 WIFI模块 RGB三色LED灯 SIM900A所组成,MQ-当烟雾浓度传感器达到不同阈值时,LED灯会通过不同的颜色来进行警示。烟雾浓度增加,LED灯依次显示绿色、蓝色和红色,步进电机驱动风扇旋转不同档位的速度,蜂鸣器会发出警报。烟雾浓度超过最大阈值,或检测到火焰,红灯亮,蜂鸣器响,步进电机以最大速度驱动风扇旋转,SIM900A拨打指定用户。 因为模块有WiFi模块也可以连接WiFi通过APP控制步进电机的速度驱动,也可以手动控制风扇的速度。
一、设备准备
Arduino UNO R3Arduino UNO R3开发板 MQ-2烟雾浓度传感器 舵机 无源蜂鸣器 风扇 步进电机 WIFI模块 RGB三色LED灯 SIM900A所构成。MQ-2烟雾浓度传感器实时检测室内烟雾浓度值。如果超过阈值,风扇会旋转
WIFI模块 MQ-2烟雾浓度传感器 火焰传感器模块
舵机 无源蜂鸣器 风扇 RGB三色LED灯
步进电机 SIM900A
二、设备连接
烟雾浓度传感器
| 烟雾浓度传感器 | Arduino UNO R3 |
|---|---|
| VCC | 5V |
| GND | GND |
| DO | P7 |
| AO | A0 |
火焰传感器
| 火焰传感器 | Arduino UNO R3 |
|---|---|
| DO | P2 |
| GND | GND |
| VCC | 5V |
无源蜂鸣器
| 无源蜂鸣器 | Arduino UNO R3 |
|---|---|
| GND | GND |
| I/O | P8 |
| VCC | 5V |
三色LED灯
| 三色LED灯 | Arduino UNO R3 |
|---|---|
| R | P11 |
| G | P12 |
| B | P13 |
| GND | GND |
步进电机
| 步进电机 | Arduino UNO R3 |
|---|---|
| IN3 | P9 |
| IN4 | P4 |
| 5V | |
| - | GND |
风扇
| 风扇 | 步进电机 |
|---|---|
| 红线 | B灯处 |
| 黑线 | C灯处 |
WIFI模块(局域模式)
| WIFI模块 | Arduino UNO R3 |
|---|---|
| RX | TX |
| TX | RX |
| GND | GND |
| 5V | 5V |
SIM900A模块
| SIM900A | Arduino UNO R3 |
|---|---|
| 5VR | TX |
| 5VT | RX |
| GND | GND |
| VCC5 | 5V |
| GND | GND |
舵机模块
| 舵机 | Arduino UNO R3 |
|---|---|
| 黄线 | P6 |
| 灰线 | GND |
| 红线 | 5V |
三、网络配置
下载代码Arduino UNO R3开发板上 WIFI当打开手机时,需要将模块调整到局域模式wifi可以检测到热点WiFi连接由模块组成的网络。 APP下载路径,打开下载安装的手机APP 然后单击右上角的连接 连接成功后,可点击 锁(49),加速,减速,蜂鸣器开(50),蜂鸣器关(51) 控制舵机、蜂鸣器和风扇。
四、完整代码
/****************************************************** * connection: * MQ-2 gas sensor Uno R3 * D0 7 * A0 A0 * GND GND * VCC 5V * * * Dual-color LED Arduin Uno R3 * R 11 * G 12 * B 13 * GND GND * * * buzzerPin 8 * GND GND * VCC 5V * * * motorIn1 = 9; * motorIn2 = 10; * *******************************************************/ include <Servo.h> //Arduino IDE自带的舵机库文件
const int Servo_Pin = 6; //模拟开门
Servo myservo; //定义舵机对象myservo
const int digitalInPin = 2; //D0 attach to digital 2
const int analogPin=A0; //the DO on the Module attach to Pin7 on the SunFounder
const int digitalPin=7; //the D0 attach to pin7
int Astate=0;
boolean Dstate=0;
int redPin = 11; // select the pin for the red LED
int greenPin = 12;
int bluePin = 13;
int buzzerPin = 8;//the pin of the active buzzer attach to pin8
int comdata;
const int motorIn1 = 9;
const int motorIn2 = 4;
#define rank1 150
#define rank2 200
#define rank3 250
void set_tele(void)
{
Serial.begin(115200); //波特率为115200
delay(1000);
Serial.println("AT\r\n"); //判断模块是否正常
delay(1000);
}
void tele(void)
{
Serial.println("AT+CPIN?\r\n");
delay(1000);
Serial.println("AT+CSQ\r\n");
delay(3000);
Serial.print("AT+CREG?\r\n");
delay(3000);
Serial.println("AT+CGATT?\r\n");
delay(1000);
Serial.println("ATD15336551683;\r\n");
delay(30000);
}
void setup()
{
pinMode(digitalInPin,INPUT);
//set the pins state
pinMode (digitalPin,INPUT);
pinMode(redPin, OUTPUT); //set redPin as OUTPUT
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(buzzerPin,OUTPUT);//set the buzzer as as OUTPUT
digitalWrite(buzzerPin,LOW);//initialize the buzzerPin as LOW level
pinMode(motorIn1,OUTPUT);
pinMode(motorIn2,OUTPUT);
pinMode(Servo_Pin, OUTPUT); //初始化舵机为输出模式
myservo.attach(Servo_Pin); //设置舵机控制引脚为6
myservo.write(0); //初始化舵机位置0
set_tele();
Serial.begin(9600);
}
void loop()
{
boolean stat = digitalRead(digitalInPin);
Serial.print("D0: ");
Serial.println(stat); // print to serial monitor
Serial.println(" ");
Astate=analogRead(analogPin);//read the value of A0
Serial.println(Astate); //peint
if( stat == LOW)
{
analogWrite(motorIn1,0);
analogWrite(motorIn2,rank3);
analogWrite(redPin, 255); //red
analogWrite(greenPin, 0);
analogWrite(bluePin, 0);
//digitalWrite(buzzerPin,LOW);
myservo.write(90); //舵机旋转至90度
delay(5000); // 延时3000ms
myservo.write(0);//舵机旋转至0度
delay(1000); // 延时3000ms
for(int i = 200;i <= 500;i++) //frequence loop from 200 to 800
{
tone(8,i); //in pin7 generate a tone,it frequence is i
delay(2); //wait for 5 milliseconds
}
delay(1000); //wait for 4 seconds on highest frequence
for(int i = 500;i >= 200;i--) //frequence loop from 800 downto 200
{
tone(8,i); //in pin7 generate a tone,it frequence is i
delay(2); //delay 10ms
}
tele();
}
if((Astate>120 && Astate<150))
{
analogWrite(motorIn1,0);
analogWrite(motorIn2,rank1);
analogWrite(redPin, 0); //red
analogWrite(greenPin, 255);
analogWrite(bluePin, 0);
//digitalWrite(buzzerPin,LOW);
myservo.write(90); //舵机旋转至90度
delay(5000); // 延时3000ms
myservo.write(0);//舵机旋转至0度
delay(1000); // 延时3000ms
for(int i = 200;i <= 500;i++) //frequence loop from 200 to 800
{
tone(8,i); //in pin7 generate a tone,it frequence is i
delay(10); //wait for 5 milliseconds
}
delay(4000); //wait for 4 seconds on highest frequence
for(int i = 500;i >= 200;i--) //frequence loop from 800 downto 200
{
tone(8,i); //in pin7 generate a tone,it frequence is i
delay(10); //delay 10ms
}
}
else if((Astate>=150 && Astate<200))
{
analogWrite(motorIn1,0);
analogWrite(motorIn2,rank2);
analogWrite(redPin, 0); //red
analogWrite(greenPin, 0);
analogWrite(bluePin, 255);
//digitalWrite(buzzerPin,LOW);
myservo.write(90); //舵机旋转至90度
delay(5000); // 延时3000ms
myservo.write(0);//舵机旋转至0度
delay(1000); // 延时3000ms
for(int i = 200;i <= 500;i++) //frequence loop from 200 to 800
{
tone(8,i); //in pin7 generate a tone,it frequence is i
delay(5); //wait for 5 milliseconds
}
delay(2000); //wait for 4 seconds on highest frequence
for(int i = 500;i >= 200;i--) //frequence loop from 800 downto 200
{
tone(8,i); //in pin7 generate a tone,it frequence is i
delay(5); //delay 10ms
}
}
else if((Astate>=200))
{
analogWrite(motorIn1,0);
analogWrite(motorIn2,rank3);
analogWrite(redPin, 255); //red
analogWrite(greenPin, 0);
analogWrite(bluePin, 0);
//digitalWrite(buzzerPin,LOW);
myservo.write(90); //舵机旋转至90度
delay(5000); // 延时3000ms
myservo.write(0);//舵机旋转至0度
delay(1000); // 延时3000ms
for(int i = 200;i <= 500;i++) //frequence loop from 200 to 800
{
tone(8,i); //in pin7 generate a tone,it frequence is i
delay(2); //wait for 5 milliseconds
}
delay(1000); //wait for 4 seconds on highest frequence
for(int i = 500;i >= 200;i--) //frequence loop from 800 downto 200
{
tone(8,i); //in pin7 generate a tone,it frequence is i
delay(2); //delay 10ms
}
tele();
/* Serial.print("AT+CMGD=1"); Serial.print("\r\n"); Serial.print("AT"); Serial.print("\r\n"); Serial.print("AT+CPIN?"); Serial.print("\r\n"); Serial.print("AT+CSQ"); Serial.print("\r\n"); Serial.print("AT+CREG?"); Serial.print("\r\n"); Serial.print("AT+CGATT?"); Serial.print("\r\n"); Serial.print("ATD15336551683;"); Serial.print("\r\n"); */
}
else
{
analogWrite(redPin, 0); //red
analogWrite(greenPin, 0);
analogWrite(bluePin, 0);
//digitalWrite(buzzerPin,HIGH);
pinMode(buzzerPin,INPUT);
pinMode(motorIn1,0);
pinMode(motorIn2,0);
}
delay(200);//delay 200ms
while (Serial.available())
{
comdata= Serial.read();
if(comdata==49)
{
Serial.print("open the door\n");
myservo.write(90); //舵机旋转至90度
delay(1000); // 延时3000ms
myservo.write(0);//舵机旋转至0度
delay(1000); // 延时3000ms
}
if(comdata==50)
{
Serial.print("open fmq\n");
for(int i = 200;i <= 500;i++) //frequence loop from 200 to 800
{
tone(8,i); //in pin7 generate a tone,it frequence is i
delay(5); //wait for 5 milliseconds
}
delay(4000); //wait for 4 seconds on highest frequence
for(int i = 500;i >= 200;i--) //frequence loop from 800 downto 200
{
tone(8,i); //in pin7 generate a tone,it frequence is i
delay(10); //delay 10ms
}
delay(100);
}
if(comdata==51)
{
Serial.print("close fmq\n");
pinMode(buzzerPin,INPUT);
delay(100);
}
if(comdata==52)
{
Serial.print("111\n");
analogWrite(motorIn1,0);
analogWrite(motorIn2,rank1);
delay(100);
}
if(comdata==74)
{
Serial.print("222\n");
analogWrite(motorIn1,0);
analogWrite(motorIn2,rank2);
delay(100);
}
if(comdata==54)
{
Serial.print("333\n");
analogWrite(motorIn1,0);
analogWrite(motorIn2,rank3);
delay(100);
}
}
}
五、演示视频
B站演示视频 CSDN演示视频