Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: eagler8

[经验] 【Arduino】168种传感器模块系列实验(75)--- 6MV2飞控GPS模块

[复制链接]
 楼主| 发表于 2022-6-4 08:46 | 显示全部楼层
程序十三:在OLED上显示日期、时间、纬度和经度
1)Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序十三:在OLED上显示日期、时间、纬度和经度
  4. */

  5. #include <TimeLib.h>//导入驱动库
  6. #include <TinyGPS++.h>
  7. #include <SoftwareSerial.h>
  8. #include <U8glib.h>

  9. //用于连接GY-NEO6MV2模块的引脚D9/D8
  10. static const int RXPin = 9, TXPin = 8;
  11. // TinyGPS++ 对象
  12. TinyGPSPlus gps;
  13. // GPS模块的串口连接
  14. SoftwareSerial Serial_GPS(RXPin, TXPin);
  15. //OLED显示设置
  16. U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_FAST);

  17. void draw() {
  18.   //设置时间/时区
  19.   GPS_Timezone_Adjust();
  20.   //显示的图形命令必须放在这里aqui
  21.   u8g.setFont(u8g_font_8x13B);
  22.   u8g.drawRFrame(0, 0, 128, 64, 4);
  23.   //日期线
  24.   u8g.drawStr(10, 14, "D:        ");
  25.   u8g.setPrintPos(34, 14);
  26.   //显示日期
  27.   if (day() < 10)
  28.   {
  29.     u8g.print("0");
  30.   }
  31.   u8g.print(day());
  32.   u8g.drawStr(51, 14, "/");
  33.   u8g.setPrintPos(60, 14);
  34.   //显示月份
  35.   if (month() < 10)
  36.   {
  37.     u8g.print("0");
  38.   }
  39.   u8g.print(month());
  40.   u8g.drawStr(76, 14, "/");
  41.   u8g.setPrintPos(85, 14);
  42.   //显示年份
  43.   u8g.print(year());
  44.   // 时间线
  45.   u8g.drawStr(10, 29, "H:        ");
  46.   u8g.setPrintPos(45, 29);
  47.   //开始时间
  48.   if (hour() < 10)
  49.   {
  50.     u8g.print("0");
  51.   }
  52.   u8g.print(hour());
  53.   u8g.drawStr(61, 28, ":");
  54.   u8g.setPrintPos(70, 29);
  55.   //显示分钟
  56.   if (minute() < 10)
  57.   {
  58.     u8g.print("0");
  59.   }
  60.   u8g.print(minute());
  61.   u8g.drawStr(86, 28, ":");
  62.   u8g.setPrintPos(95, 29);
  63.   //显示秒数
  64.   if (second() < 10)
  65.   {
  66.     u8g.print("0");
  67.   }
  68.   u8g.print(second());
  69.   //纬度
  70.   u8g.drawStr(10, 44, "Lat:         ");
  71.   u8g.setPrintPos(45, 44);
  72.   u8g.print(gps.location.lat(), 5);
  73.   //经度
  74.   u8g.drawStr(10, 59, "Lon:         ");
  75.   u8g.setPrintPos(45, 59);
  76.   u8g.print(gps.location.lng(), 5);
  77. }
  78. //根据地区调整时区
  79. const int UTC_offset = -3;

  80. void setup() {
  81.   // Arduino 波特率
  82.   Serial.begin(9600);
  83.   //波特率GPS模块
  84.   Serial_GPS.begin(9600);
  85.   //在串口监视器上显示初始信息
  86.   Serial.println(F("日期、时间、纬度和经度"));
  87.   Serial.println(F("GPS 模块 GY-NEO6MV2"));
  88.   Serial.print(F("TinyGPS++ 驱动库 v."));
  89.   Serial.println(TinyGPSPlus::libraryVersion());
  90.   Serial.println();
  91.   //OLED显示设置
  92.   if ( u8g.getMode() == U8G_MODE_R3G3B2 )
  93.   {
  94.     u8g.setColorIndex(255);     // 白色的
  95.   }
  96.   else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
  97.     u8g.setColorIndex(3);         // 最大强度
  98.   }
  99.   else if ( u8g.getMode() == U8G_MODE_BW ) {
  100.     u8g.setColorIndex(1);         //像素开启
  101.   }
  102.   else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
  103.     u8g.setHiColorByRGB(255, 255, 255);
  104.   }
  105. }

  106. void loop() {
  107.   //与GPS模块连接
  108.   while (Serial_GPS.available() > 0)
  109.     if (gps.encode(Serial_GPS.read()))
  110.       displayInfo();
  111.   if (millis() > 5000 && gps.charsProcessed() < 10)
  112.   {
  113.     Serial.println(F("未检测到 GPS:检查接线。"));
  114.     while (true);
  115.   }
  116.   //调用屏幕上的绘图例程
  117.   u8g.firstPage();
  118.   do
  119.   {
  120.     draw();
  121.   }
  122.   while ( u8g.nextPage() );
  123.   delay(1000);
  124. }

  125. void displayInfo() {
  126.   //在串口监视器中显示信息
  127.   Serial.print(F("位置:"));
  128.   if (gps.location.isValid())
  129.   {
  130.     Serial.print(gps.location.lat(), 6); //latitude
  131.     Serial.print(F(","));
  132.     Serial.print(gps.location.lng(), 6); //longitude
  133.   }
  134.   else
  135.   {
  136.     Serial.print(F("无效"));
  137.   }
  138.   Serial.print(F("  日期/时间: "));
  139.   if (gps.date.isValid())
  140.   {
  141.     Serial.print(gps.date.day()); //天
  142.     Serial.print(F("/"));
  143.     Serial.print(gps.date.month()); //月
  144.     Serial.print(F("/"));
  145.     Serial.print(gps.date.year());//年
  146.   }
  147.   else
  148.   {
  149.     Serial.print(F("无效"));
  150.   }
  151.   Serial.print(F(" "));
  152.   if (gps.time.isValid())
  153.   {
  154.     if (gps.time.hour() < 10) Serial.print(F("0"));
  155.     Serial.print(gps.time.hour()); //小时
  156.     Serial.print(F(":"));
  157.     if (gps.time.minute() < 10) Serial.print(F("0"));
  158.     Serial.print(gps.time.minute()); //分钟
  159.     Serial.print(F(":"));
  160.     if (gps.time.second() < 10) Serial.print(F("0"));
  161.     Serial.print(gps.time.second()); //第二
  162.     Serial.print(F("."));
  163.     if (gps.time.centisecond() < 10) Serial.print(F("0"));
  164.     Serial.print(gps.time.centisecond());
  165.   }
  166.   else
  167.   {
  168.     Serial.print(F("无效"));
  169.   }
  170.   Serial.println();
  171. }

  172. void GPS_Timezone_Adjust() {
  173.   while (Serial_GPS.available())
  174.   {
  175.     if (gps.encode(Serial_GPS.read()))
  176.     {
  177.       int Year = gps.date.year();
  178.       byte Month = gps.date.month();
  179.       byte Day = gps.date.day();
  180.       byte Hour = gps.time.hour();
  181.       byte Minute = gps.time.minute();
  182.       byte Second = gps.time.second();
  183.       //根据GPS数据调整日期和时间
  184.       setTime(Hour, Minute, Second, Day, Month, Year);
  185.       //应用偏移来设置日期和时间
  186.       //根据时区
  187.       adjustTime(UTC_offset * SECS_PER_HOUR);
  188.     }
  189.   }
  190. }
复制代码


 楼主| 发表于 2022-6-4 08:48 | 显示全部楼层
(2)实验串口返回情况(放在电脑桌上,没有GPS信号)

8.6-42.jpg

 楼主| 发表于 2022-6-4 08:53 | 显示全部楼层
3)实验场景图 (放在电脑桌上,没有GPS信号)

8.6-43.jpg

 楼主| 发表于 2022-6-4 08:55 | 显示全部楼层
4)实验串口返回情况(模块放在窗口,接收到GPS信号)

8.6-44.jpg

 楼主| 发表于 2022-6-4 08:57 | 显示全部楼层
5)实验场景图(模块放在窗口,接收到GPS信号)

8.6-45.jpg

 楼主| 发表于 2022-6-4 08:59 | 显示全部楼层
8.6-46.jpg
 楼主| 发表于 2022-6-4 09:00 | 显示全部楼层
6)实验接线示意图(GPS软串口接在D9/D8)

8.6-47.jpg

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

本版积分规则

小黑屋|Archiver|手机版|Arduino爱好者

GMT+8, 2022-12-7 00:26 , Processed in 0.072224 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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