标题:
关于gps和超声波测距的arduino调试程序
[打印本页]
作者:
firstdream
时间:
2018-6-12 11:07
标题:
关于gps和超声波测距的arduino调试程序
通过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
作者:
sdieedu
时间:
2022-5-25 21:56
非常好的实例,参考一下。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1