I need to display all digits of longitude, but my oled screen is only displaying 2 decimals
I am using a htcc-AB02S Heltec
longitude is part of a scruct
struct recieveData{
double latitude;
double longitude;
double altitudeM;
double signalQuality;
int locationAge;
double speedKmph;
double courseDeg;
int satellitesConnected;
int gps_year;
int gps_day;
int gps_month;
int gps_hour;
int gps_minute;
int gps_second;
int gps_centisecond;
bool valid;
};
recieveData rGpsData;
and it stores a value -117.706266, but when I try to draw it on my oled screen display, it only shows two decimals. How do I print all of it?
lineString = "R long " + String(double(rGpsData.longitude));
full Reciever code (just the part about displaying is nessisary, the rest I know works and I know I'm getting values into long):
/*
parse data coming in and assign it to rdata stuffs on every recieve cycle.
*/
#include "Arduino.h"
#include <Wire.h>
#include "LoRaWan_APP.h"
#include "GPS_Air530.h"
#include "HT_SSD1306Wire.h"
SSD1306Wire screen(0x3c, 500000, SDA, SCL, GEOMETRY_128_64, GPIO10 ); // addr , freq , i2c group , resolution , rst
Air530Class Gps;
#ifndef LoraWan_RGB
#define LoraWan_RGB 0
#endif
#define RF_FREQUENCY 915000000 // Hz
#define TX_OUTPUT_POWER 14 // dBm
#define LORA_BANDWIDTH 0 // [0: 125 kHz,
// 1: 250 kHz,
// 2: 500 kHz,
// 3: Reserved]
#define LORA_SPREADING_FACTOR 7 // [SF7..SF12]
#define LORA_CODINGRATE 1 // [1: 4/5,
// 2: 4/6,
// 3: 4/7,
// 4: 4/8]
#define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx
#define LORA_SYMBOL_TIMEOUT 0 // Symbols
#define LORA_FIX_LENGTH_PAYLOAD_ON false
#define LORA_IQ_INVERSION_ON false
#define RX_TIMEOUT_VALUE 1000
#define BUFFER_SIZE 50 // Define the payload size here
char txpacket[BUFFER_SIZE];
char rxpacket[BUFFER_SIZE];
static RadioEvents_t RadioEvents;
int16_t txNumber;
int16_t rssi,rxSize;
struct recieveData{
double latitude;
double longitude;
double altitudeM;
double signalQuality;
int locationAge;
double speedKmph;
double courseDeg;
int satellitesConnected;
int gps_year;
int gps_day;
int gps_month;
int gps_hour;
int gps_minute;
int gps_second;
int gps_centisecond;
bool valid;
//year, day, month, hour, minute, second, centisecond, lat, lng, alt.meters, sats, hdop (quality), age, coursedeg, speedkmph
};
recieveData rGpsData;
struct selfData{
double latitude;
double longitude;
double altitudeM;
double signalQuality;
int locationAge;
double speedKmph;
double courseDeg;
int satellitesConnected;
int gps_year;
int gps_day;
int gps_month;
int gps_hour;
int gps_minute;
int gps_second;
int gps_centisecond;
bool valid;
};
selfData sGpsData;
uint32_t gpsTimer = 0;
uint32_t displayInformationTimer = 0;
int timer1000 = 1000;
void VextON(void){
pinMode(Vext,OUTPUT);
digitalWrite(Vext, LOW);
}
void VextOFF(void) {//Vext default OFF
pinMode(Vext,OUTPUT);
digitalWrite(Vext, HIGH);
}
void displayInformation();
void setup() {
Serial.begin(115200);
VextON();
Gps.begin(9600);
Gps.setmode(MODE_GPS);
rssi=0;
RadioEvents.RxDone = OnRxDone;
Radio.Init( &RadioEvents );
Radio.SetChannel( RF_FREQUENCY );
Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON,
0, true, 0, 0, LORA_IQ_INVERSION_ON, true );
screen.init();
screen.clear();
screen.display();
screen.setTextAlignment(TEXT_ALIGN_CENTER);
screen.setFont(ArialMT_Plain_10);
screen.drawString(screen.width()/2,screen.height()/2,"gps comms 2 RX");
screen.display();
delay(1000);
screen.clear();
Serial.println("into RX mode");
}
void loop(){
Radio.Rx( 0 );
delay(500);
Radio.IrqProcess( );
displayInformation();
}
void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ){
rssi=rssi;
rxSize=size;
memcpy(rxpacket, payload, size );
rxpacket[size]='\0';
//turnOnRGB(COLOR_RECEIVED,0);
Radio.Sleep( );
parseMessage(rxpacket,rxSize, rssi);
}
void parseMessage(char rxPacket[], int16_t rxSize, int16_t rssi){
Serial.printf("\r\nreceived packet \"%s\" with rssi %d , length %d\r\n",rxPacket,rssi,rxSize);
int numCommas = 0;
String tempMessage;
String val;
for(int i = 0; i <= rxSize; i++){
val = String(rxPacket[i]);
if(val == ","){
switch(numCommas){
case 0:
//int hour
rGpsData.gps_hour = tempMessage.toInt();
//Serial.print("CnC: "); Serial.print(numCommas);
//Serial.print("C tM: "); Serial.println(tempMessage);
break;
case 1:
//int minute
rGpsData.gps_minute = tempMessage.toInt();
//Serial.print("CnC: "); Serial.print(numCommas);
//Serial.print("C tM: "); Serial.println(tempMessage);
break;
case 2:
//int second
rGpsData.gps_second = tempMessage.toInt();
//Serial.print("CnC: "); Serial.print(numCommas);
//Serial.print("C tM: "); Serial.println(tempMessage);
break;
case 3:
//int sats
rGpsData.satellitesConnected = tempMessage.toInt();
Serial.print("rGpsData.satellitesConnected"); Serial.println(rGpsData.satellitesConnected);
//Serial.print("CnC: "); Serial.print(numCommas);
Serial.print("C tM: "); Serial.println(tempMessage);
break;
case 4:
//float lat
rGpsData.latitude = tempMessage.toDouble();
Serial.print("rGpsData.latitude"); Serial.println(rGpsData.latitude, 7);
//Serial.print("CnC: "); Serial.print(numCommas);
Serial.print("C tM: "); Serial.println(tempMessage);
break;
case 5:
//float long
rGpsData.longitude = tempMessage.toDouble();
Serial.print("rGpsData.longitude"); Serial.println(rGpsData.longitude, 7);
//Serial.print("CnC: "); Serial.print(numCommas);
Serial.print("C tM: "); Serial.println(tempMessage);
break;
case 6:
//double altitudeM
rGpsData.altitudeM = tempMessage.toDouble();
Serial.print("rGpsData.altitude"); Serial.println(rGpsData.altitudeM, 7);
//Serial.print("CnC: "); Serial.print(numCommas);
Serial.print(" tM: "); Serial.println(tempMessage);
break;
case 7:
//bool valid
if(tempMessage == "1"){
rGpsData.valid = true;
}
else if (tempMessage == "0"){
rGpsData.valid = false;
}
//Serial.print("CnC: "); Serial.print(numCommas);
//Serial.print("C tM: "); Serial.println(tempMessage);
break;
case 8:
Serial.println("8 commas");
Serial.print("8 nC: "); Serial.print(numCommas);
Serial.print("8 tM: "); Serial.println(tempMessage);
break;
}
//Serial.print(" == nC: "); Serial.print(numCommas);
//Serial.print(" == tM: "); Serial.println(tempMessage);
tempMessage = "";
numCommas++;
}
else if(val == "|"){
if(rxPacket[i-1] == '1'){
rGpsData.valid = true;
}
else if (rxPacket[i-1] == '0'){
rGpsData.valid = false;
}
Serial.print("Valid: "); Serial.println(rGpsData.valid);
break;
}
else{
tempMessage += val;
}
}
}
void displayInformation(){
if(millis() - displayInformationTimer >= timer1000){
updateSelfInfo();
Serial.println("========================");
String lineString;
screen.clear();
screen.setFont(ArialMT_Plain_10);
screen.setTextAlignment(TEXT_ALIGN_LEFT);
//recieved data
if(rGpsData.valid == true){
lineString = "R long " + String(double(rGpsData.longitude));// + " d " + String(rGpsData.gps_day) + "/" + String(rGpsData.gps_month) + "/" + String(rGpsData.gps_year);
screen.drawString(0, 0,lineString);
Serial.println(lineString);
lineString = " R lat " + String(double(rGpsData.latitude));// + " alt " + String(rGpsData.altitudeM) + " t " + String(rGpsData.gps_hour) + ":" + String(rGpsData.gps_minute) + ":" + String(rGpsData.gps_second);
screen.drawString(0, 16,lineString);
Serial.println(lineString);
}
else if(rGpsData.valid == false){
screen.setFont(ArialMT_Plain_16);
screen.setTextAlignment(TEXT_ALIGN_CENTER);
lineString = "Recieved INVALID";
screen.drawString(0, 0,lineString);
Serial.println(lineString);
}
//self data
if(sGpsData.valid == true){
lineString = "S long " + String(double(sGpsData.longitude));// + " d " + String(sGpsData.gps_day) + "/" + String(sGpsData.gps_month) + "/" + String(sGpsData.gps_year);
screen.drawString(0, 32,lineString);
Serial.println(lineString);
lineString = "lat " + String(double(sGpsData.latitude));// + " alt " + String(sGpsData.altitudeM) + " t " + String(sGpsData.gps_hour) + ":" + String(sGpsData.gps_minute) + ":" + String(sGpsData.gps_second);
screen.drawString(0, 48,lineString);
Serial.println(lineString);
}
else if(sGpsData.valid == false){
screen.setFont(ArialMT_Plain_16);
screen.setTextAlignment(TEXT_ALIGN_CENTER);
lineString = "SELF INVALID";
screen.drawString(0, 32,lineString);
Serial.println(lineString);
}
screen.display();
Serial.println("========================");
}
}
void updateSelfInfo(){
readGps();
/*//DEBUG PRINTS FOR LOOP
Serial.print("day: "); Serial.println(data.gps_day);
Serial.print("month: ");Serial.println(data.gps_month);
Serial.print("gps_year: "); Serial.println(data.gps_year);
Serial.print("hour: "); Serial.println(data.gps_hour);
Serial.print("gps_minute: "); Serial.println(data.gps_minute);
Serial.print("gps_second: "); Serial.println(data.gps_second);
Serial.print("gps_centisecond: "); Serial.println(data.gps_centisecond);
Serial.print("latitude: "); Serial.println(data.latitude);
Serial.print("longitude: "); Serial.println(data.longitude);
Serial.print("altitudeM: "); Serial.println(data.altitudeM);
Serial.print("satellites: "); Serial.println(data.satellitesConnected;);
Serial.print("signalQuality: "); Serial.println(data.signalQuality);
Serial.print("locationAge: "); Serial.println(data.locationAge);
Serial.print("courseDeg: "); Serial.println(data.courseDeg);
Serial.print("speedKmph: "); Serial.println(data.speedKmph);
Serial.println(">>>>>>>>>>>>>>>>>>....................");
delay(1000);
*/
if (Gps.date.isValid()){
sGpsData.valid = true;
sGpsData.gps_day = Gps.date.day();
sGpsData.gps_month = Gps.date.month();
sGpsData.gps_year = Gps.date.year();
}
else{
sGpsData.valid = false;
Serial.print("INVALID++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
}
if (Gps.time.isValid()){
sGpsData.valid = true;
sGpsData.gps_hour = Gps.time.hour();
sGpsData.gps_minute = Gps.time.minute();
sGpsData.gps_second = Gps.time.second();
sGpsData.gps_centisecond = Gps.time.centisecond();
}
else{
sGpsData.valid = false;
Serial.print(" INVALID++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
}
sGpsData.latitude = Gps.location.lat();
sGpsData.longitude = Gps.location.lng();
sGpsData.altitudeM = Gps.altitude.meters();
sGpsData.satellitesConnected = Gps.satellites.value();
sGpsData.signalQuality = Gps.hdop.hdop();
sGpsData.locationAge = Gps.location.age();
sGpsData.courseDeg = Gps.course.deg();
sGpsData.speedKmph = Gps.speed.kmph();
// debug prints
Serial.println("self+++++++++++++++++++++++++++++++++");
Serial.print("LAT: ");
Serial.println(sGpsData.latitude,6);
Serial.print(", LON: ");
Serial.println(sGpsData.longitude,6);
Serial.print(", ALT: ");
Serial.println(sGpsData.altitudeM);
Serial.print("SATS: ");
Serial.println(sGpsData.satellitesConnected);
Serial.print(", HDOP: ");
Serial.println(sGpsData.signalQuality);
Serial.print(", AGE: ");
Serial.println(sGpsData.locationAge);
Serial.print(", COURSE: ");
Serial.println(sGpsData.courseDeg);
Serial.print(", SPEED: ");
Serial.println(sGpsData.speedKmph);
Serial.println("++++++++++++++++++++++++++++++");
Serial.println("recieved:::::::::::::::::::::::::::::::");
Serial.print("LAT: ");
Serial.println(rGpsData.latitude,6);
Serial.print(", LON: ");
Serial.println(rGpsData.longitude,6);
Serial.print(", ALT: ");
Serial.println(rGpsData.altitudeM);
Serial.print("SATS: ");
Serial.println(rGpsData.satellitesConnected);
Serial.print("valid: ");
Serial.println(rGpsData.valid);
Serial.println("recieved:::::::::::::::::::::");
}
/*
double latitude;
double longitude;
double altitudeM;
double signalQuality;
int locationAge;
double speedKmph;
double courseDeg;
int satellitesConnected;
int gps_year;
int gps_day;
int gps_month;
int gps_hour;
int gps_minute;
int gps_second;
int gps_centisecond;
bool valid;
*/
void readGps(){
if(millis() - gpsTimer > timer1000){
while(Gps.available() > 0){
Gps.encode(Gps.read());
}
gpsTimer = millis();
}
if (millis() > 5000 && Gps.charsProcessed() < 10)
{
sGpsData.valid = false;
Serial.println("No GPS detected: check wiring.");
while(true);
}
}
