Error message gps and canbus

Hello, trying to get som gps speed information sendt over the canbus.
Canbus int okay, and I get the information form the gps as vel.
I'm new at this, does somebody understand my fault here? :roll_eyes:

// CAN Send Example
//
#include <mcp_can.h>
#include <SPI.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>

MCP_CAN CAN0(10);     // Set CS to pin 10

static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;

// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);

byte spd (gps.speed.kmph);
void setup()
{
  Serial.begin(115200);
  ss.begin(GPSBaud);

  
  Serial.println(F("FullExample.ino"));
  Serial.println(F("An extensive example of many interesting TinyGPS++ features"));
  Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
  Serial.println(F("by Mikal Hart"));
  Serial.println();
  Serial.println(F("Sats HDOP Latitude   Longitude   Fix  Date       Time     Date Alt    Course Speed Card  Distance Course Card  Chars Sentences Checksum"));
  Serial.println(F("          (deg)      (deg)       Age                      Age  (m)    --- from GPS ----  ---- to London  ----  RX    RX        Fail"));
  Serial.println(F("---------------------------------------------------------------------------------------------------------------------------------------"));

  // Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled.
  if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK) Serial.println("MCP2515 Initialized Successfully!");
  else Serial.println("Error Initializing MCP2515...");

  CAN0.setMode(MCP_NORMAL);   // Change to normal mode to allow messages to be transmitted
}



void loop()
{
static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;

  printInt(gps.satellites.value(), gps.satellites.isValid(), 5);
  printInt(gps.hdop.value(), gps.hdop.isValid(), 5);
  printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
  printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
  printInt(gps.location.age(), gps.location.isValid(), 5);
  printDateTime(gps.date, gps.time);
  printFloat(gps.altitude.meters(), gps.altitude.isValid(), 7, 2);
  printFloat(gps.course.deg(), gps.course.isValid(), 7, 2);
  printFloat(gps.speed.kmph(), gps.speed.isValid(), 6, 2);
  printStr(gps.course.isValid() ? TinyGPSPlus::cardinal(gps.course.value()) : "*** ", 6);

  unsigned long distanceKmToLondon =
    (unsigned long)TinyGPSPlus::distanceBetween(
      gps.location.lat(),
      gps.location.lng(),
      LONDON_LAT, 
      LONDON_LON) / 1000;
  printInt(distanceKmToLondon, gps.location.isValid(), 9);

  double courseToLondon =
    TinyGPSPlus::courseTo(
      gps.location.lat(),
      gps.location.lng(),
      LONDON_LAT, 
      LONDON_LON);

  printFloat(courseToLondon, gps.location.isValid(), 7, 2);

  const char *cardinalToLondon = TinyGPSPlus::cardinal(courseToLondon);

  printStr(gps.location.isValid() ? cardinalToLondon : "*** ", 6);

  printInt(gps.charsProcessed(), true, 6);
  printInt(gps.sentencesWithFix(), true, 10);
  printInt(gps.failedChecksum(), true, 9);
  Serial.println();
  
  smartDelay(1000);

  if (millis() > 5000 && gps.charsProcessed() < 10)
    Serial.println(F("No GPS data received: check wiring"));
}

// This custom version of delay() ensures that the gps object
// is being "fed".
static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

static void printFloat(float val, bool valid, int len, int prec)
{
  if (!valid)
  {
    while (len-- > 1)
      Serial.print('*');
    Serial.print(' ');
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i=flen; i<len; ++i)
      Serial.print(' ');
  }
  smartDelay(0);
}

static void printInt(unsigned long val, bool valid, int len)
{
  char sz[32] = "*****************";
  if (valid)
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i=strlen(sz); i<len; ++i)
    sz[i] = ' ';
  if (len > 0) 
    sz[len-1] = ' ';
  Serial.print(sz);
  smartDelay(0);
}

static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
  if (!d.isValid())
  {
    Serial.print(F("********** "));
  }
  else
  {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d ", d.month(), d.day(), d.year());
    Serial.print(sz);
  }
  
  if (!t.isValid())
  {
    Serial.print(F("******** "));
  }
  else
  {
    char sz[32];
    sprintf(sz, "%02d:%02d:%02d ", t.hour(), t.minute(), t.second());
    Serial.print(sz);
  }

  printInt(d.age(), d.isValid(), 5);
  smartDelay(0);
}

static void printStr(const char *str, int len)
{
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    Serial.print(i<slen ? str[i] : ' ');
  smartDelay(0);

  byte data [8] = {0, 0, 0, 0, spd, 39, 0, 0};
  
  // send data:  ID = 0x201, Standard CAN Frame, Data length = 8 bytes, 'data' = array of data bytes to send
  byte sndStat = CAN0.sendMsgBuf(0x201, 0, 8, data);
  if(sndStat == CAN_OK){
    Serial.println("Message Sent Successfully!");
  } else {
    Serial.println("Error Sending Message...");
  }
  delay(10);   // send data per 100ms


}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

the error message is:
Arduino: 1.6.11 (Windows 8.1), Board: "Arduino/Genuino Uno"

CAN_send:19: error: cannot convert 'TinyGPSSpeed::kmph' from type 'double (TinyGPSSpeed::)()' to type 'byte {aka unsigned char}'

byte spd (gps.speed.kmph);

^

exit status 1
cannot convert 'TinyGPSSpeed::kmph' from type 'double (TinyGPSSpeed::)()' to type 'byte {aka unsigned char}'

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

thanks

the error message is:
Arduino: 1.6.11 (Windows 8.1), Board: "Arduino/Genuino Uno"

CAN_send:19: error: cannot convert 'TinyGPSSpeed::kmph' from type 'double (TinyGPSSpeed::)()' to type 'byte {aka unsigned char}'

byte spd (gps.speed.kmph);

So, why are you trying to? You can NOT fit a size 13 foot in a size 8 shoe.

gps.speed.kmph is the name of a function. If you want to call the function so it can return a value, you must use the parentheses:

    byte spd = gps.speed.kmph();

This will round the floating-point speed value to an integer. As long as you don't go faster than 255kph, it's ok to put it in an 8-bit integer. :slight_smile:

There are other problems that may show up... If you have trouble getting both CAN and GPS to work simultaneously, you should take a look at NeoGPS. The example programs show the correct loop structure; that example and the notorious smartDelay usually cause problems when you add other things (e.g. CAN bus). NeoGPS and the examples are available from the Library Manager in the menu "Sketch -> Include Library -> Manage Libraries".

A secondary problem can be caused by SoftwareSerial. It disables interrupts for long periods of time. This can interfere with other parts of your sketch or with other libraries. I would suggest AltSoftSerial on pins 8 & 9, if you can use those pins instead of 10/11.

If you can't move the GPS to those pins, NeoSWSerial is almost as good, and it works on any two pins like SoftwareSerial. NeoSWSerial only supports baud rates 9600, 19200 and 38400, so it would work for the GPS.

Cheers,
/dev