出于對arduino的熱愛 ,本人在課外閑暇之余做了一個基于arduino的遠程報警系統,可以實現將危險信息遠程發送給手機,起到安全監控的作用,算是一個小白設計,還請多多指點。 主要功能有
1.氣體檢測與溫濕度檢測功能2.數據實時傳輸功能 3.GPS定位功能 代碼如下 接線就不一點點說了 根據代碼定義的IO接即可。
11.jpg (37.81 KB, 下載次數: 68)
下載附件
2018-8-12 07:36 上傳
- #include<Arduino.h>
- #include <dht11.h>
- #include <SoftwareSerial.h>
- #include <Servo.h>
- Servo myservo;
- SoftwareSerial mySerial(10, 11); // RX, TX
- char nmeaSentence[68];
- String latitude; //緯度
- String longitude; //經度
- String beiJingTime; //北京時間
- String gpsTime;
- dht11 DHT11;
- #define DHT11PIN 8
- #define Sensor A5
- #define LED 13
- #define Sensor_DO 2
- #define GPSSerial Serial
- #define ADpin A0
- #define pwmPin 6
- unsigned int SensorValue = 0;
- int ADBuffer = 0;
- void SendMessage()
- {
- mySerial.print("AT+CSCS=\"GSM\"\r\n");
- delay(1000);
- mySerial.print("AT+CMGF=1\r\n");
- delay(1000);
-
- mySerial.print("AT+CMGS=\"000000000\"\r\n");//此處為接受信息的手機
- delay(1000);
- mySerial.print("SensorValue:"); //短信內容 6C14 4F53 6D53 5EA6
- mySerial.println(SensorValue);
- mySerial.print("Humidity (%): "); //6E7F 5EA6
- mySerial.println((float)DHT11.humidity, 2);
- mySerial.print("Temperature (oC): ");//6E29 5EA6
- mySerial.println((float)DHT11.temperature, 2);
- mySerial.print("latitude:"); //7ECF 5EA6
- mySerial.println(latitude);
- mySerial.print("longitude: " ); //7EAC 5EA6
- mySerial.println(longitude);
- mySerial.print("beiJingTime: "); //5317 4EAC 65F6 95F4
- mySerial.println(beiJingTime);
- delay(1000);
- mySerial.write(0x1A);
- delay(2000);
- }
- void humiture()
- {
- int chk = DHT11.read(DHT11PIN);
- Serial.print("Read sensor: ");
- switch (chk)
- {
- case DHTLIB_OK:
- Serial.println("OK");
- break;
- case DHTLIB_ERROR_CHECKSUM:
- Serial.println("Checksum error");
- break;
- case DHTLIB_ERROR_TIMEOUT:
- Serial.println("Time out error");
- break;
- default:
- Serial.println("Unknown error");
- break;
- }
- /* Serial.print("Humidity (%): ");
- Serial.println((float)DHT11.humidity, 2);
- Serial.print("Temperature (oC): ");
- Serial.println((float)DHT11.temperature, 2);
- delay(2000);*/
- }
- void Gas()
- {
- pinMode(Sensor_DO,INPUT);
- pinMode(Sensor,INPUT);
- Serial.begin(9600);
-
- SensorValue=analogRead(Sensor);
- SensorValue = 10*SensorValue;
- Serial.print("SensorValue: ");
- Serial.println(SensorValue);
- }
- void Ring()
- {
- mySerial.begin(9600);
- mySerial.print("ATD13573278960;\r\n");//可從此條語句修改需要更換的手機號
- delay(1000);
- }
- void GPS()
- {
- GPSSerial.begin(9600); //定義波特率9600
- for (unsigned long start = millis(); millis() - start < 1000;) //一秒鐘內不停掃描GPS信息
- {
- while (GPSSerial.available()) //串口獲取到數據開始解析
- {
- char c = GPSSerial.read(); //讀取一個字節獲取的數據
- switch(c) //判斷該字節的值
- {
- case ' : //若是$,則說明是一幀數據的開始
- GPSSerial.readBytesUntil('*', nmeaSentence, 67); //讀取接下來的數據,存放在nmeaSentence字符數組中,最大存放67個字節
- //Serial.println(nmeaSentence);
- latitude = parseGprmcLat(nmeaSentence); //獲取緯度值
- latitude.substring(6);
- longitude = parseGprmcLon(nmeaSentence);//獲取經度值
- gpsTime = parseGprmcTime(nmeaSentence);//獲取GPS時間
- if(latitude > "") //當不是空時候打印輸出
- {
- GPSSerial.println("------------------------------------");
- GPSSerial.println("latitude: " + latitude);
- }
- if(longitude > "") //當不是空時候打印輸出
- {
- GPSSerial.println("longitude: " + longitude);
- }
- if(gpsTime > "") //當不是空時候打印輸出
- {
- beiJingTime = getBeiJingTime(gpsTime); //獲取北京時間
- GPSSerial.println("beiJingTime: " + beiJingTime);
- }
- }
- }
- }
- }
- String getBeiJingTime(String s)
- {
- int hour = s.substring(0,2).toInt();
- int minute = s.substring(2,4).toInt();
- int second = s.substring(4,6).toInt();
- hour += 8;
- if(hour > 24)
- hour -= 24;
- s = String(hour) +":"+String(minute) +":"+ String(second);
- return s;
- }
- String parseGprmcLat(String s)
- {
- int pLoc = 0; //paramater location pointer 參數位置指針
- int lEndLoc = 0; //lat parameter end location LAT參數結束位置
- int dEndLoc = 0; //direction parameter end location 方向參數終點位置
- String lat;
- if(s.substring(0,4) == "GPRM")
- {
- //Serial.println(s);
- for(int i = 0; i < 5; i++)
- {
- if(i < 3)
- {
- pLoc = s.indexOf(',', pLoc+1);
- }
- if(i == 3)
- {
- lEndLoc = s.indexOf(',', pLoc+1);
- lat = s.substring(pLoc+1, lEndLoc);
- }
- else
- {
- dEndLoc = s.indexOf(',', lEndLoc+1);
- lat = lat + " " + s.substring(lEndLoc+1, dEndLoc);
- }
- }
- return lat;
- }
- }
- String parseGprmcLon(String s)
- {
- int pLoc = 0; //paramater location pointer
- int lEndLoc = 0; //lat parameter end location
- int dEndLoc = 0; //direction parameter end location
- String lon;
-
- if(s.substring(0,4) == "GPRM")
- {
- //Serial.println(s);
- for(int i = 0; i < 7; i++)
- {
- if(i < 5)
- {
- pLoc = s.indexOf(',', pLoc+1);
- }
- if(i == 5)
- {
- lEndLoc = s.indexOf(',', pLoc+1);
- lon = s.substring(pLoc+1, lEndLoc);
- }
- else
- {
- dEndLoc = s.indexOf(',', lEndLoc+1);
- lon = lon + " " + s.substring(lEndLoc+1, dEndLoc);
- }
- }
- return lon;
- }
- }
- String parseGprmcTime(String s)
- {
- int pLoc = 0; //paramater location pointer
- int lEndLoc = 0; //lat parameter end location
- int dEndLoc = 0; //direction parameter end location
- String gpsTime;
- if(s.substring(0,4) == "GPRM")
- {
- //Serial.println(s);
- for(int i = 0; i < 2; i++)
- {
- if(i < 1)
- {
- pLoc = s.indexOf(',', pLoc+1);
- }
- else
- {
- lEndLoc = s.indexOf(',', pLoc+1);
- gpsTime = s.substring(pLoc+1, lEndLoc);
- }
- }
- return gpsTime;
- }
- }
- // Turn char[] array into String object
- String charToString(char *c)
- {
- String val = "";
- for(int i = 0; i <= sizeof(c); i++)
- {
- val = val + c[i];
- }
- return val;
- }
-
- void Buzzer()
- {
- pinMode(4,OUTPUT);
- digitalWrite(4,HIGH);
- // delay(3000);
- // fengmingqioff();
- }
- void Buzzeroff()
- {
- pinMode(4,OUTPUT);
- digitalWrite(4,LOW);
- }
- void fire()
- {
- Serial.println(analogRead(A0));//串口發送模擬電壓值
- ADBuffer = analogRead(ADpin); //讀AD值
- Serial.print("AD = ");
- Serial.println(ADBuffer);
- }
- void setup() {
- // put your setup code here, to run once:
- Serial.begin(9600);
- while (!Serial) {
- ; // wait for serial port to connect. Needed for native USB port only
- }
- mySerial.begin(4800);
- }
- void loop() {
- GPS();
- Gas();
- humiture();
- fire();
- delay(1000);
- if(SensorValue>800||DHT11.temperature>45||ADBuffer < 10)
- {
- Buzzer();
- Ring();
- SendMessage();
- GPS();
- }
- else
- {
- Buzzeroff();
- }
- }
復制代碼
|