Arduino写入屏幕的速度

时间:2018-04-23 04:16:07

标签: c++ arduino gps

我无法让我的GPS更新速度。它显示文本,如果我从位置更新循环中取出GPS速度,它会显示当前速度一次,然后无法更新。有什么想法吗?

void loop() {
  while (serial_connections.available()) {
    gps.encode(serial_connections.read());
    if (gps.location.isUpdated()) {
      DText = Serial.println(gps.speed.mps());
      DSat = Serial.println(gps.satellites.value());
    }
    display.clearDisplay();  // clears last number
    display.display();  // writes clear to screen
    display.setCursor(10, 5);  //Set drawing posision
    display.print(DText);  // what to draw
    display.setCursor(35, 5);
    display.print(" MPS");
    display.setCursor(10, 18);
    display.print(DSat);
    display.setCursor(35, 18);
    display.print(" Sat");
    display.display(); // writes to the screen
    delay (50);
  }
}

1 个答案:

答案 0 :(得分:1)

  

它显示当前速度一次,然后无法更新。有什么想法吗?

您的草图花费所有时间更新显示并等待。以下是发生的事情:

1)当一个字符可用时,它会被读取并传递给encode

2)然后它更新显示,这需要一些时间。你没有给我们整个程序,也没有确定硬件,所以我真的不知道需要多长时间。

3)然后等待50ms。在此期间,GPS角色继续到达。它们将存储在输入缓冲区中,直到调用read() OR ,直到存储了64个字符。那么它们将被删除。

在9600(我猜),可能有50个字符到了。现在输入缓冲区几乎已满。

4)再次执行while循环测试,读取并解析第二个字符(步骤1),更新显示(没有新信息可用,步骤2),并等待另一个50ms。

15ms后,输入缓冲区已满,Arduino开始忽略字符。当50ms延迟完成时,丢失了35个字符(9600)。

这可以防止成功解析收到的(部分)NMEA句子,并且速度不会更新。草图将继续使用旧信息更新显示,然后等待一些,这会导致更多的字符丢失。

需要重新设计循环结构,以便只在有新信息时才更新显示,并且永远不要使用延迟:

#include <LiquidCrystal.h> ???
LiquidCrystal display;     ???

#include <NMEAGPS.h>

NMEAGPS gps;
gps_fix fix;

//  Here are three different ways to connect the GPS:
#define gpsPort Serial1

//#include <AltSoftSerial.h>
//AltSoftSerial gpsPort; // two specific pins required (8 & 9 on an UNO)

//#include <NeoSWSerial.h>
//NeoSWSerial gpsPort( 3, 4 );


void setup()
{
  Serial.begin( 9600 );
  gpsPort.begin( 9600 );
}

void loop()
{
  // Read and parse any available characters from the GPS device
  if (gps.available( gpsPort )) {

    // Once per second, a complete fix structure is ready.
    fix = gps.read();

    Serial.print( F("Speed: ") );
    float speed = 0.0;
    if (fix.valid.speed) {
      speed = fix.speed_kph() * 1000.0 / 3600.0;
      Serial.print( speed );
    }
    Serial.println();

    Serial.print( F("Sats: ") );
    if (fix.valid.satellites)
      Serial.println( fix.satellites );
    Serial.println();

    //  Update the display ONCE PER SECOND

    display.clearDisplay();  // clears last number
    display.display();  // writes clear to screen
    display.setCursor(10, 5);  //Set drawing posision
    if (fix.valid.speed)
      display.print( speed );  // what to draw
    display.setCursor(35, 5);
    display.print(" MPS");
    display.setCursor(10, 18);
    if (fix.valid.satellites)
      display.print( fix.satellites );
    display.setCursor(35, 18);
    display.print(" Sat");
    display.display(); // writes to the screen
  }
}

这使用我的NeoGPS库。它比所有其他GPS库更小,更快,更可靠,更准确。即使您不使用它,也应阅读有关choosing a serial porttroubleshooting的相关网页。

NeoGPS,AltSoftSerial和NeoSWSerial都可以从Arduino IDE库管理器中获得,菜单 Sketch - &gt;包含图书馆 - &gt;管理图书馆