Created
July 6, 2017 07:49
-
-
Save key/6ab80db7dd277d61f271aeb0f698381f to your computer and use it in GitHub Desktop.
sakuraio: some values into single channel
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <TinyGPS++.h> | |
#include <SoftwareSerial.h> | |
#include <SakuraIO.h> | |
#include <string.h> | |
/* | |
This sample code demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object. | |
It requires the use of SoftwareSerial, and assumes that you have a | |
4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx). | |
*/ | |
static const int RXPin = 4, TXPin = 3; | |
static const int GPSBaud = 9600; | |
// The TinyGPS++ object | |
TinyGPSPlus gps; | |
TinyGPSCustom c_hdop(gps, "GPGSA", 16); // $GPGSA sentence, 17th element | |
TinyGPSCustom c_vdop(gps, "GPGSA", 17); // $GPGSA sentence, 17th element | |
// The serial connection to the GPS device | |
SoftwareSerial ss(RXPin, TXPin); | |
// Sakura IoT | |
SakuraIO_I2C sakuraio; | |
void setup() | |
{ | |
Serial.begin(115200); | |
ss.begin(GPSBaud); | |
Serial.print("Waiting to come online"); | |
for (;;) { | |
if ((sakuraio.getConnectionStatus() & 0x80) == 0x80) { | |
Serial.println(" connected"); | |
break; | |
} | |
Serial.print("."); | |
delay(100); | |
} | |
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("---------------------------------------------------------------------------------------------------------------------------------------")); | |
} | |
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(); | |
// channel 1 latitude and longitude | |
float lng = float(gps.location.lng()); | |
float lat = float(gps.location.lat()); | |
unsigned char (&_lng)[8] = reinterpret_cast<unsigned char (&)[8]>(lng); | |
unsigned char (&_lat)[sizeof(float)] = reinterpret_cast<unsigned char (&)[sizeof(float)]>(lat); | |
memcpy(_lng + 4, _lat, 4); | |
sakuraio.enqueueTx(1, _lng); | |
// channel 2 altitude, hdop, vdop | |
float alt = float(gps.altitude.meters()); // , gps.altitude.isValid() | |
// int16_t _hdop = int16_t(gps.hdop.value()); | |
int16_t _hdop = int16_t(strtod(c_hdop.value(), NULL) * 100.0); | |
int16_t _vdop = int16_t(strtod(c_vdop.value(), NULL) * 100.0); | |
unsigned char (&_ch2)[8] = reinterpret_cast<unsigned char(&)[8]>(alt); | |
unsigned char (&__hdop)[2] = reinterpret_cast<unsigned char(&)[2]>(_hdop); | |
unsigned char (&__vdop)[2] = reinterpret_cast<unsigned char(&)[2]>(_vdop); | |
memcpy(_ch2 + 4, __hdop, 2); | |
memcpy(_ch2 + 6, __vdop, 2); | |
sakuraio.enqueueTx(2, _ch2); | |
sakuraio.send(); | |
smartDelay(2000); | |
// 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); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment