通过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)
|