找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5075|回復(fù): 1
收起左側(cè)

關(guān)于gps和超聲波測(cè)距的arduino調(diào)試程序

[復(fù)制鏈接]
ID:350116 發(fā)表于 2018-6-12 11:07 | 顯示全部樓層 |閱讀模式
通過(guò)gps顯示經(jīng)緯度,并用sr04超聲波測(cè)距,設(shè)置閾值報(bào)警

arduino源程序如下:
  1. #include <Wire.h>
  2. #include <LiquidCrystal_I2C.h>
  3. //設(shè)置LCD1602的I2C地址為0x27,LCD1602為兩行,每行16個(gè)字符的液晶顯示器
  4. LiquidCrystal_I2C lcd(0x27,16,2);
  5. const int TrigPin = 2;
  6. const int EchoPin = 3;
  7. float distance;
  8. float lati;
  9. #include <SoftwareSerial.h>
  10. char nmeaSentence[68];
  11. String latitude;                //緯度
  12. String longitude;                //經(jīng)度
  13. String lndSpeed;                //速度
  14. String gpsTime;                        //UTC時(shí)間,本初子午線經(jīng)度0度的時(shí)間,和北京時(shí)間差8小時(shí)
  15. String beiJingTime;                //北京時(shí)間
  16. SoftwareSerial GPSSerial(12, 11 ); // RX, TX
  17. #define DEBUGSerial Serial
  18. //初始化程序
  19. void setup() {
  20. //LCD的I2C通訊初始化需要執(zhí)行兩次
  21. lcd.init(); // 給LCD的I2C通訊初始化
  22. delay(20);
  23. lcd.init(); // 給LCD的I2C通訊初始化
  24. delay(20);
  25. lcd.backlight();//點(diǎn)亮LCD背光燈
  26. // 初始化串口通信及連接SR04的引腳
  27.         Serial.begin(9600);
  28.         pinMode(TrigPin, OUTPUT);
  29.     // 要檢測(cè)引腳上輸入的脈沖寬度,需要先設(shè)置為輸入狀態(tài)
  30.         pinMode(EchoPin, INPUT);
  31.         pinMode(8,OUTPUT);
  32.   GPSSerial.begin(9600);                        //定義波特率9600,和我們店鋪的GPS模塊輸出的波特率一致
  33.   DEBUGSerial.begin(9600);

  34.   DEBUGSerial.println("GPS test");
  35.   DEBUGSerial.println("Wating...");
  36. }
  37. //主程序
  38. void loop() {
  39.    // 產(chǎn)生一個(gè)10us的高脈沖去觸發(fā)TrigPin
  40.         digitalWrite(TrigPin, LOW);
  41.         delayMicroseconds(2);
  42.         digitalWrite(TrigPin, HIGH);
  43.         delayMicroseconds(10);
  44.         digitalWrite(TrigPin, LOW);
  45.     // 檢測(cè)脈沖寬度,并計(jì)算出距離
  46.         distance = pulseIn(EchoPin, HIGH) / 58.00;   
  47. lcd.clear();//LCD清屏
  48. // 定位光標(biāo)在LCD第0行、第0列
  49. lcd.setCursor(0, 0);
  50. //在LCD第0行第0列開(kāi)始顯示"Distance:"
  51. lcd.print("Distance:");
  52. // 定位光標(biāo)在LCD第1行、第8列
  53. lcd.setCursor(9, 0);
  54.   //如果傳感器讀取值小于20,
  55.   if(distance<20)
  56.         {
  57.       //則在LCD第1行、第8列開(kāi)始顯示"danger"
  58.          lcd.print("danger"); delay(500);//延時(shí)500ms     
  59.     }
  60.    //如果傳感器讀取值大于20,
  61.   else
  62.         {        
  63.         //把浮點(diǎn)型距離值取整
  64.         distance=int(distance);
  65.         //則在LCD第1行、第7列開(kāi)始顯示距離值
  66.         lcd.print(distance);
  67.         //在距離值后顯示單位"cm"
  68.         lcd.print("cm");

  69. delay(500);//延時(shí)500ms
  70. lcd.setCursor(0, 1);
  71. Serial.println(distance);
  72. }
  73. if(distance>20)
  74. { digitalWrite(8, HIGH);//輸出HIGH電平,停止發(fā)聲  
  75.    delay(500); //等待500毫秒  
  76.   
  77. }
  78. else
  79. { digitalWrite(8, LOW);//輸出LOW電平,發(fā)聲  
  80.    
  81.   }
  82.    for (unsigned long start = millis(); millis() - start < 1000;)        //一秒鐘內(nèi)不停掃描GPS信息
  83.   {
  84.     while (GPSSerial.available())        //串口獲取到數(shù)據(jù)開(kāi)始解析
  85.     {
  86.       char c = GPSSerial.read();        //讀取一個(gè)字節(jié)獲取的數(shù)據(jù)

  87.       switch(c)                                        //判斷該字節(jié)的值
  88.       {
  89.       case


  90. :                                        //若是$,則說(shuō)明是一幀數(shù)據(jù)的開(kāi)始
  91.         GPSSerial.readBytesUntil('*', nmeaSentence, 67);                //讀取接下來(lái)的數(shù)據(jù),存放在nmeaSentence字符數(shù)組中,最大存放67個(gè)字節(jié)
  92.         //Serial.println(nmeaSentence);
  93.         latitude = parseGprmcLat(nmeaSentence);        //獲取緯度值
  94.         longitude = parseGprmcLon(nmeaSentence);//獲取經(jīng)度值
  95.         lndSpeed = parseGprmcSpeed(nmeaSentence);//獲取速度值
  96.         gpsTime = parseGprmcTime(nmeaSentence);//獲取GPS時(shí)間


  97.         if(latitude > "")                //當(dāng)不是空時(shí)候打印輸出
  98.         {
  99.           DEBUGSerial.println("------------------------------------");
  100.           DEBUGSerial.println("latitude: " + latitude);
  101.          
  102.       

  103.          lcd.print(latitude);
  104.         }

  105.       
  106.      
  107.         if(longitude > "")                //當(dāng)不是空時(shí)候打印輸出
  108.         {
  109.           DEBUGSerial.println("longitude: " + longitude);
  110.         }  

  111.         if(lndSpeed > "")                //當(dāng)不是空時(shí)候打印輸出
  112.         {
  113.           DEBUGSerial.println("Speed (knots): " + lndSpeed);
  114.         }

  115.         if(gpsTime > "")                //當(dāng)不是空時(shí)候打印輸出
  116.         {
  117.           DEBUGSerial.println("gpsTime: " + gpsTime);
  118.           beiJingTime = getBeiJingTime(gpsTime);        //獲取北京時(shí)間
  119.           DEBUGSerial.println("beiJingTime: " + beiJingTime);        
  120.         }               
  121.       }
  122.     }
  123.   }
  124. }

  125. String getBeiJingTime(String s)
  126. {
  127.   int hour = s.substring(0,2).toInt();
  128.   int minute = s.substring(2,4).toInt();
  129.   int second = s.substring(4,6).toInt();

  130.   hour += 8;

  131.   if(hour > 24)
  132.     hour -= 24;
  133.   s = String(hour) +":"+String(minute) +":"+ String(second);
  134.   return s;
  135. }

  136. //Parse GPRMC NMEA sentence data from String
  137. //String must be GPRMC or no data will be parsed
  138. //Return Latitude
  139. String parseGprmcLat(String s)
  140. {
  141.   int pLoc = 0; //paramater location pointer
  142.   int lEndLoc = 0; //lat parameter end location
  143.   int dEndLoc = 0; //direction parameter end location
  144.   String lat;
  145.   /*make sure that we are parsing the GPRMC string.
  146.    Found that setting s.substring(0,5) == "GPRMC" caused a FALSE.
  147.    There seemed to be a 0x0D and 0x00 character at the end. */
  148.   if(s.substring(0,4) == "GPRM")
  149.   {
  150.     //Serial.println(s);
  151.     for(int i = 0; i < 5; i++)
  152.     {
  153.       if(i < 3)
  154.       {
  155.         pLoc = s.indexOf(',', pLoc+1);
  156.         /*Serial.print("i < 3, pLoc: ");
  157.          Serial.print(pLoc);
  158.          Serial.print(", ");
  159.          Serial.println(i);*/
  160.       }
  161.       if(i == 3)
  162.       {
  163.         lEndLoc = s.indexOf(',', pLoc+1);
  164.         lat = s.substring(pLoc+1, lEndLoc);
  165.         /*Serial.print("i = 3, pLoc: ");
  166.          Serial.println(pLoc);
  167.          Serial.print("lEndLoc: ");
  168.          Serial.println(lEndLoc);*/
  169.       }
  170.       else
  171.       {
  172.         dEndLoc = s.indexOf(',', lEndLoc+1);
  173.         lat = lat + " " + s.substring(lEndLoc+1, dEndLoc);
  174.         /*Serial.print("i = 4, lEndLoc: ");
  175.          Serial.println(lEndLoc);
  176.          Serial.print("dEndLoc: ");
  177.          Serial.println(dEndLoc);*/
  178.       }
  179.     }
  180.     return lat;
  181.   }
  182.   //}
  183.   //}
  184. }

  185. //Parse GPRMC NMEA sentence data from String
  186. //String must be GPRMC or no data will be parsed
  187. //Return Longitude
  188. String parseGprmcLon(String s)
  189. {
  190.   int pLoc = 0; //paramater location pointer
  191.   int lEndLoc = 0; //lat parameter end location
  192.   int dEndLoc = 0; //direction parameter end location
  193.   String lon;

  194.   /*make sure that we are parsing the GPRMC string.
  195.    Found that setting s.substring(0,5) == "GPRMC" caused a FALSE.
  196.    There seemed to be a 0x0D and 0x00 character at the end. */
  197.   if(s.substring(0,4) == "GPRM")
  198.   {
  199.     //Serial.println(s);
  200.     for(int i = 0; i < 7; i++)
  201.     {
  202.       if(i < 5)
  203.       {
  204.         pLoc = s.indexOf(',', pLoc+1);
  205.         /*Serial.print("i < 3, pLoc: ");
  206.          Serial.print(pLoc);
  207.          Serial.print(", ");
  208.          Serial.println(i);*/
  209.       }
  210.       if(i == 5)
  211.       {
  212.         lEndLoc = s.indexOf(',', pLoc+1);
  213.         lon = s.substring(pLoc+1, lEndLoc);
  214.         /*Serial.print("i = 3, pLoc: ");
  215.          Serial.println(pLoc);
  216.          Serial.print("lEndLoc: ");
  217.          Serial.println(lEndLoc);*/
  218.       }
  219.       else
  220.       {
  221.         dEndLoc = s.indexOf(',', lEndLoc+1);
  222.         lon = lon + " " + s.substring(lEndLoc+1, dEndLoc);
  223.         /*Serial.print("i = 4, lEndLoc: ");
  224.          Serial.println(lEndLoc);
  225.          Serial.print("dEndLoc: ");
  226.          Serial.println(dEndLoc);*/
  227.       }
  228.     }
  229.     return lon;
  230.   }
  231. }

  232. //Parse GPRMC NMEA sentence data from String
  233. //String must be GPRMC or no data will be parsed
  234. //Return Longitude
  235. String parseGprmcSpeed(String s)
  236. {
  237.   int pLoc = 0; //paramater location pointer
  238.   int lEndLoc = 0; //lat parameter end location
  239.   int dEndLoc = 0; //direction parameter end location
  240.   String lndSpeed;

  241.   /*make sure that we are parsing the GPRMC string.
  242.    Found that setting s.substring(0,5) == "GPRMC" caused a FALSE.
  243.    There seemed to be a 0x0D and 0x00 character at the end. */
  244.   if(s.substring(0,4) == "GPRM")
  245.   {
  246.     //Serial.println(s);
  247.     for(int i = 0; i < 8; i++)
  248.     {
  249.       if(i < 7)
  250.       {
  251.         pLoc = s.indexOf(',', pLoc+1);
  252.         /*Serial.print("i < 8, pLoc: ");
  253.          Serial.print(pLoc);
  254.          Serial.print(", ");
  255.          Serial.println(i);*/
  256.       }
  257.       else
  258.       {
  259.         lEndLoc = s.indexOf(',', pLoc+1);
  260.         lndSpeed = s.substring(pLoc+1, lEndLoc);
  261.         /*Serial.print("i = 8, pLoc: ");
  262.          Serial.println(pLoc);
  263.          Serial.print("lEndLoc: ");
  264.          Serial.println(lEndLoc);*/
  265.       }
  266.     }
  267.     return lndSpeed;
  268.   }
  269. }


  270. //Parse GPRMC NMEA sentence data from String
  271. //String must be GPRMC or no data will be parsed
  272. //Return Longitude
  273. String parseGprmcTime(String s)
  274. {
  275.   int pLoc = 0; //paramater location pointer
  276.   int lEndLoc = 0; //lat parameter end location
  277.   int dEndLoc = 0; //direction parameter end location
  278.   String gpsTime;

  279.   /*make sure that we are parsing the GPRMC string.
  280.    Found that setting s.substring(0,5) == "GPRMC" caused a FALSE.
  281.    There seemed to be a 0x0D and 0x00 character at the end. */
  282.   if(s.substring(0,4) == "GPRM")
  283.   {
  284.     //Serial.println(s);
  285.     for(int i = 0; i < 2; i++)
  286.     {
  287.       if(i < 1)
  288.       {
  289.         pLoc = s.indexOf(',', pLoc+1);
  290.         /*Serial.print("i < 8, pLoc: ");
  291.          Serial.print(pLoc);
  292.          Serial.print(", ");
  293.          Serial.println(i);*/
  294.       }
  295.       else
  296.       {
  297.         lEndLoc = s.indexOf(',', pLoc+1);
  298.         gpsTime = s.substring(pLoc+1, lEndLoc);
  299.         /*Serial.print("i = 8, pLoc: ");
  300.          Serial.println(pLoc);
  301.          Serial.print("lEndLoc: ");
  302.          Serial.println(lEndLoc);*/
  303.       }
  304.     }
  305.     return gpsTime;
  306.   }
  307. }

  308. // Turn char[] array into String object
  309. String charToString(char *c)
  310. {

  311.   String val = "";

  312.   for(int i = 0; i <= sizeof(c); i++)
  313.   {
  314.     val = val + c;
  315.   }

  316.   return val;
  317.    
  318.     }

復(fù)制代碼

所有資料51hei提供下載:
final_dirst.rar (2.67 KB, 下載次數(shù): 25)


回復(fù)

使用道具 舉報(bào)

ID:1029734 發(fā)表于 2022-5-25 21:56 | 顯示全部樓層
非常好的實(shí)例,參考一下。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表