久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5050|回復: 1
打印 上一主題 下一主題
收起左側

關于gps和超聲波測距的arduino調試程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:350116 發表于 2018-6-12 11:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
通過gps顯示經緯度,并用sr04超聲波測距,設置閾值報警

arduino源程序如下:
  1. #include <Wire.h>
  2. #include <LiquidCrystal_I2C.h>
  3. //設置LCD1602的I2C地址為0x27,LCD1602為兩行,每行16個字符的液晶顯示器
  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;                //經度
  13. String lndSpeed;                //速度
  14. String gpsTime;                        //UTC時間,本初子午線經度0度的時間,和北京時間差8小時
  15. String beiJingTime;                //北京時間
  16. SoftwareSerial GPSSerial(12, 11 ); // RX, TX
  17. #define DEBUGSerial Serial
  18. //初始化程序
  19. void setup() {
  20. //LCD的I2C通訊初始化需要執行兩次
  21. lcd.init(); // 給LCD的I2C通訊初始化
  22. delay(20);
  23. lcd.init(); // 給LCD的I2C通訊初始化
  24. delay(20);
  25. lcd.backlight();//點亮LCD背光燈
  26. // 初始化串口通信及連接SR04的引腳
  27.         Serial.begin(9600);
  28.         pinMode(TrigPin, OUTPUT);
  29.     // 要檢測引腳上輸入的脈沖寬度,需要先設置為輸入狀態
  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.    // 產生一個10us的高脈沖去觸發TrigPin
  40.         digitalWrite(TrigPin, LOW);
  41.         delayMicroseconds(2);
  42.         digitalWrite(TrigPin, HIGH);
  43.         delayMicroseconds(10);
  44.         digitalWrite(TrigPin, LOW);
  45.     // 檢測脈沖寬度,并計算出距離
  46.         distance = pulseIn(EchoPin, HIGH) / 58.00;   
  47. lcd.clear();//LCD清屏
  48. // 定位光標在LCD第0行、第0列
  49. lcd.setCursor(0, 0);
  50. //在LCD第0行第0列開始顯示"Distance:"
  51. lcd.print("Distance:");
  52. // 定位光標在LCD第1行、第8列
  53. lcd.setCursor(9, 0);
  54.   //如果傳感器讀取值小于20,
  55.   if(distance<20)
  56.         {
  57.       //則在LCD第1行、第8列開始顯示"danger"
  58.          lcd.print("danger"); delay(500);//延時500ms     
  59.     }
  60.    //如果傳感器讀取值大于20,
  61.   else
  62.         {        
  63.         //把浮點型距離值取整
  64.         distance=int(distance);
  65.         //則在LCD第1行、第7列開始顯示距離值
  66.         lcd.print(distance);
  67.         //在距離值后顯示單位"cm"
  68.         lcd.print("cm");

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

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


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


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

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

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

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

  115.         if(gpsTime > "")                //當不是空時候打印輸出
  116.         {
  117.           DEBUGSerial.println("gpsTime: " + gpsTime);
  118.           beiJingTime = getBeiJingTime(gpsTime);        //獲取北京時間
  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.     }

復制代碼

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


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1029734 發表于 2022-5-25 21:56 | 只看該作者
非常好的實例,參考一下。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久久久久久冷 | 国产区在线观看 | 国产精品永久久久久久久www | 精品人伦一区二区三区蜜桃网站 | 二区精品 | 天天操天天插 | 国产一区二区精品在线观看 | 九色国产 | 久久激情av| 久久免费精品视频 | 狠狠插天天干 | 99re66在线观看精品热 | 中文字幕精品一区二区三区精品 | 国产精品久久久久一区二区三区 | 久久99精品久久久久 | 日本午夜精品 | 国产精品亚洲第一区在线暖暖韩国 | 国产精品自产av一区二区三区 | 精品乱码一区二区三四区视频 | 99免费| www.伊人.com| 在线观看国产视频 | 午夜久久久| 国产日韩欧美在线 | 国产96色在线 | 国产在线看片 | 亚洲三级在线观看 | 91精品久久久久久久久 | 中文字幕99| 欧美中文字幕在线观看 | 久久久久久黄 | 久久91| 国产午夜影院 | 色av一区二区三区 | 国产精品18久久久久久白浆动漫 | 国产欧美日韩一区 | 久久一久久 | 国产日产欧产精品精品推荐蛮挑 | 午夜精品一区二区三区在线观看 | 99热成人在线| 久久久999国产精品 中文字幕在线精品 |