Hi, I'm using an arduino mega pro and a GPS NEO-6M
I'm trying to show the GPS speed and altitude on two seven segment displays.
The problem is the GPS read is very slow and the displays flicker while reading data from the serial.
This is my code:
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 53, TXPin = 52;
static const uint32_t GPSBaud = 19200;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
int digitDelay = 0;
int SPEED = 0;
int ALTITUDE = 0;
int thousands1;
int hundreds1;
int tens1;
int units1;
int thousands2;
int hundreds2;
int tens2;
int units2;
int counter;
int gpsAltitudePin1 = A1;
int gpsAltitudePin2 = A2;
int gpsAltitudePin3 = A3;
int gpsSpeedPin1 = A4;
int digitPins1 [4] = {2, 4, 6, 8};
int segmentPins1 [7] = {3, 5, 7, 9, 11, 13, 15};
int digitPins2 [4] = {10, 12, 14, 16};
int segmentPins2 [7] = {17, 19, 21, 23, 25, 27, 29};
int zero [7] = {1, 1, 1, 1, 1, 1, 0};
int one [7] = {0, 1, 1, 0, 0, 0, 0};
int two [7] = {1, 1, 0, 1, 1, 0, 1};
int three [7] = {1, 1, 1, 1, 0, 0, 1};
int four [7] = {0, 1, 1, 0, 0, 1, 1};
int five [7] = {1, 0, 1, 1, 0, 1, 1};
int six [7] = {1, 0, 1, 1, 1, 1, 1};
int seven [7] = {1, 1, 1, 0, 0, 0, 0};
int eight [7] = {1, 1, 1, 1, 1, 1, 1};
int nine [7] = {1, 1, 1, 1, 0, 1, 1};
int numberArrays [10] = {zero, one, two, three, four, five, six, seven, eight, nine};
void setup() {
ss.begin(GPSBaud);
Serial.begin(9600);
for (int i = 0; i < 4; i++) {
pinMode(digitPins1[i], OUTPUT);
pinMode(digitPins2[i], OUTPUT);
}
for (int i = 0; i < 7; i++) {
pinMode(segmentPins1[i], OUTPUT);
pinMode(segmentPins2[i], OUTPUT);
}
counter = 0;
}
void clear(int dp[4], int sp[7]) {
for (int i = 0; i < 4; i++) {
digitalWrite(dp[i], LOW);
}
for (int i = 0; i < 7; i++) {
digitalWrite(sp[i], HIGH);
}
}
void setDigit(int digit[7], int sp[7]) {
for (int i = 0; i < 7; i++) {
if (digit[i] == 1) {
digitalWrite(sp[i], LOW);
}
}
}
void setNumbers(int number1, int number2, int dp1[4], int dp2[4], int sp1[7], int sp2[7]) {
if (number1 > 9999) {
number2 = 9999;
}
if (number2 > 9999) {
number2 = 9999;
}
clear(dp1, sp1);
clear(dp2, sp2);
thousands1 = number1 / 1000;
hundreds1 = (number1 - thousands1 * 1000) / 100;
tens1 = (number1 - thousands1 * 1000 - hundreds1 * 100) / 10;
units1 = (number1 - thousands1 * 1000 - hundreds1 * 100 - tens1 * 10);
thousands2 = number2 / 1000;
hundreds2 = (number2 - thousands2 * 1000) / 100;
tens2 = (number2 - thousands2 * 1000 - hundreds2 * 100) / 10;
units2 = (number2 - thousands2 * 1000 - hundreds2 * 100 - tens2 * 10);
if (thousands1 != 0) {
digitalWrite(dp1[0], HIGH);
setDigit(numberArrays[thousands1], sp1);
}
if (thousands2 != 0) {
digitalWrite(dp2[0], HIGH);
setDigit(numberArrays[thousands2], sp2);
}
delay(digitDelay);
clear(dp1, sp1);
clear(dp2, sp2);
if (thousands1 != 0 || hundreds1 != 0) {
digitalWrite(dp1[1], HIGH);
setDigit(numberArrays[hundreds1], sp1);
}
if (thousands2 != 0 || hundreds2 != 0) {
digitalWrite(dp2[1], HIGH);
setDigit(numberArrays[hundreds2], sp2);
}
delay(digitDelay);
clear(dp1, sp1);
clear(dp2, sp2);
if (thousands1 != 0 || hundreds1 != 0 || tens1 != 0) {
digitalWrite(dp1[2], HIGH);
setDigit(numberArrays[tens1], sp1);
}
if (thousands2 != 0 || hundreds2 != 0 || tens2 != 0) {
digitalWrite(dp2[2], HIGH);
setDigit(numberArrays[tens2], sp2);
}
delay(digitDelay);
clear(dp1, sp1);
clear(dp2, sp2);
digitalWrite(dp1[3], HIGH);
setDigit(numberArrays[units1], sp1);
digitalWrite(dp2[3], HIGH);
setDigit(numberArrays[units2], sp2);
delay(digitDelay);
clear(dp1, sp1);
clear(dp2, sp2);
}
void loop() {
// while (ss.available() > 0) {
// if (gps.encode(ss.read())) {
// ALTITUDE = gps.altitude.meters();
// SPEED = gps.speed.kmph();
// }
// }
while (ss.available() > 0) {
byte gpsData = ss.read();
Serial.write(gpsData);
}
setNumbers(ALTITUDE, SPEED, digitPins1, digitPins2, segmentPins1, segmentPins2);
}
I've tried changing the baud rate but even at maximum, the flickering is still visible. I was thinking on using and aditional arduino nano to read the gps data and send it to the main araduino through analogwrite or serial, but I don't think analogwrite works that way and serial would be as slow as the GPS so I will have the same problem.
Even if I replace the while loop for an if, the flickering still appears:
void loop() {
if (ss.available() > 0) {
byte gpsData = ss.read();
Serial.write(gpsData);
}
setNumbers(ALTITUDE, SPEED, digitPins1, digitPins2, segmentPins1, segmentPins2);
}
I'm running out of ideas, how can I do it?