Hello friends
i am trying to build a gps tracker and encountered an an error which i dont know how to solve
using adafruit. i.o cloud
Error : Compilation error: 'RTC_DATA_ATTR' does not name a type
Error : "Compilation error: 'RTC_DATA_ATTR' does not name a type"https://www.youtube.com/watch?v=7gG57DVETAo[youtube](https://www.youtube.com/watch?v=7gG57DVETAo)
project source youtube
THANK YOU
code:
#define TINY_GSM_MODEM_SIM7000
// Set serial for debug console (to the Serial Monitor, default speed 115200)
#define SerialMon Serial
// Set serial for AT commands (to the module)
// Use Hardware Serial on Mega, Leonardo, Micro
#define SerialAT Serial1
// Define the serial console for debug prints, if needed
#define TINY_GSM_DEBUG SerialMon
// Define how you're planning to connect to the internet
// These defines are only for this example; they are not needed in other code.
#define TINY_GSM_USE_GPRS true
#define TINY_GSM_USE_WIFI false
// Your GPRS credentials, if any
const char apn[] = "APN_NAME";
const char gprsUser[] = "io.adafruit.com";
const char gprsPass[] = "";
// MQTT details
const char *broker = "SERVER_NAME";
const char *GPSTopic = "Arrow118/feeds/gpsloc/csv";
const char *BatTopic = "BATTERY_TOPIC";
#include <TinyGsmClient.h>
#include <PubSubClient.h>
// Just in case someone defined the wrong thing..
#if TINY_GSM_USE_GPRS && not defined TINY_GSM_MODEM_HAS_GPRS
#undef TINY_GSM_USE_GPRS
#undef TINY_GSM_USE_WIFI
#define TINY_GSM_USE_GPRS false
#define TINY_GSM_USE_WIFI true
#endif
#if TINY_GSM_USE_WIFI && not defined TINY_GSM_MODEM_HAS_WIFI
#undef TINY_GSM_USE_GPRS
#undef TINY_GSM_USE_WIFI
#define TINY_GSM_USE_GPRS true
#define TINY_GSM_USE_WIFI false
#endif
#ifdef DUMP_AT_COMMANDS
#include <StreamDebugger.h>
StreamDebugger debugger(SerialAT, SerialMon);
TinyGsm modem(debugger);
#else
TinyGsm modem(SerialAT);
#endif
TinyGsmClient client(modem);
PubSubClient mqtt(client);
#define uS_TO_S_FACTOR 1000000ULL // Conversion factor for micro seconds to seconds
#define TIME_TO_SLEEP 120 // Time ESP32 will go to sleep (in seconds)
#define UART_BAUD 9600
#define PIN_DTR 25
#define PIN_TX 27
#define PIN_RX 26
#define PWR_PIN 4
#define BAT_ADC 35
#define LED_PIN 12
float speed_kph = 0;
float heading = 0;
float speed_mph = 0;
float altitude = 0;
float lat = 0;
float lon = 0;
char Lat[20];
char Lon[20];
char sendbuffer[120];
const char* Bat_value;
RTC_DATA_ATTR int bootCount = 0;
float readBattery(uint8_t pin)
{
int vref = 1100;
uint16_t volt = analogRead(pin);
float battery_voltage = ((float)volt / 4095.0) * 2.0 * 3.3 * (vref);
return battery_voltage;
}
int ledStatus = LOW;
uint32_t lastReconnectAttempt = 0;
void transCoordinates()
{
while (lat <= 0 || lon <= 0)
{
modem.sendAT("+SGPIO=0,4,1,1");
if (modem.waitResponse(10000L) != 1) {
Serial.println(" SGPIO=0,4,1,1 false ");
}
modem.enableGPS();
Serial.println("Requesting current GPS/GNSS/GLONASS location");
if (modem.getGPS(&lat, &lon))
{
Serial.println("Latitude: " + String(lat, 8) + "\tLongitude: " + String(lon, 8));
}
}
char *p = sendbuffer;
// add speed value
dtostrf(speed_mph, 2, 6, p);
p += strlen(p);
p[0] = ','; p++;
// concat latitude
dtostrf(lat, 2, 6, p);
p += strlen(p);
p[0] = ','; p++;
// concat longitude
dtostrf(lon, 3, 6, p);
p += strlen(p);
p[0] = ','; p++;
// concat altitude
dtostrf(altitude, 2, 6, p);
p += strlen(p);
// null terminate
p[0] = 0;
Serial.print("Sending: "); Serial.println(sendbuffer); // (Speed,Latitude,Longitude,Altitude)
mqtt.publish(GPSTopic, sendbuffer);
// Reading and Sending Battery Voltage
float mv = readBattery(BAT_ADC);
Serial.println(mv);
// int Bat_Percentage = map (mv, 3300, 4200, 0, 100);
// if (Bat_Percentage < 0) Bat_Percentage = 0;
// if (Bat_Percentage > 100) Bat_Percentage = 100;
String TEMP = (String)mv;
Bat_value = (char*) TEMP.c_str();
Serial.println(Bat_value);
mqtt.publish(BatTopic, Bat_value);
}
void mqttCallback(char *topic, byte *payload, unsigned int len)
{
SerialMon.print("Message arrived [");
SerialMon.print(topic);
SerialMon.print("]: ");
SerialMon.write(payload, len);
SerialMon.println();
}
boolean mqttConnect()
{
SerialMon.print("Connecting to ");
SerialMon.print(broker);
// Connect to MQTT Broker
//boolean status = mqtt.connect("GsmClientTest");
// Or, if you want to authenticate MQTT:
boolean status = mqtt.connect("GsmClientName", "Arrow118", "aio_xKxc53nmmI8iKAz9IKlgHlrClhzv");
if (status == false) {
SerialMon.println(" fail");
return false;
}
SerialMon.println(" success");
//mqtt.publish(topicInit, "GsmClientTest started");
return mqtt.connected();
}
void setup()
{
// Set console baud rate
Serial.begin(115200);
delay(10);
// Set LED OFF
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH);
pinMode(PWR_PIN, OUTPUT);
digitalWrite(PWR_PIN, HIGH);
delay(300);
digitalWrite(PWR_PIN, LOW);
Serial.println("\nWait...");
delay(1000);
SerialAT.begin(UART_BAUD, SERIAL_8N1, PIN_RX, PIN_TX);
if (bootCount == 0)
{
// Restart takes quite some time
// To skip it, call init() instead of restart()
Serial.println("Initializing modem...");
if (!modem.restart()) {
Serial.println("Failed to restart modem, attempting to continue without restarting");
}
bootCount++;
}
String name = modem.getModemName();
DBG("Modem Name:", name);
String modemInfo = modem.getModemInfo();
DBG("Modem Info:", modemInfo);
#if TINY_GSM_USE_GPRS && defined TINY_GSM_MODEM_XBEE
// The XBee must run the gprsConnect function BEFORE waiting for network!
modem.gprsConnect(apn, gprsUser, gprsPass);
#endif
SerialMon.print("Waiting for network...");
if (!modem.waitForNetwork()) {
SerialMon.println(" fail");
delay(10000);
return;
}
SerialMon.println(" success");
if (modem.isNetworkConnected()) {
SerialMon.println("Network connected");
}
#if TINY_GSM_USE_GPRS
// GPRS connection parameters are usually set after network registration
SerialMon.print(F("Connecting to "));
SerialMon.print(apn);
if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
SerialMon.println(" fail");
delay(10000);
return;
}
SerialMon.println(" success");
if (modem.isGprsConnected()) {
SerialMon.println("GPRS connected");
}
#endif
// MQTT Broker setup
mqtt.setServer(broker, 1883);
mqtt.setCallback(mqttCallback);
}
void loop()
{
// Make sure we're still registered on the network
if (!modem.isNetworkConnected())
{
SerialMon.println("Network disconnected");
if (!modem.waitForNetwork(180000L, true))
{
SerialMon.println(" fail");
delay(10000);
return;
}
if (modem.isNetworkConnected())
{
SerialMon.println("Network re-connected");
}
#if TINY_GSM_USE_GPRS
// and make sure GPRS/EPS is still connected
if (!modem.isGprsConnected())
{
SerialMon.println("GPRS disconnected!");
SerialMon.print(F("Connecting to "));
SerialMon.print(apn);
if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
SerialMon.println(" fail");
delay(10000);
return;
}
if (modem.isGprsConnected()) {
SerialMon.println("GPRS reconnected");
}
}
#endif
}
if (!mqtt.connected())
{
SerialMon.println("=== MQTT NOT CONNECTED ===");
// Reconnect every 10 seconds
uint32_t t = millis();
if (t - lastReconnectAttempt > 10000L)
{
lastReconnectAttempt = t;
if (mqttConnect()) {
lastReconnectAttempt = 0;
}
}
delay(100);
return;
}
mqtt.loop();
transCoordinates();
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
esp_deep_sleep_start();
Thank you