通過gps顯示經緯度,并用sr04超聲波測距,設置閾值報警
arduino源程序如下:
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- //設置LCD1602的I2C地址為0x27,LCD1602為兩行,每行16個字符的液晶顯示器
- LiquidCrystal_I2C lcd(0x27,16,2);
- const int TrigPin = 2;
- const int EchoPin = 3;
- float distance;
- float lati;
- #include <SoftwareSerial.h>
- char nmeaSentence[68];
- String latitude; //緯度
- String longitude; //經度
- String lndSpeed; //速度
- String gpsTime; //UTC時間,本初子午線經度0度的時間,和北京時間差8小時
- String beiJingTime; //北京時間
- SoftwareSerial GPSSerial(12, 11 ); // RX, TX
- #define DEBUGSerial Serial
- //初始化程序
- void setup() {
- //LCD的I2C通訊初始化需要執行兩次
- lcd.init(); // 給LCD的I2C通訊初始化
- delay(20);
- lcd.init(); // 給LCD的I2C通訊初始化
- delay(20);
- lcd.backlight();//點亮LCD背光燈
- // 初始化串口通信及連接SR04的引腳
- Serial.begin(9600);
- pinMode(TrigPin, OUTPUT);
- // 要檢測引腳上輸入的脈沖寬度,需要先設置為輸入狀態
- pinMode(EchoPin, INPUT);
- pinMode(8,OUTPUT);
- GPSSerial.begin(9600); //定義波特率9600,和我們店鋪的GPS模塊輸出的波特率一致
- DEBUGSerial.begin(9600);
- DEBUGSerial.println("GPS test");
- DEBUGSerial.println("Wating...");
- }
- //主程序
- void loop() {
- // 產生一個10us的高脈沖去觸發TrigPin
- digitalWrite(TrigPin, LOW);
- delayMicroseconds(2);
- digitalWrite(TrigPin, HIGH);
- delayMicroseconds(10);
- digitalWrite(TrigPin, LOW);
- // 檢測脈沖寬度,并計算出距離
- distance = pulseIn(EchoPin, HIGH) / 58.00;
- lcd.clear();//LCD清屏
- // 定位光標在LCD第0行、第0列
- lcd.setCursor(0, 0);
- //在LCD第0行第0列開始顯示"Distance:"
- lcd.print("Distance:");
- // 定位光標在LCD第1行、第8列
- lcd.setCursor(9, 0);
- //如果傳感器讀取值小于20,
- if(distance<20)
- {
- //則在LCD第1行、第8列開始顯示"danger"
- lcd.print("danger"); delay(500);//延時500ms
- }
- //如果傳感器讀取值大于20,
- else
- {
- //把浮點型距離值取整
- distance=int(distance);
- //則在LCD第1行、第7列開始顯示距離值
- lcd.print(distance);
- //在距離值后顯示單位"cm"
- lcd.print("cm");
- delay(500);//延時500ms
- lcd.setCursor(0, 1);
- Serial.println(distance);
- }
- if(distance>20)
- { digitalWrite(8, HIGH);//輸出HIGH電平,停止發聲
- delay(500); //等待500毫秒
-
- }
- else
- { digitalWrite(8, LOW);//輸出LOW電平,發聲
-
- }
- 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); //獲取緯度值
- longitude = parseGprmcLon(nmeaSentence);//獲取經度值
- lndSpeed = parseGprmcSpeed(nmeaSentence);//獲取速度值
- gpsTime = parseGprmcTime(nmeaSentence);//獲取GPS時間
- if(latitude > "") //當不是空時候打印輸出
- {
- DEBUGSerial.println("------------------------------------");
- DEBUGSerial.println("latitude: " + latitude);
-
-
- lcd.print(latitude);
- }
-
-
- if(longitude > "") //當不是空時候打印輸出
- {
- DEBUGSerial.println("longitude: " + longitude);
- }
- if(lndSpeed > "") //當不是空時候打印輸出
- {
- DEBUGSerial.println("Speed (knots): " + lndSpeed);
- }
- if(gpsTime > "") //當不是空時候打印輸出
- {
- DEBUGSerial.println("gpsTime: " + gpsTime);
- beiJingTime = getBeiJingTime(gpsTime); //獲取北京時間
- DEBUGSerial.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;
- }
- //Parse GPRMC NMEA sentence data from String
- //String must be GPRMC or no data will be parsed
- //Return Latitude
- String parseGprmcLat(String s)
- {
- int pLoc = 0; //paramater location pointer
- int lEndLoc = 0; //lat parameter end location
- int dEndLoc = 0; //direction parameter end location
- String lat;
- /*make sure that we are parsing the GPRMC string.
- Found that setting s.substring(0,5) == "GPRMC" caused a FALSE.
- There seemed to be a 0x0D and 0x00 character at the end. */
- if(s.substring(0,4) == "GPRM")
- {
- //Serial.println(s);
- for(int i = 0; i < 5; i++)
- {
- if(i < 3)
- {
- pLoc = s.indexOf(',', pLoc+1);
- /*Serial.print("i < 3, pLoc: ");
- Serial.print(pLoc);
- Serial.print(", ");
- Serial.println(i);*/
- }
- if(i == 3)
- {
- lEndLoc = s.indexOf(',', pLoc+1);
- lat = s.substring(pLoc+1, lEndLoc);
- /*Serial.print("i = 3, pLoc: ");
- Serial.println(pLoc);
- Serial.print("lEndLoc: ");
- Serial.println(lEndLoc);*/
- }
- else
- {
- dEndLoc = s.indexOf(',', lEndLoc+1);
- lat = lat + " " + s.substring(lEndLoc+1, dEndLoc);
- /*Serial.print("i = 4, lEndLoc: ");
- Serial.println(lEndLoc);
- Serial.print("dEndLoc: ");
- Serial.println(dEndLoc);*/
- }
- }
- return lat;
- }
- //}
- //}
- }
- //Parse GPRMC NMEA sentence data from String
- //String must be GPRMC or no data will be parsed
- //Return Longitude
- 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;
- /*make sure that we are parsing the GPRMC string.
- Found that setting s.substring(0,5) == "GPRMC" caused a FALSE.
- There seemed to be a 0x0D and 0x00 character at the end. */
- if(s.substring(0,4) == "GPRM")
- {
- //Serial.println(s);
- for(int i = 0; i < 7; i++)
- {
- if(i < 5)
- {
- pLoc = s.indexOf(',', pLoc+1);
- /*Serial.print("i < 3, pLoc: ");
- Serial.print(pLoc);
- Serial.print(", ");
- Serial.println(i);*/
- }
- if(i == 5)
- {
- lEndLoc = s.indexOf(',', pLoc+1);
- lon = s.substring(pLoc+1, lEndLoc);
- /*Serial.print("i = 3, pLoc: ");
- Serial.println(pLoc);
- Serial.print("lEndLoc: ");
- Serial.println(lEndLoc);*/
- }
- else
- {
- dEndLoc = s.indexOf(',', lEndLoc+1);
- lon = lon + " " + s.substring(lEndLoc+1, dEndLoc);
- /*Serial.print("i = 4, lEndLoc: ");
- Serial.println(lEndLoc);
- Serial.print("dEndLoc: ");
- Serial.println(dEndLoc);*/
- }
- }
- return lon;
- }
- }
- //Parse GPRMC NMEA sentence data from String
- //String must be GPRMC or no data will be parsed
- //Return Longitude
- String parseGprmcSpeed(String s)
- {
- int pLoc = 0; //paramater location pointer
- int lEndLoc = 0; //lat parameter end location
- int dEndLoc = 0; //direction parameter end location
- String lndSpeed;
- /*make sure that we are parsing the GPRMC string.
- Found that setting s.substring(0,5) == "GPRMC" caused a FALSE.
- There seemed to be a 0x0D and 0x00 character at the end. */
- if(s.substring(0,4) == "GPRM")
- {
- //Serial.println(s);
- for(int i = 0; i < 8; i++)
- {
- if(i < 7)
- {
- pLoc = s.indexOf(',', pLoc+1);
- /*Serial.print("i < 8, pLoc: ");
- Serial.print(pLoc);
- Serial.print(", ");
- Serial.println(i);*/
- }
- else
- {
- lEndLoc = s.indexOf(',', pLoc+1);
- lndSpeed = s.substring(pLoc+1, lEndLoc);
- /*Serial.print("i = 8, pLoc: ");
- Serial.println(pLoc);
- Serial.print("lEndLoc: ");
- Serial.println(lEndLoc);*/
- }
- }
- return lndSpeed;
- }
- }
- //Parse GPRMC NMEA sentence data from String
- //String must be GPRMC or no data will be parsed
- //Return Longitude
- 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;
- /*make sure that we are parsing the GPRMC string.
- Found that setting s.substring(0,5) == "GPRMC" caused a FALSE.
- There seemed to be a 0x0D and 0x00 character at the end. */
- if(s.substring(0,4) == "GPRM")
- {
- //Serial.println(s);
- for(int i = 0; i < 2; i++)
- {
- if(i < 1)
- {
- pLoc = s.indexOf(',', pLoc+1);
- /*Serial.print("i < 8, pLoc: ");
- Serial.print(pLoc);
- Serial.print(", ");
- Serial.println(i);*/
- }
- else
- {
- lEndLoc = s.indexOf(',', pLoc+1);
- gpsTime = s.substring(pLoc+1, lEndLoc);
- /*Serial.print("i = 8, pLoc: ");
- Serial.println(pLoc);
- Serial.print("lEndLoc: ");
- Serial.println(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;
- }
- return val;
-
- }
-
復制代碼
所有資料51hei提供下載:
final_dirst.rar
(2.67 KB, 下載次數: 25)
2018-6-12 11:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|