{"id":443,"date":"2025-03-14T17:10:02","date_gmt":"2025-03-14T17:10:02","guid":{"rendered":"https:\/\/alphahex.com.br\/?p=443"},"modified":"2025-03-20T19:52:45","modified_gmt":"2025-03-20T19:52:45","slug":"lendo-coordenadas-gps-direto-da-pagina-nmea-esp32-plataformio","status":"publish","type":"post","link":"https:\/\/alphahex.com.br\/en\/lendo-coordenadas-gps-direto-da-pagina-nmea-esp32-plataformio\/","title":{"rendered":"GPS coordinates directly from the NMEA page with ESP32 and PlataformIO"},"content":{"rendered":"<p>In this article I will demonstrate how to collect GPS coordinates directly from the page <strong>NMEA<\/strong> (National Marine Electronics Association). This format is a standard used for communicating navigation and position data from GPS systems.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"646\" height=\"504\" src=\"https:\/\/alphahex.com.br\/wp-content\/uploads\/2025\/03\/PaginaNmeaCurto.png\" alt=\"\" class=\"wp-image-457\" srcset=\"https:\/\/alphahex.com.br\/wp-content\/uploads\/2025\/03\/PaginaNmeaCurto.png 646w, https:\/\/alphahex.com.br\/wp-content\/uploads\/2025\/03\/PaginaNmeaCurto-300x234.png 300w\" sizes=\"auto, (max-width: 646px) 100vw, 646px\" \/><\/figure>\n\n\n\n<p>The data sent by the GPS to the serial port usually consists of several sentences (text strings) in NMEA format, with information about the position, time, speed, direction and other parameters. Each NMEA sentence begins with a character <strong>&#8220;$&#8221;<\/strong> and is followed by information that is separated by commas.<\/p>\n\n\n\n<p>Here is an example of a typical NMEA sentence sent by a GPS module:<\/p>\n\n\n\n<p>$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47<\/p>\n\n\n\n<p>With the hardware configured, this simple code and a GPS module connected to the ESP32, you will see in the terminal the same content shown in the photo above:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"void loop() {  while (Serial2.available()) {    char c = Serial2.read();    Serial.print(c);  }}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">loop<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">while<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">Serial2<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">available<\/span><span style=\"color: #D4D4D4\">()) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\"> c = <\/span><span style=\"color: #9CDCFE\">Serial2<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">read<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(c);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"has-medium-font-size\"><strong>In this tutorial, we will create a Task in FreeRTOS that performs the continuous reading of selected data on this page, allowing its use in any application.<\/strong><\/p>\n\n\n\n<p>For this, we will use an ESP32 S3 WROOM -1 development module and a Ublox Neo M7 GPS module. However, it works with any ESP32 and GPS module:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"981\" height=\"546\" src=\"https:\/\/alphahex.com.br\/wp-content\/uploads\/2025\/03\/Ligacao_2.png\" alt=\"\" class=\"wp-image-511\" srcset=\"https:\/\/alphahex.com.br\/wp-content\/uploads\/2025\/03\/Ligacao_2.png 981w, https:\/\/alphahex.com.br\/wp-content\/uploads\/2025\/03\/Ligacao_2-300x167.png 300w, https:\/\/alphahex.com.br\/wp-content\/uploads\/2025\/03\/Ligacao_2-768x427.png 768w\" sizes=\"auto, (max-width: 981px) 100vw, 981px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>GPS VCC<\/strong> \u2192 <strong>3.3V of ESP32-S3<\/strong><\/li>\n\n\n\n<li><strong>GPS GND<\/strong> \u2192 <strong>GND of ESP32-S3<\/strong><\/li>\n\n\n\n<li><strong>GPS TX<\/strong> \u2192 <strong>RX2 (GPIO16) of ESP32-S3<\/strong><\/li>\n\n\n\n<li><strong>GPS RX<\/strong> \u2192 <strong>TX2 (GPIO17) of ESP32-S3<\/strong><\/li>\n<\/ul>\n\n\n\n<p><strong>Connecting ESP to Note and Creating the Project in VS Code<\/strong><\/p>\n\n\n\n<p>After connecting the <strong>ESP32<\/strong> to <strong>GPS<\/strong>, you can now connect it to your computer using a cable <strong>USB<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"text-transform:none\">\ud83d\udccc Creating the Project in VS Code with PlatformIO<\/h3>\n\n\n\n<p>1\ufe0f\u20e3 <strong>Open VS Code<\/strong> and go to the <strong>PlatformIO<\/strong>.<br>2\ufe0f\u20e3 Click on <strong>Create New Project<\/strong>.<br>3\ufe0f\u20e3 During setup, select:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ESP Model<\/strong> you are using.<\/li>\n\n\n\n<li><strong>Framework: Arduino<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p>If you are following this tutorial and using the same ESP model, your file <strong>platformio.ini<\/strong> it will look like this:<\/p>\n\n\n\n<p>[env:esp32-s3-devkitc-1]<br>platform = espressif32<br>board = esp32-s3-devkitc-1<br>framework = arduino<br>monitor_speed = 115200<br>upload_speed = 921600<\/p>\n\n\n\n<p>As mentioned above, the goal of this project is to receive NMEA sentences from a GPS receiver and extract the latitude, longitude, altitude and other relevant data. The coordinates are stored in a data structure and constantly updated, with the possibility of using them in other functions of the system.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"text-transform:none\">Project Structure<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Collection of GPS NMEA sentences.<\/strong><\/li>\n\n\n\n<li><strong>Processing each sentence to extract data such as latitude, longitude, speed, etc.<\/strong><\/li>\n\n\n\n<li><strong>Validation of sentences using checksum verification.<\/strong><\/li>\n\n\n\n<li><strong>Using FreeRTOS to ensure that data collection is done continuously, without blocking code execution.<\/strong><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\" style=\"text-transform:none\">1. Initially we will declare the functions that will be used in the project.<\/h2>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"#include &lt;Arduino.h&gt;#define NUM_SENTENCAS 3\/\/ --- Function Declarations ---String seqRetData(String *SEQ, uint8_t pos);      \/\/ Returns the isolated data from the sequence based on the requested positionbool gpsSetData();                                \/\/ GPS Sets GPS data with processed sentences void gpsTask(void *pvParameters);                 \/\/ Task function to continuously collect GPS sentencesbool nmea0183_checksum(const char *nmea_data);    \/\/ Verifies if the checksum of an NMEA0183 sentence is correct\/\/ -----------------------------\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;Arduino.h&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#define<\/span><span style=\"color: #569CD6\"> NUM_SENTENCAS 3<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ --- Function Declarations ---<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">seqRetData<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">*<\/span><span style=\"color: #9CDCFE\">SEQ<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">uint8_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">pos<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\">      \/\/ Returns the isolated data from the sequence based on the requested position<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">gpsSetData<\/span><span style=\"color: #D4D4D4\">();<\/span><span style=\"color: #6A9955\">                                \/\/ GPS Sets GPS data with processed sentences <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">gpsTask<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">*<\/span><span style=\"color: #9CDCFE\">pvParameters<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\">                 \/\/ Task function to continuously collect GPS sentences<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">nmea0183_checksum<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">*<\/span><span style=\"color: #9CDCFE\">nmea_data<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\">    \/\/ Verifies if the checksum of an NMEA0183 sentence is correct<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ -----------------------------<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><div class=\"cbp-see-more-container\" style=\"display:flex;flex-direction:column;align-items:flex-start;width:100%;background-color:transparent;font-size:12px;line-height:1;position:relative;margin-bottom:-16px;height:32px\"><span role=\"button\" tabindex=\"0\" class=\"cbp-see-more-simple-btn cbp-see-more-simple-btn-hover\" style=\"color:#c7c7c7;background-color:#1e1e1e;padding:10px 16px;cursor:default\">Expand<\/span><\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\" style=\"text-transform:none\">2. Declaring Variables and Structures<\/h2>\n\n\n\n<p>Next, we declare a structure <code>Datagps<\/code> which will store the collected data, such as latitude, longitude, number of satellites, and other GPS parameters. Below is the definition of this structure:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ --- GPS Data Structure ---typedef struct{  float     lat;    float     lon;   uint8_t   fix;   uint8_t   sat;   float     hdop;  float     alt;   float     vel;   float     bea;    char      hor[7];  char      date[7];   char      isfix[2];  bool      isnew = false;     bool      isvalid = false; }  Datagps;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ --- GPS Data Structure ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">typedef<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">struct<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">float<\/span><span style=\"color: #D4D4D4\">     lat;  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">float<\/span><span style=\"color: #D4D4D4\">     lon; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">uint8_t<\/span><span style=\"color: #D4D4D4\">   fix; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">uint8_t<\/span><span style=\"color: #D4D4D4\">   sat; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">float<\/span><span style=\"color: #D4D4D4\">     hdop;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">float<\/span><span style=\"color: #D4D4D4\">     alt; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">float<\/span><span style=\"color: #D4D4D4\">     vel; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">float<\/span><span style=\"color: #D4D4D4\">     bea;  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">hor<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">7<\/span><span style=\"color: #D4D4D4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">date<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">7<\/span><span style=\"color: #D4D4D4\">]; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">isfix<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\">      isnew = <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">;   <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\">      isvalid = <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}  <\/span><span style=\"color: #4EC9B0\">Datagps<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\">3. Global Variables<\/h2>\n\n\n\n<p>Here we have variables that store the data of the GPS sentences and the structure <code>Datagps<\/code> which keeps the data updated. Note that it is in the \u201csentence\u201d variable that we declare which sentences on the NMEA page we are going to extract the information from.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ --- Global Variables ---Datagps gps;  \/\/ GPS DataString sentenca[NUM_SENTENCAS] = {&quot;$GPGGA&quot;, &quot;$GPVTG&quot;, &quot;$GPRMC&quot;};String sentData[NUM_SENTENCAS];                               \/\/ Data for each sentencebool sentencaValida[NUM_SENTENCAS] = {false, false, false};   \/\/ Flag to validate if the sentence was received and is correct\/\/ --------------------------------------------------------------\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ --- Global Variables ---<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Datagps gps;<\/span><span style=\"color: #6A9955\">  \/\/ GPS Data<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">String <\/span><span style=\"color: #9CDCFE\">sentenca<\/span><span style=\"color: #D4D4D4\">[NUM_SENTENCAS] = {<\/span><span style=\"color: #CE9178\">&quot;$GPGGA&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;$GPVTG&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;$GPRMC&quot;<\/span><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">String <\/span><span style=\"color: #9CDCFE\">sentData<\/span><span style=\"color: #D4D4D4\">[NUM_SENTENCAS];<\/span><span style=\"color: #6A9955\">                               \/\/ Data for each sentence<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">sentencaValida<\/span><span style=\"color: #D4D4D4\">[NUM_SENTENCAS] = {<\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">};<\/span><span style=\"color: #6A9955\">   \/\/ Flag to validate if the sentence was received and is correct<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ --------------------------------------------------------------<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\" style=\"text-transform:none\">4. Initial Setup Configuration <code>do Setup()<\/code><\/h2>\n\n\n\n<p>The function <code>setup()<\/code> is responsible for initializing the system, configuring serial communication and creating the task <strong>FreeRTOS<\/strong> to continuously read GPS sentences.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"void setup() {  Serial.begin(115200);  delay(100);  Serial2.begin(9600, SERIAL_8N1, 16, 17);  delay(100);  Serial.println(&quot;NMEA GPS Sentence Example v1.0&quot;);    xTaskCreate(gpsTask, &quot;GPS Task&quot;, 2048, NULL, 1, NULL);   \/\/ Adjust stack size as needed  \/\/ Set to get new data  gps.isnew = false;  gps.isvalid = false;}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">setup<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">begin<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">115200<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">delay<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial2<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">begin<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">9600<\/span><span style=\"color: #D4D4D4\">, SERIAL_8N1, <\/span><span style=\"color: #B5CEA8\">16<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">17<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">delay<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;NMEA GPS Sentence Example v1.0&quot;<\/span><span style=\"color: #D4D4D4\">);  <\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">xTaskCreate<\/span><span style=\"color: #D4D4D4\">(gpsTask, <\/span><span style=\"color: #CE9178\">&quot;GPS Task&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">2048<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">NULL<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">NULL<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\">   \/\/ Adjust stack size as needed<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Set to get new data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">isnew<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">isvalid<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Here, we configure serial communication for both the ESP32 debug and the GPS receiver connected to the Serial2 pin.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\">5. Main Loop <\/h2>\n\n\n\n<p>Inside the function <code>loop()<\/code>, we call the function <code>gpsSetData()<\/code> which is responsible for checking for new data and storing it in the structure <code>Datagps<\/code>.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"void loop() {  \/\/ Get GPS data from NMEA sentences  gpsSetData();  delay(1000);}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">loop<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Get GPS data from NMEA sentences<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">gpsSetData<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">delay<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">1000<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\">6. FreeRTOS Task <\/h2>\n\n\n\n<p>The function <code>gpsTask()<\/code> is a task created by FreeRTOS to continuously collect GPS data without blocking the main program flow. In it, we monitor the serial communication, read and isolate the data sent by the GPS, and check if the received sentence is valid using the function <strong>checksum<\/strong>. <\/p>\n\n\n\n<p>Remembering that at the beginning of the code we selected the sentences that we want to isolate on the NMEA page by declaring the following variable:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"String sentenca[NUM_SENTENCAS] = {&quot;$GPGGA&quot;, &quot;$GPVTG&quot;, &quot;$GPRMC&quot;};\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">String <\/span><span style=\"color: #9CDCFE\">sentenca<\/span><span style=\"color: #D4D4D4\">[NUM_SENTENCAS] = {<\/span><span style=\"color: #CE9178\">&quot;$GPGGA&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;$GPVTG&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;$GPRMC&quot;<\/span><span style=\"color: #D4D4D4\">};<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"text-transform:none\">FreeRtos Task Function:<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ --- Task function to continuously collect GPS sentences ---void gpsTask(void *pvParameters) {  char buffer[512];             \/\/ Buffer for serial reading  int bufferIndex = 0;          \/\/ Buffer index  String tempBuffer = &quot;&quot;;       \/\/ Accumulator for serial data  String currentSentence = &quot;&quot;;  \/\/ Current sentence being read  \/\/ Initialize with sentences not validated  for (int i = 0; i &lt; 3; i++) {    sentencaValida[i] = false;  }  while (true) {    \/\/ If there is data available on the serial    if (Serial2.available() &gt; 0) {      \/\/ Continuous reading of serial data      while (Serial2.available()) {        char incomingByte = Serial2.read();  \/\/ Reads the next byte        tempBuffer += incomingByte;   \/\/ Accumulates the read bytes        \/\/ If we find the end of a sentence, like '\\n'        if (incomingByte == '\\n') {                    \/\/ Serial.println(tempBuffer);          \/\/ For each requested sentence, check if it was found in the buffer          for (int i = 0; i &lt; 3; i++) {            \/\/ Check if the sentence was found            if (tempBuffer.startsWith(sentenca[i]) &amp;&amp; !sentencaValida[i]) {              \/\/ Stores the validated sentence              if (nmea0183_checksum(tempBuffer.c_str())) {                sentData[i] = tempBuffer;  \/\/ Stores the complete sentence                sentencaValida[i] = true;  \/\/ Marks as valid                Serial.print(&quot;Senten\u00e7a &quot; + sentenca[i] + &quot; v\u00e1lida recebida: &quot; + tempBuffer);              } else {                Serial.println(&quot;Erro de checksum na senten\u00e7a: &quot; + sentenca[i]);              }            }          }          tempBuffer = &quot;&quot;;  \/\/ Clears the buffer after processing        }      }    }        \/\/ Check if all sentences were received    bool allValid = true;    for (int i = 0; i &lt; 3; i++) {      if (!sentencaValida[i]) {        allValid = false;        break;      }    }    \/\/ If all sentences are valid, restart reading    if (allValid) {      \/\/ Serial.println(&quot;Todas as senten\u00e7as v\u00e1lidas foram recebidas!&quot;);      gps.isnew = true;      \/\/ Reset variables if necessary      for (int i = 0; i &lt; 3; i++) {        sentencaValida[i] = false;      }    }        vTaskDelay(100 \/ portTICK_PERIOD_MS); \/\/ Delay to avoid processor overload  }} \/\/ --- END Task function to continuously collect GPS sentences ---\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ --- Task function to continuously collect GPS sentences ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">gpsTask<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">*<\/span><span style=\"color: #9CDCFE\">pvParameters<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">buffer<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">512<\/span><span style=\"color: #D4D4D4\">];<\/span><span style=\"color: #6A9955\">             \/\/ Buffer for serial reading<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> bufferIndex = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;<\/span><span style=\"color: #6A9955\">          \/\/ Buffer index<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  String tempBuffer = <\/span><span style=\"color: #CE9178\">&quot;&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><span style=\"color: #6A9955\">       \/\/ Accumulator for serial data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  String currentSentence = <\/span><span style=\"color: #CE9178\">&quot;&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><span style=\"color: #6A9955\">  \/\/ Current sentence being read<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Initialize with sentences not validated<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> i = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; i &lt; <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">; i++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">sentencaValida<\/span><span style=\"color: #D4D4D4\">[i] = <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">while<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/ If there is data available on the serial<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">Serial2<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">available<\/span><span style=\"color: #D4D4D4\">() &gt; <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">      \/\/ Continuous reading of serial data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">while<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">Serial2<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">available<\/span><span style=\"color: #D4D4D4\">()) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\"> incomingByte = <\/span><span style=\"color: #9CDCFE\">Serial2<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">read<\/span><span style=\"color: #D4D4D4\">();<\/span><span style=\"color: #6A9955\">  \/\/ Reads the next byte<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        tempBuffer += incomingByte;<\/span><span style=\"color: #6A9955\">   \/\/ Accumulates the read bytes<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">        \/\/ If we find the end of a sentence, like &#39;\\n&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (incomingByte == <\/span><span style=\"color: #CE9178\">&#39;<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&#39;<\/span><span style=\"color: #D4D4D4\">) {          <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">          \/\/ Serial.println(tempBuffer);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">          \/\/ For each requested sentence, check if it was found in the buffer<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> i = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; i &lt; <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">; i++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">            \/\/ Check if the sentence was found<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">tempBuffer<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">startsWith<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">sentenca<\/span><span style=\"color: #D4D4D4\">[i]) &amp;&amp; !<\/span><span style=\"color: #9CDCFE\">sentencaValida<\/span><span style=\"color: #D4D4D4\">[i]) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">              \/\/ Stores the validated sentence<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">              <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #DCDCAA\">nmea0183_checksum<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">tempBuffer<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">c_str<\/span><span style=\"color: #D4D4D4\">())) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">sentData<\/span><span style=\"color: #D4D4D4\">[i] = tempBuffer;<\/span><span style=\"color: #6A9955\">  \/\/ Stores the complete sentence<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">sentencaValida<\/span><span style=\"color: #D4D4D4\">[i] = <\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">;<\/span><span style=\"color: #6A9955\">  \/\/ Marks as valid<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Senten\u00e7a &quot;<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">sentenca<\/span><span style=\"color: #D4D4D4\">[i] + <\/span><span style=\"color: #CE9178\">&quot; v\u00e1lida recebida: &quot;<\/span><span style=\"color: #D4D4D4\"> + tempBuffer);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">              } <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Erro de checksum na senten\u00e7a: &quot;<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">sentenca<\/span><span style=\"color: #D4D4D4\">[i]);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">              }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          tempBuffer = <\/span><span style=\"color: #CE9178\">&quot;&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><span style=\"color: #6A9955\">  \/\/ Clears the buffer after processing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/ Check if all sentences were received<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\"> allValid = <\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> i = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; i &lt; <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">; i++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">sentencaValida<\/span><span style=\"color: #D4D4D4\">[i]) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        allValid = <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">break<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/ If all sentences are valid, restart reading<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (allValid) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">      \/\/ Serial.println(&quot;Todas as senten\u00e7as v\u00e1lidas foram recebidas!&quot;);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">isnew<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">      \/\/ Reset variables if necessary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> i = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; i &lt; <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">; i++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">sentencaValida<\/span><span style=\"color: #D4D4D4\">[i] = <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">vTaskDelay<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #D4D4D4\"> \/ portTICK_PERIOD_MS);<\/span><span style=\"color: #6A9955\"> \/\/ Delay to avoid processor overload<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><span style=\"color: #6A9955\"> \/\/ --- END Task function to continuously collect GPS sentences ---<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\" style=\"text-transform:none\">Explanation of Logic<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The <strong>buffer<\/strong> stores the received GPS data.<\/li>\n\n\n\n<li>Each time a sentence ends (detected by <code>'\\n'<\/code>), it is validated by <strong>checksum<\/strong>.<\/li>\n\n\n\n<li>If the sentence is valid, it is stored in the variable <code>sentData<\/code>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\" style=\"text-transform:none\">7. Checksum verification, validity of the collected sentence<\/h2>\n\n\n\n<p>Before processing any data, we ensure that the received sentence is valid by checking the <strong>checksum<\/strong>. The function <code>nmea0183_checksum()<\/code> calculates the checksum and compares it with the value sent by the sentence to ensure data integrity.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ --- Verifies if the checksum of an NMEA0183 sentence is correct ---bool nmea0183_checksum(const char *nmea_data) {  uint8_t crc = 0;    \/\/ Ignores the '$' at the beginning and calculates the checksum  int i = 1;  for (i = 1; nmea_data[i] != '*' &amp;&amp; nmea_data[i] != '\\0'; i++) {    crc ^= (uint8_t)nmea_data[i];  }  \/\/ Gets the checksum value of the sentence after the '*' character  if (nmea_data[i] != '*') {return false;}  int checksum = strtol(&amp;nmea_data[i + 1], NULL, 16);  \/\/ Verifies if the calculated checksum matches the sentence checksum  return crc == checksum;} \/\/ --- END Verifies if the checksum of an NMEA0183 sentence is correct ---\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ --- Verifies if the checksum of an NMEA0183 sentence is correct ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">nmea0183_checksum<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">*<\/span><span style=\"color: #9CDCFE\">nmea_data<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">uint8_t<\/span><span style=\"color: #D4D4D4\"> crc = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Ignores the &#39;$&#39; at the beginning and calculates the checksum<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> i = <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (i = <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">nmea_data<\/span><span style=\"color: #D4D4D4\">[i] != <\/span><span style=\"color: #CE9178\">&#39;*&#39;<\/span><span style=\"color: #D4D4D4\"> &amp;&amp; <\/span><span style=\"color: #9CDCFE\">nmea_data<\/span><span style=\"color: #D4D4D4\">[i] != <\/span><span style=\"color: #CE9178\">&#39;<\/span><span style=\"color: #D7BA7D\">\\0<\/span><span style=\"color: #CE9178\">&#39;<\/span><span style=\"color: #D4D4D4\">; i++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    crc ^= (<\/span><span style=\"color: #569CD6\">uint8_t<\/span><span style=\"color: #D4D4D4\">)<\/span><span style=\"color: #9CDCFE\">nmea_data<\/span><span style=\"color: #D4D4D4\">[i];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Gets the checksum value of the sentence after the &#39;*&#39; character<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">nmea_data<\/span><span style=\"color: #D4D4D4\">[i] != <\/span><span style=\"color: #CE9178\">&#39;*&#39;<\/span><span style=\"color: #D4D4D4\">) {<\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">;}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> checksum = <\/span><span style=\"color: #DCDCAA\">strtol<\/span><span style=\"color: #D4D4D4\">(&amp;<\/span><span style=\"color: #9CDCFE\">nmea_data<\/span><span style=\"color: #D4D4D4\">[i + <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">], <\/span><span style=\"color: #569CD6\">NULL<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">16<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Verifies if the calculated checksum matches the sentence checksum<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> crc == checksum;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><span style=\"color: #6A9955\"> \/\/ --- END Verifies if the checksum of an NMEA0183 sentence is correct ---<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\" style=\"text-transform:none\">8. Processing of Received Data<\/h2>\n\n\n\n<p>The function <code>gpsSetData()<\/code> processes the received sentences, extracting data on latitude, longitude, altitude, among others. The function <code>seqRetData()<\/code> is used to isolate the desired fields of each sentence.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/ --- Sets GPS data with processed sentences ---bool gpsSetData(){  \/\/ Verify if new GPS data is available  if (!gps.isnew) {return false;}  gps.isnew = false;  String dat;  float val;  \/\/\/ GGA Sequence-------------------------------------  if (sentData[0] == &quot;&quot;) {return false;}  \/\/ Checks if it is fixed (6th position)  dat = seqRetData(&amp;sentData[0], 6);  gps.fix =  dat.toInt();  \/\/ Gets Latitude  dat = seqRetData(&amp;sentData[0], 2);  val = dat.toFloat();  dat = seqRetData(&amp;sentData[0], 3);  if(dat==&quot;S&quot;) {val = val*(-1);}  gps.lat = val*0.01;    \/\/ Gets Longitude  dat = seqRetData(&amp;sentData[0], 4);  val = dat.toFloat();  dat = seqRetData(&amp;sentData[0], 5);  if(dat==&quot;W&quot;) {val = val*(-1);}  gps.lon = val*0.01;      \/\/ Gets Altitude  dat = seqRetData(&amp;sentData[0], 9);  gps.alt = dat.toFloat();  \/\/ Gets number of satellites  dat = seqRetData(&amp;sentData[0], 7);  gps.sat = dat.toInt();  \/\/ Gets HDOP  dat = seqRetData(&amp;sentData[0], 8);  gps.hdop = dat.toFloat();   \/\/ VTG Sequence-------------------------------------  \/\/ Gets speed in km\/h  dat = seqRetData(&amp;sentData[1], 7);  gps.vel = dat.toFloat();   \/\/ RMC Sequence-------------------------------------  \/\/ Gets UTC time  dat = seqRetData(&amp;sentData[2], 1);   dat.toCharArray(gps.hor, sizeof(gps.hor));   \/\/ Gets date  dat = seqRetData(&amp;sentData[2], 9);  dat.toCharArray(gps.date, sizeof(gps.date));  \/\/ Gets if it is fixed  gps.isfix[0] = (seqRetData(&amp;sentData[2], 2) == &quot;A&quot;) ? 'S' : 'N';  \/\/ Gets bearing (direction in degrees)  dat = seqRetData(&amp;sentData[2], 8);  gps.bea = dat.toFloat();  \/\/ Verifies if the coordinate is valid based on fix, HDOP, and number of satellites  if (gps.isfix[0] == 'S' &amp;&amp; gps.hdop &lt;= 3 &amp;&amp; gps.sat &gt;= 4) {gps.isvalid = true;} else {gps.isvalid = false;}  \/\/ Prints collected data  Serial.println(&quot;------------------------------&quot;);  Serial.print(&quot;Lat: &quot;);  Serial.print(gps.lat,6);  Serial.print(&quot;    Lon: &quot;);  Serial.println(gps.lon,6);  Serial.print(&quot;Alt: &quot;);  Serial.println(gps.alt,1);  Serial.print(&quot;Fix: &quot;);  Serial.println(gps.fix);  Serial.print(&quot;Sat: &quot;);  Serial.println(gps.sat);  Serial.print(&quot;Hdop: &quot;);  Serial.println(gps.hdop);    Serial.print(&quot;isFix: &quot;);  Serial.println(gps.isfix);  Serial.print(&quot;isValid: &quot;);  Serial.println(gps.isvalid ? 'S' : 'N');  Serial.print(&quot;Bea: &quot;);  Serial.println(gps.bea);  Serial.print(&quot;Vel: &quot;);  Serial.println(gps.vel);  Serial.print(&quot;Hor: &quot;);  Serial.println(gps.hor);  Serial.print(&quot;Date: &quot;);  Serial.println(gps.date);  Serial.println(&quot;------------------------------&quot;);  return true;  } \/\/ --- END Sets GPS data with processed sentences ---\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">\/ --- Sets GPS data with processed sentences ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">gpsSetData<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Verify if new GPS data is available<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">isnew<\/span><span style=\"color: #D4D4D4\">) {<\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">;}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">isnew<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  String dat;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">float<\/span><span style=\"color: #D4D4D4\"> val;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/\/ GGA Sequence-------------------------------------<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">sentData<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">] == <\/span><span style=\"color: #CE9178\">&quot;&quot;<\/span><span style=\"color: #D4D4D4\">) {<\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">;}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Checks if it is fixed (6th position)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  dat = <\/span><span style=\"color: #DCDCAA\">seqRetData<\/span><span style=\"color: #D4D4D4\">(&amp;<\/span><span style=\"color: #9CDCFE\">sentData<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">], <\/span><span style=\"color: #B5CEA8\">6<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">fix<\/span><span style=\"color: #D4D4D4\"> =  <\/span><span style=\"color: #9CDCFE\">dat<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">toInt<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Gets Latitude<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  dat = <\/span><span style=\"color: #DCDCAA\">seqRetData<\/span><span style=\"color: #D4D4D4\">(&amp;<\/span><span style=\"color: #9CDCFE\">sentData<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">], <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  val = <\/span><span style=\"color: #9CDCFE\">dat<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">toFloat<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  dat = <\/span><span style=\"color: #DCDCAA\">seqRetData<\/span><span style=\"color: #D4D4D4\">(&amp;<\/span><span style=\"color: #9CDCFE\">sentData<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">], <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\">(dat==<\/span><span style=\"color: #CE9178\">&quot;S&quot;<\/span><span style=\"color: #D4D4D4\">) {val = val*(-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">);}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">lat<\/span><span style=\"color: #D4D4D4\"> = val*<\/span><span style=\"color: #B5CEA8\">0.01<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Gets Longitude<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  dat = <\/span><span style=\"color: #DCDCAA\">seqRetData<\/span><span style=\"color: #D4D4D4\">(&amp;<\/span><span style=\"color: #9CDCFE\">sentData<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">], <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  val = <\/span><span style=\"color: #9CDCFE\">dat<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">toFloat<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  dat = <\/span><span style=\"color: #DCDCAA\">seqRetData<\/span><span style=\"color: #D4D4D4\">(&amp;<\/span><span style=\"color: #9CDCFE\">sentData<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">], <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\">(dat==<\/span><span style=\"color: #CE9178\">&quot;W&quot;<\/span><span style=\"color: #D4D4D4\">) {val = val*(-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">);}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">lon<\/span><span style=\"color: #D4D4D4\"> = val*<\/span><span style=\"color: #B5CEA8\">0.01<\/span><span style=\"color: #D4D4D4\">;  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Gets Altitude<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  dat = <\/span><span style=\"color: #DCDCAA\">seqRetData<\/span><span style=\"color: #D4D4D4\">(&amp;<\/span><span style=\"color: #9CDCFE\">sentData<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">], <\/span><span style=\"color: #B5CEA8\">9<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">alt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">dat<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">toFloat<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Gets number of satellites<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  dat = <\/span><span style=\"color: #DCDCAA\">seqRetData<\/span><span style=\"color: #D4D4D4\">(&amp;<\/span><span style=\"color: #9CDCFE\">sentData<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">], <\/span><span style=\"color: #B5CEA8\">7<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">sat<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">dat<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">toInt<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Gets HDOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  dat = <\/span><span style=\"color: #DCDCAA\">seqRetData<\/span><span style=\"color: #D4D4D4\">(&amp;<\/span><span style=\"color: #9CDCFE\">sentData<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">], <\/span><span style=\"color: #B5CEA8\">8<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">hdop<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">dat<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">toFloat<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   \/\/ VTG Sequence-------------------------------------<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Gets speed in km\/h<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  dat = <\/span><span style=\"color: #DCDCAA\">seqRetData<\/span><span style=\"color: #D4D4D4\">(&amp;<\/span><span style=\"color: #9CDCFE\">sentData<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">], <\/span><span style=\"color: #B5CEA8\">7<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">vel<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">dat<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">toFloat<\/span><span style=\"color: #D4D4D4\">(); <\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ RMC Sequence-------------------------------------<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Gets UTC time<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  dat = <\/span><span style=\"color: #DCDCAA\">seqRetData<\/span><span style=\"color: #D4D4D4\">(&amp;<\/span><span style=\"color: #9CDCFE\">sentData<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">], <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">); <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">dat<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">toCharArray<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">hor<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">sizeof<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">hor<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   \/\/ Gets date<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  dat = <\/span><span style=\"color: #DCDCAA\">seqRetData<\/span><span style=\"color: #D4D4D4\">(&amp;<\/span><span style=\"color: #9CDCFE\">sentData<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">], <\/span><span style=\"color: #B5CEA8\">9<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">dat<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">toCharArray<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">date<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">sizeof<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">date<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Gets if it is fixed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">isfix<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">] = (<\/span><span style=\"color: #DCDCAA\">seqRetData<\/span><span style=\"color: #D4D4D4\">(&amp;<\/span><span style=\"color: #9CDCFE\">sentData<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">], <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">) == <\/span><span style=\"color: #CE9178\">&quot;A&quot;<\/span><span style=\"color: #D4D4D4\">) ? <\/span><span style=\"color: #CE9178\">&#39;S&#39;<\/span><span style=\"color: #D4D4D4\"> : <\/span><span style=\"color: #CE9178\">&#39;N&#39;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Gets bearing (direction in degrees)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  dat = <\/span><span style=\"color: #DCDCAA\">seqRetData<\/span><span style=\"color: #D4D4D4\">(&amp;<\/span><span style=\"color: #9CDCFE\">sentData<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">], <\/span><span style=\"color: #B5CEA8\">8<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">bea<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">dat<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">toFloat<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Verifies if the coordinate is valid based on fix, HDOP, and number of satellites<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">isfix<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">] == <\/span><span style=\"color: #CE9178\">&#39;S&#39;<\/span><span style=\"color: #D4D4D4\"> &amp;&amp; <\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">hdop<\/span><span style=\"color: #D4D4D4\"> &lt;= <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\"> &amp;&amp; <\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">sat<\/span><span style=\"color: #D4D4D4\"> &gt;= <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">) {<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">isvalid<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">;} <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">isvalid<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">;}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Prints collected data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;------------------------------&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Lat: &quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">lat<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #B5CEA8\">6<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;    Lon: &quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">lon<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #B5CEA8\">6<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Alt: &quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">alt<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Fix: &quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">fix<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Sat: &quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">sat<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Hdop: &quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">hdop<\/span><span style=\"color: #D4D4D4\">);  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;isFix: &quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">isfix<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;isValid: &quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">isvalid<\/span><span style=\"color: #D4D4D4\"> ? <\/span><span style=\"color: #CE9178\">&#39;S&#39;<\/span><span style=\"color: #D4D4D4\"> : <\/span><span style=\"color: #CE9178\">&#39;N&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Bea: &quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">bea<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Vel: &quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">vel<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Hor: &quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">hor<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Date: &quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">gps<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">date<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;------------------------------&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">;  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><span style=\"color: #6A9955\"> \/\/ --- END Sets GPS data with processed sentences ---<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Here, we check and extract data from sentences, performing coordinate and value conversions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\" style=\"text-transform:none\">9. Function to isolate data from a sentence<\/h2>\n\n\n\n<p>The function <code>seqRetData()<\/code> is responsible for isolating data from a NMEA sentence based on the position of the desired data.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ --- Returns the isolated data from the sequence based on the requested position ---String seqRetData(String *SEQ, uint8_t pos){  String res = &quot;&quot;, str = *SEQ;  uint8_t i, ini = 0;  uint8_t fim = str.length();   \/\/ Counts the commas in the sequence until the desired position is found  for (i = 0;i &lt; pos;i++)  {    ini = str.indexOf(',', ini+1);  }  \/\/ Positioned, isolates the byte  ini++; \/\/ Advances one position to get the data  while (ini &lt;= fim)  {    if (str[ini] == ',') {break;}    res += str[ini];    ini++;  }  return res;} \/\/ --- END Returns the isolated data from the sequence based on the requested position ---\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ --- Returns the isolated data from the sequence based on the requested position ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">seqRetData<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">*<\/span><span style=\"color: #9CDCFE\">SEQ<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">uint8_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">pos<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  String res = <\/span><span style=\"color: #CE9178\">&quot;&quot;<\/span><span style=\"color: #D4D4D4\">, str = *SEQ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">uint8_t<\/span><span style=\"color: #D4D4D4\"> i, ini = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">uint8_t<\/span><span style=\"color: #D4D4D4\"> fim = <\/span><span style=\"color: #9CDCFE\">str<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">length<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   \/\/ Counts the commas in the sequence until the desired position is found<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (i = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;i &lt; pos;i++)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    ini = <\/span><span style=\"color: #9CDCFE\">str<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">indexOf<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><span style=\"color: #D4D4D4\">, ini+<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Positioned, isolates the byte<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ini++;<\/span><span style=\"color: #6A9955\"> \/\/ Advances one position to get the data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">while<\/span><span style=\"color: #D4D4D4\"> (ini &lt;= fim)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">str<\/span><span style=\"color: #D4D4D4\">[ini] == <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><span style=\"color: #D4D4D4\">) {<\/span><span style=\"color: #C586C0\">break<\/span><span style=\"color: #D4D4D4\">;}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    res += <\/span><span style=\"color: #9CDCFE\">str<\/span><span style=\"color: #D4D4D4\">[ini];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    ini++;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> res;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><span style=\"color: #6A9955\"> \/\/ --- END Returns the isolated data from the sequence based on the requested position ---<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>This function iterates through the sentence, counting commas to find the desired value in the correct position.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-large-font-size\">10. Conclusion<\/h2>\n\n\n\n<p>This project uses the protocol <strong>NMEA0183<\/strong> to collect GPS data, process it and validate it in real time using <strong>FreeRTOS<\/strong>. With the structure <code>Datagps<\/code>, we can store data in an organized way and access it for other functions.<\/p>\n\n\n\n<p>You can expand this project to store the coordinates on an SD card, send them via Bluetooth, or even display them on a display.<\/p>\n\n\n\n<div class=\"wp-block-uagb-buttons uagb-buttons__outer-wrap uagb-btn__default-btn uagb-btn-tablet__default-btn uagb-btn-mobile__default-btn uagb-block-80edef2b\"><div class=\"uagb-buttons__wrap uagb-buttons-layout-wrap\">\n<div class=\"wp-block-uagb-buttons-child uagb-buttons__outer-wrap uagb-block-84113132 wp-block-button\"><div class=\"uagb-button__wrapper\"><a class=\"uagb-buttons-repeater wp-block-button__link\" aria-label=\"\" href=\"https:\/\/github.com\/OtavioMartins-Dev\/ESP32-GPS-NMEA\" rel=\"follow noopener\" target=\"_self\" role=\"button\"><div class=\"uagb-button__link\">Git Hub Code<\/div><\/a><\/div><\/div>\n<\/div><\/div>\n\n\n\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>In this article I will demonstrate how to collect GPS coordinates directly from the NMEA (National Marine Electronics Association) page. This format is [\u2026]<\/p>","protected":false},"author":1,"featured_media":469,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"pagelayer_contact_templates":[],"_pagelayer_content":"","_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[5,21,2,6,7,1],"tags":[19,8,17,16,9,18,13,10,11,20,15,12,14],"class_list":["post-443","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-embedded-systems","category-firmware","category-general","category-geoposicionamento","category-nmea","category-uncategorized","tag-arduino-framework","tag-esp32","tag-firmware-development","tag-geolocation","tag-gps","tag-hardware","tag-iot","tag-nmea","tag-plataformio","tag-posicionamento-georeferenciado","tag-rastreamento","tag-serial-communication","tag-telemetria"],"uagb_featured_image_src":{"full":["https:\/\/alphahex.com.br\/wp-content\/uploads\/2025\/03\/pexels-photo-244822-244822-scaled.jpg",2560,1707,false],"thumbnail":["https:\/\/alphahex.com.br\/wp-content\/uploads\/2025\/03\/pexels-photo-244822-244822-150x150.jpg",150,150,true],"medium":["https:\/\/alphahex.com.br\/wp-content\/uploads\/2025\/03\/pexels-photo-244822-244822-300x200.jpg",300,200,true],"medium_large":["https:\/\/alphahex.com.br\/wp-content\/uploads\/2025\/03\/pexels-photo-244822-244822-768x512.jpg",768,512,true],"large":["https:\/\/alphahex.com.br\/wp-content\/uploads\/2025\/03\/pexels-photo-244822-244822-1024x683.jpg",1024,683,true],"1536x1536":["https:\/\/alphahex.com.br\/wp-content\/uploads\/2025\/03\/pexels-photo-244822-244822-1536x1024.jpg",1536,1024,true],"2048x2048":["https:\/\/alphahex.com.br\/wp-content\/uploads\/2025\/03\/pexels-photo-244822-244822-scaled.jpg",2048,1366,false],"trp-custom-language-flag":["https:\/\/alphahex.com.br\/wp-content\/uploads\/2025\/03\/pexels-photo-244822-244822-scaled.jpg",18,12,false]},"uagb_author_info":{"display_name":"Ot\u00e1vio Martins","author_link":"https:\/\/alphahex.com.br\/en\/author\/otavio\/"},"uagb_comment_info":2,"uagb_excerpt":"Neste artigo vou demonstrar como coletar coordenadas de GPS direto da p\u00e1gina NMEA (National Marine Electronics Association). Esse formato \u00e9 [&hellip;]","_links":{"self":[{"href":"https:\/\/alphahex.com.br\/en\/wp-json\/wp\/v2\/posts\/443","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alphahex.com.br\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alphahex.com.br\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alphahex.com.br\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alphahex.com.br\/en\/wp-json\/wp\/v2\/comments?post=443"}],"version-history":[{"count":48,"href":"https:\/\/alphahex.com.br\/en\/wp-json\/wp\/v2\/posts\/443\/revisions"}],"predecessor-version":[{"id":527,"href":"https:\/\/alphahex.com.br\/en\/wp-json\/wp\/v2\/posts\/443\/revisions\/527"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alphahex.com.br\/en\/wp-json\/wp\/v2\/media\/469"}],"wp:attachment":[{"href":"https:\/\/alphahex.com.br\/en\/wp-json\/wp\/v2\/media?parent=443"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alphahex.com.br\/en\/wp-json\/wp\/v2\/categories?post=443"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alphahex.com.br\/en\/wp-json\/wp\/v2\/tags?post=443"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}