GPS仪表-Arduino中文社区 - Powered by Discuz! Archiver

vany5921 发表于 2020-2-19 21:22

GPS仪表

    本项目使用GPS模块实现速度测量,arduino需要安装TinyGPS PLUS库,屏幕显示速度、方向、高度,根据时间自动调节屏幕亮度。在首次使用时需要使用U-Center(https://www.u-blox.com/en/product/u-center)修改波特率(以下代码GPS使用115200与M5通讯)1.M5连接电脑
2.按住A键选择9600波特率(GPS默认)
3.在U-center中修改波特率115200
4.在以后的使用中选择115200与电脑进行通讯
注:如果你想保持GPS为默认的115200波特率,你需要在以下代码中将hSerial.begin(115200)改为hSerial.begin(9600),GPS的刷新频率将保持为1Hz

#include <M5Stack.h>#include <TinyGPS++.h>

TinyGPSPlus tGPS;
HardwareSerial hSerial(2);
bool enableAutoSleep = true;

void serialThroughMode();
void updateScreen(TinyGPSPlus);
void updateDirection(int);

void setup()
{
M5.begin();
M5.Lcd.setTextSize(2);
M5.Lcd.drawString("Select Baud To Connect PC", 0, 90);
M5.Lcd.drawString("9600", 30, 200);
M5.Lcd.drawString("Battery", 110, 200);
M5.Lcd.drawString("115200", 220, 200);
M5.Lcd.setTextFont(4);
Serial.begin(115200);
pinMode(BUTTON_A_PIN, INPUT_PULLUP);
pinMode(BUTTON_B_PIN, INPUT_PULLUP);
pinMode(BUTTON_C_PIN, INPUT_PULLUP);

// Speaker Noise Reduce
M5.Speaker.mute();
pinMode(25, OUTPUT);
digitalWrite(25, LOW);

M5.Power.begin();
M5.Power.setPowerVin(false);
delay(2000);

// Serial Through Mode (To Setup Module)
M5.update();
if (M5.BtnA.isPressed())
{
    hSerial.begin(9600);
    serialThroughMode();
}
if (M5.BtnB.isPressed())
{
    enableAutoSleep = false;
}
if (M5.BtnC.isPressed())
{
    hSerial.begin(115200);
    serialThroughMode();
}

// You need configure Baud of the GPS module before use
hSerial.begin(115200);
delay(1000);
M5.Lcd.fillScreen(TFT_BLACK);
//M5.Lcd.setRotation(5);
}

void loop()
{
// Manage Power
if (enableAutoSleep)
{
    while (!M5.Power.isCharging())
    {
      M5.Power.lightSleep(SLEEP_SEC(3));
    }
}

// Receive GPS Data
while (hSerial.available() > 0)
{
    tGPS.encode(hSerial.read());
}

// Change Night Mode to Adjust Brightness
bool isNight = tGPS.time.hour() + 9 >= 18 || tGPS.time.hour() + 9 <= 6;
if (isNight)
{
    M5.Lcd.setBrightness(60);
}
else
{
    M5.Lcd.setBrightness(200);
}

// Draw Information
updateScreen(&tGPS);
}

// Update Screen Info
unsigned int oldAlt = 0;
unsigned int oldSpeed = 0;
unsigned int oldHeading = 0;
void updateScreen(TinyGPSPlus *gps)
{
int nowAlt = (int)(gps->altitude.meters());
int nowSats = gps->satellites.value();
int nowSpeed = (int)(gps->speed.kmph() - 0.5);
int nowHeading = (int)(gps->course.deg());

M5.Lcd.setTextColor(TFT_WHITE);
if (nowSats >= 3)
{
    if (nowAlt != oldAlt)
    {
      M5.Lcd.setTextSize(2);
      M5.Lcd.fillRect(0, 0, 230, 47, TFT_BLACK);
      M5.Lcd.drawString(String(nowAlt) + "m    ", 0, 0);
    }
    if (nowSpeed != oldSpeed)
    {
      M5.Lcd.setTextSize(3);
      M5.Lcd.fillRect(15, 60, 300, 150, TFT_BLACK);
      M5.Lcd.drawString(String(nowSpeed), 15, 60, 7);
    }
    if (nowHeading != oldHeading)
    {
      updateDirection(nowHeading);
    }
}
else
{
    M5.Lcd.setTextSize(3);
    M5.Lcd.fillRect(10, 60, 300, 150, TFT_BLACK);
    M5.Lcd.drawString("------", 10, 60, 7);
    delay(1000);
}
M5.Lcd.setTextSize(1);
M5.Lcd.drawString("km/h", 260, 210);

oldAlt = nowAlt;
oldSpeed = nowSpeed;
oldHeading = nowHeading;
}

// Update Direction Info
void updateDirection(int nowCourse)
{
const int width = (int)(45.0 / 2.0 + 1.0);
String dispStr;
uint16_t strColor;

if (nowCourse > 360 || nowCourse < 0)
{
    dispStr = "-- ";
}
else if (nowCourse >= 360 - width || nowCourse <= 0 + width)
{
    dispStr = "N";
    strColor = TFT_RED;
}
else if (45 - width <= nowCourse && nowCourse <= 45 + width)
{
    dispStr = "NE ";
    strColor = TFT_ORANGE;
}
else if (90 - width <= nowCourse && nowCourse <= 90 + width)
{
    dispStr = "E";
    strColor = TFT_YELLOW;
}
else if (135 - width <= nowCourse && nowCourse <= 135 + width)
{
    dispStr = "SE ";
    strColor = TFT_GREENYELLOW;
}
else if (180 - width <= nowCourse && nowCourse <= 180 + width)
{
    dispStr = "S";
    strColor = TFT_GREEN;
}
else if (225 - width <= nowCourse && nowCourse <= 225 + width)
{
    dispStr = "SW ";
    strColor = TFT_CYAN;
}
else if (270 - width <= nowCourse && nowCourse <= 270 + width)
{
    dispStr = "W";
    strColor = TFT_DARKCYAN;
}
else if (315 - width <= nowCourse && nowCourse <= 315 + width)
{
    dispStr = "NW ";
    strColor = TFT_PURPLE;
}

M5.Lcd.setTextSize(2);
M5.Lcd.setTextColor(strColor);
M5.Lcd.fillRect(230, 0, 90, 47, TFT_BLACK);
M5.Lcd.drawString(dispStr, 240, 0);
}

// -----------------------------------------------------------
// Serial Through Mode to Configure GPS Module from PC
void serialThroughMode()
{
M5.Lcd.drawString("Serial Through Mode", 0, 120);
while (1)
{
    while (hSerial.available() > 0)
    {
      Serial.write(hSerial.read());
    }
    while (Serial.available() > 0)
    {
      hSerial.write(Serial.read());
    }
}
}


页: [1]
查看完整版本: GPS仪表