GPS Module Interfacing with NodeMCU ESP8266
In this tutorial we learn How to GPS Module Interfacing with NodeMCU ESP8266. NodeMCU is an open source IoT platform. It includes firmware which runs on the ESP8266 Wi-Fi SoC from Espressif Systems, and hardware which is based on the ESP-12 module. The term “NodeMCU” by default refers to the firmware rather than the development kits. The firmware uses the Lua scripting language. It is based on the eLua project, and built on the Espressif Non-OS SDK for ESP8266.
Recommended:
- LED using Blynk and ESP8266 (Node MCU)
- NodeMCU ESP8266 with DHT11 and Firebase Real-Time Database
- RFID Reader MFRC522 interface with NodeMCU using Arduino IDE
- GPIO pins of ESP8266 and How to use efficiently
- DHT11 sensor with ESP8266/NodeMCU using Arduino IDE
Components Required
- NodeMCU ESP8266
- GPS module- Ublox 6m
- Jumper wires
Configuring Arduino IDE for NodeMCU
If you are not familiar with Arduino IDE, Visit this: Arduino Support for ESP8266 with simple test code.
Circuit Diagram
Connect the Ublox Neo 6m GPS module directly to NodeMCU board by connecting GND pin of neo 6m to GND pin of NodeMCU and VCC pin to 3v3 pin. Also connect RXD to D1 and TXD to D2.
Programming NodeMCU with Arduino IDE for sending GPS data to Local server
First download and install TinyGPS library into Arduino IDE by Arduino IDE going into Sketch>>Include library>>Add .ZIP library. The library can be downloaded from this link. Then include all the required libraries and define all the variables in program as shown below:
#include <TinyGPS++.h> // library for GPS module #include <SoftwareSerial.h> #include <ESP8266WiFi.h> TinyGPSPlus gps; // The TinyGPS++ object SoftwareSerial ss(4, 5); // The serial connection to the GPS device const char* ssid = "SSID name"; //ssid of your wifi const char* password = "password"; //password of your wifi float latitude , longitude; int year , month , date, hour , minute , second; String date_str , time_str , lat_str , lng_str; int pm; WiFiServer server(80);
To connect NodeMCU to your WiFi network we need to add the WiFi network’s SSID and Password inside the code.
Inside the setup() function, begin with the baud rate as 115200. After this initialize the WiFi connection using the WiFi SSID and password. Once the NodeMCU is connected to the WiFi network a local IP address will be generated and displayed on the serial monitor. This IP address will be used to access the GPS location data from your phone or laptop.
void setup() { Serial.begin(115200); ss.begin(9600); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); //connecting to wifi while (WiFi.status() != WL_CONNECTED)// while wifi not connected { delay(500); Serial.print("."); //print "...." } Serial.println(""); Serial.println("WiFi connected"); server.begin(); Serial.println("Server started"); Serial.println(WiFi.localIP()); // Print the IP address }
Inside the loop() function, we are continuously checking if the GPS data is available and if it is available we extract the latitude, longitude, date and time from the NMEA string received from the GPS module.
The data from the GPS module is continue string of 28 characters which will contain Latitude, Longitude, Date, Time and many other information. It is called NMEA string, to learn more about it, follow the link.
$GPGGA,104534.000,7791.0381,N,06727.4434,E,1,08,0.9,510.4,M,43.9,M,,*47 $GPGGA,HHMMSS.SSS,latitude,N,longitude,E,FQ,NOS,HDP,altitude,M,height,M,,checksum data
TinyGPS library has inbuilt function to get the required data from the NMEA string. So here in the below code we extract the latitude, longitude, date and time from the string and stored the values in the variables “lat_str”, “lng_str, “date_str” and “time_str” respectively.
Time that we get from the GPS module will be in GMT format. So first separate the time data from the long string then convert this to local time format
void loop() { while (ss.available() > 0) //while data is available if (gps.encode(ss.read())) //read gps data { if (gps.location.isValid()) //check whether gps location is valid { latitude = gps.location.lat(); lat_str = String(latitude , 6); // latitude location is stored in a string longitude = gps.location.lng(); lng_str = String(longitude , 6); //longitude location is stored in a string } if (gps.date.isValid()) //check whether gps date is valid { date_str = ""; date = gps.date.day(); month = gps.date.month(); year = gps.date.year(); if (date < 10) date_str = '0'; date_str += String(date);// values of date,month and year are stored in a string date_str += " / "; ……………….. ……………………………..
Now add HTML code to display the GPS data on the webpage. So here all the HTML code is embedded into a variable called “s”, then this variable is printed using client.print(s) to send all embedded HTML code to webpage.
WiFiClient client = server.available(); // Check if a client has connected if (!client) { return; } // Prepare the response String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n <!DOCTYPE html> <html> <head> <title>GPS DATA</title> <style>"; s += "a:link {background-color: YELLOW;text-decoration: none;}"; s += "table, th, td </style> </head> <body> <h1 style="; s += "font-size:300%;"; s += " ALIGN=CENTER> GPS DATA **IoTbyHVM.OOO**</h1>"; s += "<p ALIGN=CENTER style=""font-size:150%;"""; s += "> <b>Location Details</b></p> <table ALIGN=CENTER style="; s += "width:50%"; s += "> <tr> <th>Latitude</th>"; s += "<td ALIGN=CENTER >"; s += lat_str; s += "</td> </tr> <tr> <th>Longitude</th> <td ALIGN=CENTER >"; s += lng_str; s += "</td> </tr> <tr> <th>Date</th> <td ALIGN=CENTER >"; s += date_str; s += "</td></tr> <tr> <th>Time</th> <td ALIGN=CENTER >"; s += time_str; s += "</td> </tr> </table> "; s += "</body> </html> \n"; client.print(s); // all the values are send to the webpage delay(100); }
Now once the code is uploaded into NodeMCU open the serial monitor. In the serial monitor you will be able to see some information like whether the WiFi is connected or not. If it is connected you will get the local IP address, here it is 192.168.1.09 (This be different for you). Note down the one that displayed on your serial monitor. If the serial monitor is showing blank then press RESET button on NodeMCU board.
Sometimes it takes a couple of minutes to connect the GPS module to the satellite. Once it get connected a blue LED will start to blink on the module.
Now open a webpage from your computer (just open a page in Google chrome, Firefox or any browser) and type the IP address that we collected from the serial monitor in the address bar and press ENTER. Now you will be able to see the location,date and time displayed on your computer screen.
Full Code
#include <TinyGPS++.h> // library for GPS module #include <SoftwareSerial.h> #include <ESP8266WiFi.h> TinyGPSPlus gps; // The TinyGPS++ object SoftwareSerial ss(4, 5); // The serial connection to the GPS device const char* ssid = "ssid name"; //ssid of your wifi const char* password = "password"; //password of your wifi float latitude , longitude; int year , month , date, hour , minute , second; String date_str , time_str , lat_str , lng_str; int pm; WiFiServer server(80); void setup() { Serial.begin(115200); ss.begin(9600); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); //connecting to wifi while (WiFi.status() != WL_CONNECTED)// while wifi not connected { delay(500); Serial.print("."); //print "...." } Serial.println(""); Serial.println("WiFi connected"); server.begin(); Serial.println("Server started"); Serial.println(WiFi.localIP()); // Print the IP address } void loop() { while (ss.available() > 0) //while data is available if (gps.encode(ss.read())) //read gps data { if (gps.location.isValid()) //check whether gps location is valid { latitude = gps.location.lat(); lat_str = String(latitude , 6); // latitude location is stored in a string longitude = gps.location.lng(); lng_str = String(longitude , 6); //longitude location is stored in a string } if (gps.date.isValid()) //check whether gps date is valid { date_str = ""; date = gps.date.day(); month = gps.date.month(); year = gps.date.year(); if (date < 10) date_str = '0'; date_str += String(date);// values of date,month and year are stored in a string date_str += " / "; if (month < 10) date_str += '0'; date_str += String(month); // values of date,month and year are stored in a string date_str += " / "; if (year < 10) date_str += '0'; date_str += String(year); // values of date,month and year are stored in a string } if (gps.time.isValid()) //check whether gps time is valid { time_str = ""; hour = gps.time.hour(); minute = gps.time.minute(); second = gps.time.second(); minute = (minute + 30); // converting to IST if (minute > 59) { minute = minute - 60; hour = hour + 1; } hour = (hour + 5) ; if (hour > 23) hour = hour - 24; // converting to IST if (hour >= 12) // checking whether AM or PM pm = 1; else pm = 0; hour = hour % 12; if (hour < 10) time_str = '0'; time_str += String(hour); //values of hour,minute and time are stored in a string time_str += " : "; if (minute < 10) time_str += '0'; time_str += String(minute); //values of hour,minute and time are stored in a string time_str += " : "; if (second < 10) time_str += '0'; time_str += String(second); //values of hour,minute and time are stored in a string if (pm == 1) time_str += " PM "; else time_str += " AM "; } } WiFiClient client = server.available(); // Check if a client has connected if (!client) { return; } // Prepare the response String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n <!DOCTYPE html> <html> <head> <title>GPS DATA</title> <style>"; s += "a:link {background-color: YELLOW;text-decoration: none;}"; s += "table, th, td </style> </head> <body> <h1 style="; s += "font-size:300%;"; s += " ALIGN=CENTER> GPS DATA **IoTbyHVM.OOO**</h1>"; s += "<p ALIGN=CENTER style=""font-size:150%;"""; s += "> <b>Location Details</b></p> <table ALIGN=CENTER style="; s += "width:50%"; s += "> <tr> <th>Latitude</th>"; s += "<td ALIGN=CENTER >"; s += lat_str; s += "</td> </tr> <tr> <th>Longitude</th> <td ALIGN=CENTER >"; s += lng_str; s += "</td> </tr> <tr> <th>Date</th> <td ALIGN=CENTER >"; s += date_str; s += "</td></tr> <tr> <th>Time</th> <td ALIGN=CENTER >"; s += time_str; s += "</td> </tr> </table> "; s += "</body> </html> client.print(s); // all the values are send to the webpage delay(100); }
Recommended: Dynamic WLAN configuration for ESP32 Board | AutoConnect
I hope you like this post “GPS Module Interfacing with NodeMCU”. Do you have any questions? Leave a comment down below!
Thanks for reading. If you like this post probably you might like my next ones, so please support me by subscribing my blog.