該系統模塊主要由Arduino UNO R3開發板+MQ-2煙霧濃度傳感器+火焰傳感器+舵機+無源蜂鳴器+風扇+步進電機+WIFI模塊+RGB三色LED燈+SIM900A所組成,MQ-2煙霧濃度傳感器達到不同的閾值的時候,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; //定義舵機對象myservoconst int digitalInPin = 2; //D0 attach to digital 2const 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 250void set_tele(void)
{Serial.begin(115200); //波特率為115200delay(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 OUTPUTpinMode(greenPin, OUTPUT);pinMode(bluePin, OUTPUT);pinMode(buzzerPin,OUTPUT);//set the buzzer as as OUTPUTdigitalWrite(buzzerPin,LOW);//initialize the buzzerPin as LOW levelpinMode(motorIn1,OUTPUT);pinMode(motorIn2,OUTPUT);pinMode(Servo_Pin, OUTPUT); //初始化舵機為輸出模式myservo.attach(Servo_Pin); //設置舵機控制引腳為6myservo.write(0); //初始化舵機位置0set_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 A0Serial.println(Astate); //peint if( stat == LOW){analogWrite(motorIn1,0);analogWrite(motorIn2,rank3);analogWrite(redPin, 255); //redanalogWrite(greenPin, 0);analogWrite(bluePin, 0);//digitalWrite(buzzerPin,LOW);myservo.write(90); //舵機旋轉至90度delay(5000); // 延時3000msmyservo.write(0);//舵機旋轉至0度delay(1000); // 延時3000msfor(int i = 200;i <= 500;i++) //frequence loop from 200 to 800{tone(8,i); //in pin7 generate a tone,it frequence is idelay(2); //wait for 5 milliseconds }delay(1000); //wait for 4 seconds on highest frequencefor(int i = 500;i >= 200;i--) //frequence loop from 800 downto 200{tone(8,i); //in pin7 generate a tone,it frequence is idelay(2); //delay 10ms}tele();}if((Astate>120 && Astate<150)){analogWrite(motorIn1,0);analogWrite(motorIn2,rank1);analogWrite(redPin, 0); //redanalogWrite(greenPin, 255);analogWrite(bluePin, 0);//digitalWrite(buzzerPin,LOW);myservo.write(90); //舵機旋轉至90度delay(5000); // 延時3000msmyservo.write(0);//舵機旋轉至0度delay(1000); // 延時3000msfor(int i = 200;i <= 500;i++) //frequence loop from 200 to 800{tone(8,i); //in pin7 generate a tone,it frequence is idelay(10); //wait for 5 milliseconds }delay(4000); //wait for 4 seconds on highest frequencefor(int i = 500;i >= 200;i--) //frequence loop from 800 downto 200{tone(8,i); //in pin7 generate a tone,it frequence is idelay(10); //delay 10ms}}else if((Astate>=150 && Astate<200)){analogWrite(motorIn1,0);analogWrite(motorIn2,rank2);analogWrite(redPin, 0); //redanalogWrite(greenPin, 0);analogWrite(bluePin, 255);//digitalWrite(buzzerPin,LOW);myservo.write(90); //舵機旋轉至90度delay(5000); // 延時3000msmyservo.write(0);//舵機旋轉至0度delay(1000); // 延時3000msfor(int i = 200;i <= 500;i++) //frequence loop from 200 to 800{tone(8,i); //in pin7 generate a tone,it frequence is idelay(5); //wait for 5 milliseconds }delay(2000); //wait for 4 seconds on highest frequencefor(int i = 500;i >= 200;i--) //frequence loop from 800 downto 200{tone(8,i); //in pin7 generate a tone,it frequence is idelay(5); //delay 10ms}}else if((Astate>=200)){analogWrite(motorIn1,0);analogWrite(motorIn2,rank3);analogWrite(redPin, 255); //redanalogWrite(greenPin, 0);analogWrite(bluePin, 0);//digitalWrite(buzzerPin,LOW);myservo.write(90); //舵機旋轉至90度delay(5000); // 延時3000msmyservo.write(0);//舵機旋轉至0度delay(1000); // 延時3000msfor(int i = 200;i <= 500;i++) //frequence loop from 200 to 800{tone(8,i); //in pin7 generate a tone,it frequence is idelay(2); //wait for 5 milliseconds }delay(1000); //wait for 4 seconds on highest frequencefor(int i = 500;i >= 200;i--) //frequence loop from 800 downto 200{tone(8,i); //in pin7 generate a tone,it frequence is idelay(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); //redanalogWrite(greenPin, 0);analogWrite(bluePin, 0);//digitalWrite(buzzerPin,HIGH);pinMode(buzzerPin,INPUT);pinMode(motorIn1,0);pinMode(motorIn2,0);}delay(200);//delay 200mswhile (Serial.available()){comdata= Serial.read();if(comdata==49){Serial.print("open the door\n");myservo.write(90); //舵機旋轉至90度delay(1000); // 延時3000msmyservo.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 idelay(5); //wait for 5 milliseconds }delay(4000); //wait for 4 seconds on highest frequencefor(int i = 500;i >= 200;i--) //frequence loop from 800 downto 200{tone(8,i); //in pin7 generate a tone,it frequence is idelay(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演示視頻