单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:4553|回复: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)


沙发
ID:1029734发表于 2022-5-25 21:56|只看该作者
非常好的实例,参考一下。

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

Powered by 单片机教程网