久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
關于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://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
成人欧美一区二区三区黑人免费
|
日韩一区二区三区在线
|
亚州成人
|
日本熟妇毛耸耸xxxxxx
|
日韩三级精品
|
香蕉视频一直看一直爽
|
日本国产一区
|
国产成人a亚洲精品
|
精品蜜桃一区二区三区
|
久久久久精
|
欧美日韩一区二区在线
|
极品av在线
|
91精品国产色综合久久不卡98
|
亚洲一区二区三区免费视频
|
日韩一区三区
|
成人免费毛片嘿嘿连载视频
|
日韩影音
|
免费黄色片视频
|
中文在线免费看视频
|
国产小视频网站
|
亚洲综合自拍
|
国产日本在线
|
五月精品
|
电家庭影院午夜
|
色在线视频
|
国产在线免费
|
欧美视频精品
|
中文字幕1区
|
免费网站观看www在线观
|
久草免费福利
|
国产一区二区三区在线
|
天天操夜
|
日韩高清在线播放
|
人人九九精
|
国产无限资源
|
亚洲视频不卡
|
欧美精品二区三区四区免费看视频
|
aaa级片
|
糖心vlog精品一区二区
|
成人免费毛片男人用品
|
中文字幕网址在线
|