{"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":"\n<p class=\"wp-block-paragraph\">Neste artigo vou demonstrar como coletar coordenadas de GPS direto da p\u00e1gina <strong>NMEA<\/strong> (National Marine Electronics Association). Esse formato \u00e9 um padr\u00e3o utilizado para a comunica\u00e7\u00e3o de dados de navega\u00e7\u00e3o e posi\u00e7\u00e3o de sistemas GPS.<\/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 class=\"wp-block-paragraph\">Os dados enviados pelo GPS para a porta serial geralmente consistem em v\u00e1rias senten\u00e7as (strings de texto) no formato NMEA, com informa\u00e7\u00f5es sobre a posi\u00e7\u00e3o, hor\u00e1rio, velocidade, dire\u00e7\u00e3o e outros par\u00e2metros. Cada senten\u00e7a NMEA come\u00e7a com um caractere <strong>&#8220;$&#8221;<\/strong> e \u00e9 seguida por informa\u00e7\u00f5es que s\u00e3o separadas por v\u00edrgulas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aqui est\u00e1 um exemplo de uma senten\u00e7a NMEA t\u00edpica enviada por um m\u00f3dulo GPS:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">$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 class=\"wp-block-paragraph\">Com o hardware configurado, este simples c\u00f3digo e um m\u00f3dulo GPS conectado ao ESP32, voc\u00ea ver\u00e1 no terminal o mesmo conte\u00fado mostrado na foto acima:<\/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() {\n  while (Serial2.available()) {\n    char c = Serial2.read();\n    Serial.print(c);\n  }\n}\" 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 wp-block-paragraph\"><strong>Neste tutorial, vamos criar uma Task em FreeRTOS que realiza a leitura cont\u00ednua de dados selecionados nesta p\u00e1gina, permitindo seu uso em qualquer aplica\u00e7\u00e3o.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para isso, vamos utilizar um m\u00f3dulo de desenvolvimento ESP32 S3 WROOM -1 e um m\u00f3dulo GPS da Ublox Neo M7. No entanto funciona com qualquer ESP32 e m\u00f3dulo de GPS:<\/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>VCC do GPS<\/strong> \u2192 <strong>3.3V do ESP32-S3<\/strong><\/li>\n\n\n\n<li><strong>GND do GPS<\/strong> \u2192 <strong>GND do ESP32-S3<\/strong><\/li>\n\n\n\n<li><strong>TX do GPS<\/strong> \u2192 <strong>RX2 (GPIO16) do ESP32-S3<\/strong><\/li>\n\n\n\n<li><strong>RX do GPS<\/strong> \u2192 <strong>TX2 (GPIO17) do ESP32-S3<\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Conectando o ESP ao Note e Criando o Projeto no VS Code<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ap\u00f3s conectar o <strong>ESP32<\/strong> ao <strong>GPS<\/strong>, voc\u00ea pode agora conect\u00e1-lo ao seu computador usando um cabo <strong>USB<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"text-transform:none\">\ud83d\udccc Criando o Projeto no VS Code com PlatformIO<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">1\ufe0f\u20e3 <strong>Abra o VS Code<\/strong> e v\u00e1 at\u00e9 o <strong>PlatformIO<\/strong>.<br>2\ufe0f\u20e3 Clique em <strong>Criar Novo Projeto<\/strong>.<br>3\ufe0f\u20e3 Durante a configura\u00e7\u00e3o, selecione:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Modelo do ESP<\/strong> que est\u00e1 utilizando.<\/li>\n\n\n\n<li><strong>Framework: Arduino<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Se estiver seguindo este tutorial e usando o mesmo modelo de ESP, seu arquivo <strong>platformio.ini<\/strong> ficar\u00e1 assim:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[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 class=\"wp-block-paragraph\">Conforme mencionado acima o objetivo deste projeto \u00e9 receber as senten\u00e7as NMEA de um receptor GPS e extrair as coordenadas de latitude, longitude, altitude e outros dados relevantes. As coordenadas s\u00e3o armazenadas em uma estrutura de dados e constantemente atualizadas, com a possibilidade de us\u00e1-las em outras fun\u00e7\u00f5es do sistema.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"text-transform:none\">Estrutura do Projeto<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Coleta das senten\u00e7as GPS NMEA.<\/strong><\/li>\n\n\n\n<li><strong>Processamento de cada senten\u00e7a para extrair dados como latitude, longitude, velocidade, etc.<\/strong><\/li>\n\n\n\n<li><strong>Valida\u00e7\u00e3o das senten\u00e7as usando a verifica\u00e7\u00e3o de checksum.<\/strong><\/li>\n\n\n\n<li><strong>Uso de FreeRTOS para garantir que a coleta de dados seja feita continuamente, sem bloquear a execu\u00e7\u00e3o do c\u00f3digo.<\/strong><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\" style=\"text-transform:none\">1. Inicialmente vamos declarar as fun\u00e7\u00f5es que ser\u00e3o utilizadas no projeto<\/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;\n\n#define NUM_SENTENCAS 3\n\n\/\/ --- Function Declarations ---\n\nString seqRetData(String *SEQ, uint8_t pos);      \/\/ Returns the isolated data from the sequence based on the requested position\nbool gpsSetData();                                \/\/ GPS Sets GPS data with processed sentences \nvoid gpsTask(void *pvParameters);                 \/\/ Task function to continuously collect GPS sentences\nbool nmea0183_checksum(const char *nmea_data);    \/\/ Verifies if the checksum of an NMEA0183 sentence is correct\n\n\/\/ -----------------------------\n\" 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. Declara\u00e7\u00e3o de Vari\u00e1veis e Estruturas<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Na sequ\u00eancia, declaramos uma estrutura <code>Datagps<\/code> que armazenar\u00e1 os dados coletados, como latitude, longitude, n\u00famero de sat\u00e9lites, e outros par\u00e2metros do GPS. Abaixo est\u00e1 a defini\u00e7\u00e3o dessa estrutura:<\/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 ---\ntypedef struct\n{\n  float     lat;  \n  float     lon; \n  uint8_t   fix; \n  uint8_t   sat; \n  float     hdop;\n  float     alt; \n  float     vel; \n  float     bea;  \n  char      hor[7];\n  char      date[7]; \n  char      isfix[2];\n  bool      isnew = false;   \n  bool      isvalid = false; \n}  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. Vari\u00e1veis Globais<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Aqui, temos vari\u00e1veis que armazenam os dados das senten\u00e7as GPS e da estrutura <code>Datagps<\/code> que mant\u00e9m os dados atualizados. Observe que \u00e9 na vari\u00e1vel &#8220;sentenca&#8221; que declaramos de quais senten\u00e7as da p\u00e1gina NMEA vamos retirar as informa\u00e7\u00f5es.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/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 ---\n\nDatagps gps;  \/\/ GPS Data\n\nString sentenca[NUM_SENTENCAS] = {&quot;$GPGGA&quot;, &quot;$GPVTG&quot;, &quot;$GPRMC&quot;};\nString sentData[NUM_SENTENCAS];                               \/\/ Data for each sentence\nbool sentencaValida[NUM_SENTENCAS] = {false, false, false};   \/\/ Flag to validate if the sentence was received and is correct\n\n\/\/ --------------------------------------------------------------\" 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. Configura\u00e7\u00e3o Inicial <code>do Setup()<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A fun\u00e7\u00e3o <code>setup()<\/code> \u00e9 respons\u00e1vel pela inicializa\u00e7\u00e3o do sistema, configura\u00e7\u00e3o da comunica\u00e7\u00e3o serial e pela cria\u00e7\u00e3o da tarefa <strong>FreeRTOS<\/strong> para ler continuamente as senten\u00e7as GPS.<\/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() {\n  Serial.begin(115200);\n  delay(100);\n  Serial2.begin(9600, SERIAL_8N1, 16, 17);\n  delay(100);\n  Serial.println(&quot;NMEA GPS Sentence Example v1.0&quot;);  \n\n  xTaskCreate(gpsTask, &quot;GPS Task&quot;, 2048, NULL, 1, NULL);   \/\/ Adjust stack size as needed\n\n  \/\/ Set to get new data\n  gps.isnew = false;\n  gps.isvalid = false;\n}\" 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 class=\"wp-block-paragraph\">Aqui, configuramos a comunica\u00e7\u00e3o serial tanto para o debug do ESP32 quanto para o receptor GPS conectado ao pino Serial2.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\">5. Loop Principal <\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dentro da fun\u00e7\u00e3o <code>loop()<\/code>, chamamos a fun\u00e7\u00e3o <code>gpsSetData()<\/code> que \u00e9 respons\u00e1vel por verificar se h\u00e1 novos dados e armazen\u00e1-los na estrutura <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() {\n\n  \/\/ Get GPS data from NMEA sentences\n  gpsSetData();\n  delay(1000);\n\n}\" 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. Tarefa FreeRTOS <\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A fun\u00e7\u00e3o <code>gpsTask()<\/code> \u00e9 uma tarefa criada pelo FreeRTOS para continuamente coletar os dados do GPS sem bloquear o fluxo principal do programa. Nela, monitoramos a comunica\u00e7\u00e3o serial, lemos e isolamos os dados enviados pelo GPS, e verificamos se a senten\u00e7a recebida \u00e9 v\u00e1lida utilizando a fun\u00e7\u00e3o de <strong>checksum<\/strong>. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lembrando que l\u00e1 no in\u00edcio do c\u00f3digo selecionamos as senten\u00e7as que queremos isolar na p\u00e1gina NMEA atrav\u00e9s da declara\u00e7\u00e3o da seguinte vari\u00e1vel:<\/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\">Fun\u00e7\u00e3o da Task FreeRtos:<\/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 ---\nvoid gpsTask(void *pvParameters) {\n  char buffer[512];             \/\/ Buffer for serial reading\n  int bufferIndex = 0;          \/\/ Buffer index\n  String tempBuffer = &quot;&quot;;       \/\/ Accumulator for serial data\n  String currentSentence = &quot;&quot;;  \/\/ Current sentence being read\n\n\n  \/\/ Initialize with sentences not validated\n  for (int i = 0; i &lt; 3; i++) {\n    sentencaValida[i] = false;\n  }\n\n  while (true) {\n    \/\/ If there is data available on the serial\n    if (Serial2.available() &gt; 0) {\n      \/\/ Continuous reading of serial data\n      while (Serial2.available()) {\n        char incomingByte = Serial2.read();  \/\/ Reads the next byte\n        tempBuffer += incomingByte;   \/\/ Accumulates the read bytes\n        \/\/ If we find the end of a sentence, like '\\n'\n        if (incomingByte == '\\n') {          \n          \/\/ Serial.println(tempBuffer);\n          \/\/ For each requested sentence, check if it was found in the buffer\n          for (int i = 0; i &lt; 3; i++) {\n            \/\/ Check if the sentence was found\n            if (tempBuffer.startsWith(sentenca[i]) &amp;&amp; !sentencaValida[i]) {\n              \/\/ Stores the validated sentence\n              if (nmea0183_checksum(tempBuffer.c_str())) {\n                sentData[i] = tempBuffer;  \/\/ Stores the complete sentence\n                sentencaValida[i] = true;  \/\/ Marks as valid\n                Serial.print(&quot;Senten\u00e7a &quot; + sentenca[i] + &quot; v\u00e1lida recebida: &quot; + tempBuffer);\n              } else {\n                Serial.println(&quot;Erro de checksum na senten\u00e7a: &quot; + sentenca[i]);\n              }\n            }\n          }\n          tempBuffer = &quot;&quot;;  \/\/ Clears the buffer after processing\n        }\n      }\n    }\n    \n    \/\/ Check if all sentences were received\n    bool allValid = true;\n    for (int i = 0; i &lt; 3; i++) {\n      if (!sentencaValida[i]) {\n        allValid = false;\n        break;\n      }\n    }\n\n    \/\/ If all sentences are valid, restart reading\n    if (allValid) {\n      \/\/ Serial.println(&quot;Todas as senten\u00e7as v\u00e1lidas foram recebidas!&quot;);\n      gps.isnew = true;\n      \/\/ Reset variables if necessary\n      for (int i = 0; i &lt; 3; i++) {\n        sentencaValida[i] = false;\n      }\n    }\n    \n    vTaskDelay(100 \/ portTICK_PERIOD_MS); \/\/ Delay to avoid processor overload\n  }\n} \/\/ --- 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\">Explica\u00e7\u00e3o da L\u00f3gica<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>O <strong>buffer<\/strong> armazena os dados do GPS recebidos.<\/li>\n\n\n\n<li>Cada vez que uma senten\u00e7a termina (detectada por <code>'\\n'<\/code>), ela \u00e9 validada pelo <strong>checksum<\/strong>.<\/li>\n\n\n\n<li>Se a senten\u00e7a for v\u00e1lida, ela \u00e9 armazenada na vari\u00e1vel <code>sentData<\/code>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\" style=\"text-transform:none\">7. Verifica\u00e7\u00e3o de Checksum, validade da senten\u00e7a coletada<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de processar qualquer dado, garantimos que a senten\u00e7a recebida \u00e9 v\u00e1lida verificando o <strong>checksum<\/strong>. A fun\u00e7\u00e3o <code>nmea0183_checksum()<\/code> calcula o checksum e o compara com o valor enviado pela senten\u00e7a para garantir a integridade dos dados.<\/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 ---\nbool nmea0183_checksum(const char *nmea_data) {\n  uint8_t crc = 0;\n  \n  \/\/ Ignores the '$' at the beginning and calculates the checksum\n  int i = 1;\n  for (i = 1; nmea_data[i] != '*' &amp;&amp; nmea_data[i] != '\\0'; i++) {\n    crc ^= (uint8_t)nmea_data[i];\n  }\n\n  \/\/ Gets the checksum value of the sentence after the '*' character\n  if (nmea_data[i] != '*') {return false;}\n  int checksum = strtol(&amp;nmea_data[i + 1], NULL, 16);\n\n  \/\/ Verifies if the calculated checksum matches the sentence checksum\n  return crc == checksum;\n} \/\/ --- 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. Processamento de Dados Recebidos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A fun\u00e7\u00e3o <code>gpsSetData()<\/code> processa as senten\u00e7as recebidas, extraindo dados de latitude, longitude, altitude, entre outros. A fun\u00e7\u00e3o <code>seqRetData()<\/code> \u00e9 utilizada para isolar os campos desejados de cada senten\u00e7a.<\/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 ---\nbool gpsSetData()\n{\n  \/\/ Verify if new GPS data is available\n  if (!gps.isnew) {return false;}\n  gps.isnew = false;\n\n  String dat;\n  float val;\n\n  \/\/\/ GGA Sequence-------------------------------------\n\n  if (sentData[0] == &quot;&quot;) {return false;}\n\n  \/\/ Checks if it is fixed (6th position)\n  dat = seqRetData(&amp;sentData[0], 6);\n  gps.fix =  dat.toInt();\n  \/\/ Gets Latitude\n  dat = seqRetData(&amp;sentData[0], 2);\n  val = dat.toFloat();\n  dat = seqRetData(&amp;sentData[0], 3);\n  if(dat==&quot;S&quot;) {val = val*(-1);}\n  gps.lat = val*0.01;\n  \n  \/\/ Gets Longitude\n  dat = seqRetData(&amp;sentData[0], 4);\n  val = dat.toFloat();\n  dat = seqRetData(&amp;sentData[0], 5);\n  if(dat==&quot;W&quot;) {val = val*(-1);}\n  gps.lon = val*0.01;  \n  \n  \/\/ Gets Altitude\n  dat = seqRetData(&amp;sentData[0], 9);\n  gps.alt = dat.toFloat();\n\n  \/\/ Gets number of satellites\n  dat = seqRetData(&amp;sentData[0], 7);\n  gps.sat = dat.toInt();\n\n  \/\/ Gets HDOP\n  dat = seqRetData(&amp;sentData[0], 8);\n  gps.hdop = dat.toFloat();\n\n   \/\/ VTG Sequence-------------------------------------\n\n  \/\/ Gets speed in km\/h\n  dat = seqRetData(&amp;sentData[1], 7);\n  gps.vel = dat.toFloat(); \n\n  \/\/ RMC Sequence-------------------------------------\n\n  \/\/ Gets UTC time\n  dat = seqRetData(&amp;sentData[2], 1); \n  dat.toCharArray(gps.hor, sizeof(gps.hor));\n\n   \/\/ Gets date\n  dat = seqRetData(&amp;sentData[2], 9);\n  dat.toCharArray(gps.date, sizeof(gps.date));\n\n  \/\/ Gets if it is fixed\n  gps.isfix[0] = (seqRetData(&amp;sentData[2], 2) == &quot;A&quot;) ? 'S' : 'N';\n\n  \/\/ Gets bearing (direction in degrees)\n  dat = seqRetData(&amp;sentData[2], 8);\n  gps.bea = dat.toFloat();\n\n  \/\/ Verifies if the coordinate is valid based on fix, HDOP, and number of satellites\n  if (gps.isfix[0] == 'S' &amp;&amp; gps.hdop &lt;= 3 &amp;&amp; gps.sat &gt;= 4) {gps.isvalid = true;} else {gps.isvalid = false;}\n\n  \/\/ Prints collected data\n  Serial.println(&quot;------------------------------&quot;);\n  Serial.print(&quot;Lat: &quot;);\n  Serial.print(gps.lat,6);\n  Serial.print(&quot;    Lon: &quot;);\n  Serial.println(gps.lon,6);\n  Serial.print(&quot;Alt: &quot;);\n  Serial.println(gps.alt,1);\n  Serial.print(&quot;Fix: &quot;);\n  Serial.println(gps.fix);\n  Serial.print(&quot;Sat: &quot;);\n  Serial.println(gps.sat);\n  Serial.print(&quot;Hdop: &quot;);\n  Serial.println(gps.hdop);  \n  Serial.print(&quot;isFix: &quot;);\n  Serial.println(gps.isfix);\n  Serial.print(&quot;isValid: &quot;);\n  Serial.println(gps.isvalid ? 'S' : 'N');\n  Serial.print(&quot;Bea: &quot;);\n  Serial.println(gps.bea);\n  Serial.print(&quot;Vel: &quot;);\n  Serial.println(gps.vel);\n  Serial.print(&quot;Hor: &quot;);\n  Serial.println(gps.hor);\n  Serial.print(&quot;Date: &quot;);\n  Serial.println(gps.date);\n\n  Serial.println(&quot;------------------------------&quot;);\n\n  return true;  \n} \/\/ --- 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 class=\"wp-block-paragraph\">Aqui, verificamos e extra\u00edmos os dados das senten\u00e7as, realizando convers\u00f5es de coordenadas e valores.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\" style=\"text-transform:none\">9. Fun\u00e7\u00e3o para isolar os dados de uma senten\u00e7a<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A fun\u00e7\u00e3o <code>seqRetData()<\/code> \u00e9 respons\u00e1vel por isolar os dados de uma senten\u00e7a NMEA com base na posi\u00e7\u00e3o do dado desejado.<\/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 ---\nString seqRetData(String *SEQ, uint8_t pos)\n{\n  String res = &quot;&quot;, str = *SEQ;\n  uint8_t i, ini = 0;\n  uint8_t fim = str.length();\n\n   \/\/ Counts the commas in the sequence until the desired position is found\n  for (i = 0;i &lt; pos;i++)\n  {\n    ini = str.indexOf(',', ini+1);\n  }\n  \/\/ Positioned, isolates the byte\n  ini++; \/\/ Advances one position to get the data\n  while (ini &lt;= fim)\n  {\n    if (str[ini] == ',') {break;}\n    res += str[ini];\n    ini++;\n  }\n  return res;\n} \/\/ --- 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 class=\"wp-block-paragraph\">Esta fun\u00e7\u00e3o percorre a senten\u00e7a, contando as v\u00edrgulas para encontrar o valor desejado na posi\u00e7\u00e3o correta.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-large-font-size\">10. Conclus\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Este projeto utiliza o protocolo <strong>NMEA0183<\/strong> para coletar dados GPS, process\u00e1-los e valid\u00e1-los em tempo real usando <strong>FreeRTOS<\/strong>. Com a estrutura <code>Datagps<\/code>, conseguimos armazenar os dados de forma organizada e acess\u00e1-los para outras funcionalidades.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voc\u00ea pode expandir esse projeto para armazenar as coordenadas em um cart\u00e3o SD, envi\u00e1-las por Bluetooth ou at\u00e9 exibi-las em um 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\">C\u00d3DIGO do gITHUB<\/div><\/a><\/div><\/div>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neste artigo vou demonstrar como coletar coordenadas de GPS direto da p\u00e1gina NMEA (National Marine Electronics Association). Esse formato \u00e9 [&hellip;]<\/p>\n","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":3,"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}]}}