Is it at all feasible to use ATtiny85 connected via software serial to a GPS module to receive GPS data (ATtiny RX connected to GPS TX), and connect the software serial TX to connect to a GSM module to transmit a text message (with GPS coordinates)?
I refer to previous posts years ago (ie https://digistump.com/board/index.php?topic=1373.0 ) where a compilable program is used (below) to receive GPS data on an ATtiny (Digispark).
I assume that the Digispark internal clock will need to be calibrated (OSCCAL) so as to ensure proper software serial functioning.
Many thanks for any useful information or comments!
// Include the SoftwareSerial library
#include <SoftwareSerial.h>
// Constants
#define txPin 5 //tx pin in GPS connection
#define rxPin 3 //rx pin in GPS connection
// Set up the GPS serial port
SoftwareSerial gps = SoftwareSerial(rxPin, txPin);
// Variables
byte byteGPS = 0;
int i = 0;
int state = 0;
char dataGPG[100] = "";
char *pch;
char *GGA[15];
int sat = 0;
void setup()
{
//setup for Serial Port
Serial.begin(9600);
// clear screen
// Serial.write(0xFE);
// Serial.write(0x1);
// delay(10);
//setup for GPS Serial Port
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
gps.begin(4800);
//setup satellites signal
pinMode(1, OUTPUT);
digitalWrite(1, LOW); // Turn off the led until a satellite signal
// Serial.write(0xFE);
// Serial.write(0x80);
// delay(10);
}
void loop()
{
Serial.write(254); // cursor to beginning of first line
Serial.write(128);
Serial.print("Waiting GPS data...");
// Prepare all for reading GPS Serial Port
memset(dataGPG, 0, sizeof(dataGPG)); // Remove previous readings
byteGPS = 0; // Remove data
byteGPS = gps.read(); // Read the byte that is in the GPS serial port
delay(1000);
Serial.print("DEBUG1");
delay(1000);
// Find the desired string
while (byteGPS != '$')
{
byteGPS = gps.read();
}
Serial.print("DEBUG2");
delay(1000);
// Save the string in an array
i = 1;
dataGPG[0] = '$';
Serial.print("DEBUG3");
delay(1000);
while (byteGPS != '*' )
{
byteGPS = gps.read();
dataGPG[i] = byteGPS;
i++;
}
dataGPG[i] = '\0';
string(); // Call to the function that manipulates our string
Serial.print("DEBUG4");
delay(1000);
}
/*
This function will allow us to identify the data we need to get the longitude, latitude ...
*/
void string()
{
i = 0;
memset(GGA, 0, sizeof(GGA)); // Remove previous readings
pch = strtok (dataGPG, ",");
// Analyze the saved interval in pch to see if it the needed string
if (strcmp(pch, "$GPGGA") == 0)
{
while (pch != NULL)
{
pch = strtok (NULL, ",");
GGA[i] = pch;
i++;
}
plot(GGA, "$GPGGA"); // Call to the function that is going to display the data
}
}
/*
This function organize the gps data received for printing in the serial monitor.
*/
void plot(char **GGAPrint, char *trama)
{
state = atoi(GGAPrint[5]);
sat = atoi(GGAPrint[6]);
if (trama == "$GPGGA" && state == 1)
{
digitalWrite(1, HIGH); // Then there are satellites, the LED switch ON
//Serial.println("");
//Serial.println("----------------------------------------------");
//Serial.print("UTC Hour -> ");
//Serial.println(GGAPrint[0]);
//Serial.print("Latitude -> ");
//Serial.print(GGAPrint[1]);
//Serial.println(GGAPrint[2]);
//Serial.print("Longitude -> ");
//Serial.print(GGAPrint[3]);
//Serial.println(GGAPrint[4]);
//Serial.print("GPS quality: 0=null; 1=GPS fixed -> ");
//Serial.println(GGAPrint[5]);
//Serial.print("Number of satellites -> ");
//Serial.println(sat);
//Serial.print("Horizontal Dilution of Precision -> ");
//Serial.println(GGAPrint[7]);
Serial.print("Antenna altitude -> ");
Serial.print(GGAPrint[8]);
Serial.println(GGAPrint[9]);
//Serial.print("Geoid Separation -> ");
//Serial.print(GGAPrint[10]);
//Serial.println(GGAPrint[11]);
//Serial.println("----------------------------------------------");
//Serial.println("");
}
else // If no satellite connection
{
digitalWrite(1, LOW); // Turn off the LED
//Serial.println("");
//Serial.println("-----------------------------");
//Serial.print("|--- Satellites Used -->");
//Serial.print(sat);
//Serial.println(" |");
Serial.println("Waiting location");
//Serial.println("-----------------------------");
//Serial.println("");
}
}