找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3153|回复: 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, 下载次数: 6)
回复

使用道具 举报

ID:1029734 发表于 2022-5-25 21:56 | 显示全部楼层
非常好的实例,参考一下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表