├── README.md ├── esp32 sim800l firebase.png └── esp32-firebase-gsm-gps.ino /README.md: -------------------------------------------------------------------------------- 1 | # esp32-firebase-gsm-gps -------------------------------------------------------------------------------- /esp32 sim800l firebase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahmadlogs/esp32-firebase-gsm-gps/HEAD/esp32 sim800l firebase.png -------------------------------------------------------------------------------- /esp32-firebase-gsm-gps.ino: -------------------------------------------------------------------------------- 1 | //Select your modem 2 | //SSL/TLS is currently supported only with SIM8xx series 3 | #define TINY_GSM_MODEM_SIM800 4 | 5 | //Increase RX buffer 6 | #define TINY_GSM_RX_BUFFER 256 7 | 8 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 9 | #include //https://github.com/mikalhart/TinyGPSPlus 10 | #include //https://github.com/vshymanskyy/TinyGSM 11 | #include //https://github.com/arduino-libraries/ArduinoHttpClient 12 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 13 | 14 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 15 | const char FIREBASE_HOST[] = "ENTER_FIREBASE_HOST"; 16 | const String FIREBASE_AUTH = "ENTER_FIREBASE_AUTH"; 17 | const String FIREBASE_PATH = "/"; 18 | const int SSL_PORT = 443; 19 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 20 | 21 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 22 | // Your GPRS credentials 23 | // Leave empty, if missing user or pass 24 | char apn[] = "internet"; 25 | char user[] = ""; 26 | char pass[] = ""; 27 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 28 | 29 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 30 | //GSM Module RX pin to ESP32 2 31 | //GSM Module TX pin to ESP32 4 32 | #define rxPin 4 33 | #define txPin 2 34 | HardwareSerial sim800(1); 35 | TinyGsm modem(sim800); 36 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 37 | 38 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 39 | //GPS Module RX pin to ESP32 17 40 | //GPS Module TX pin to ESP32 16 41 | #define RXD2 16 42 | #define TXD2 17 43 | HardwareSerial neogps(2); 44 | TinyGPSPlus gps; 45 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 46 | 47 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 48 | TinyGsmClientSecure gsm_client_secure_modem(modem, 0); 49 | HttpClient http_client = HttpClient(gsm_client_secure_modem, FIREBASE_HOST, SSL_PORT); 50 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 51 | 52 | unsigned long previousMillis = 0; 53 | long interval = 10000; 54 | 55 | //************************************************************************************************** 56 | void setup() { 57 | Serial.begin(115200); 58 | Serial.println("esp32 serial initialize"); 59 | 60 | sim800.begin(9600, SERIAL_8N1, rxPin, txPin); 61 | Serial.println("SIM800L serial initialize"); 62 | 63 | neogps.begin(9600, SERIAL_8N1, RXD2, TXD2); 64 | Serial.println("neogps serial initialize"); 65 | delay(3000); 66 | 67 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 68 | //Restart takes quite some time 69 | //To skip it, call init() instead of restart() 70 | Serial.println("Initializing modem..."); 71 | modem.restart(); 72 | String modemInfo = modem.getModemInfo(); 73 | Serial.print("Modem: "); 74 | Serial.println(modemInfo); 75 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 76 | 77 | // Unlock your SIM card with a PIN 78 | //modem.simUnlock("1234"); 79 | 80 | http_client.setHttpResponseTimeout(90 * 1000); //^0 secs timeout 81 | } 82 | //************************************************************************************************** 83 | 84 | 85 | //************************************************************************************************** 86 | void loop() { 87 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 88 | //Restart takes quite some time 89 | //To skip it, call init() instead of restart() 90 | //Serial.println("Initializing modem..."); 91 | //modem.init(); 92 | //String modemInfo = modem.getModemInfo(); 93 | //Serial.print("Modem: "); 94 | //Serial.println(modemInfo); 95 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 96 | 97 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 98 | //Serial.print(F("Waiting for network...")); 99 | //if (!modem.waitForNetwork()) { 100 | //Serial.println(" fail"); 101 | //delay(1000); 102 | //return; 103 | //} 104 | //Serial.println(" OK"); 105 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 106 | 107 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 108 | Serial.print(F("Connecting to ")); 109 | Serial.print(apn); 110 | if (!modem.gprsConnect(apn, user, pass)) { 111 | Serial.println(" fail"); 112 | delay(1000); 113 | return; 114 | } 115 | Serial.println(" OK"); 116 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 117 | 118 | http_client.connect(FIREBASE_HOST, SSL_PORT); 119 | 120 | //MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM 121 | while (true) { 122 | if (!http_client.connected()) { 123 | Serial.println(); 124 | http_client.stop();// Shutdown 125 | Serial.println("HTTP not connect"); 126 | break; 127 | } 128 | else{ 129 | gps_loop(); 130 | } 131 | } 132 | //MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM 133 | } 134 | //************************************************************************************************** 135 | 136 | //************************************************************************************************** 137 | void PostToFirebase(const char* method, const String & path , const String & data, HttpClient* http) { 138 | String response; 139 | int statusCode = 0; 140 | http->connectionKeepAlive(); // Currently, this is needed for HTTPS 141 | 142 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 143 | String url; 144 | if (path[0] != '/') { 145 | url = "/"; 146 | } 147 | url += path + ".json"; 148 | url += "?auth=" + FIREBASE_AUTH; 149 | Serial.print("POST:"); 150 | Serial.println(url); 151 | Serial.print("Data:"); 152 | Serial.println(data); 153 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 154 | 155 | String contentType = "application/json"; 156 | http->put(url, contentType, data); 157 | 158 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 159 | // read the status code and body of the response 160 | //statusCode-200 (OK) | statusCode -3 (TimeOut) 161 | statusCode = http->responseStatusCode(); 162 | Serial.print("Status code: "); 163 | Serial.println(statusCode); 164 | response = http->responseBody(); 165 | Serial.print("Response: "); 166 | Serial.println(response); 167 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 168 | 169 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 170 | if (!http->connected()) { 171 | Serial.println(); 172 | http->stop();// Shutdown 173 | Serial.println("HTTP POST disconnected"); 174 | } 175 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 176 | } 177 | //************************************************************************************************** 178 | 179 | 180 | //************************************************************************************************** 181 | void gps_loop() 182 | { 183 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 184 | //Can take up to 60 seconds 185 | boolean newData = false; 186 | for (unsigned long start = millis(); millis() - start < 2000;){ 187 | while (neogps.available()){ 188 | if (gps.encode(neogps.read())){ 189 | newData = true; 190 | break; 191 | } 192 | } 193 | } 194 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 195 | 196 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 197 | //If newData is true 198 | if(true){ 199 | newData = false; 200 | 201 | String latitude, longitude; 202 | //float altitude; 203 | //unsigned long date, time, speed, satellites; 204 | 205 | latitude = String(gps.location.lat(), 6); // Latitude in degrees (double) 206 | longitude = String(gps.location.lng(), 6); // Longitude in degrees (double) 207 | 208 | //altitude = gps.altitude.meters(); // Altitude in meters (double) 209 | //date = gps.date.value(); // Raw date in DDMMYY format (u32) 210 | //time = gps.time.value(); // Raw time in HHMMSSCC format (u32) 211 | //speed = gps.speed.kmph(); 212 | 213 | Serial.print("Latitude= "); 214 | Serial.print(latitude); 215 | Serial.print(" Longitude= "); 216 | Serial.println(longitude); 217 | 218 | String gpsData = "{"; 219 | gpsData += "\"lat\":" + latitude + ","; 220 | gpsData += "\"lng\":" + longitude + ""; 221 | gpsData += "}"; 222 | 223 | //PUT Write or replace data to a defined path, like messages/users/user1/ 224 | //PATCH Update some of the keys for a defined path without replacing all of the data. 225 | //POST Add to a list of data in our Firebase database. Every time we send a POST request, the Firebase client generates a unique key, like messages/users// 226 | //https://firebase.google.com/docs/database/rest/save-data 227 | 228 | PostToFirebase("PATCH", FIREBASE_PATH, gpsData, &http_client); 229 | 230 | 231 | } 232 | //NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 233 | } 234 | //************************************************************************************************** 235 | --------------------------------------------------------------------------------