Gps neo6 Esp32 Bluetooth

Hola, estoy intentando enviar datos de un esp32 devkitv1, al puerto com del bluetooth, he empezado con el ejemplo de la pagina

include "BluetoothSerial.h"
 
BluetoothSerial SerialBT;
 
void setup() {
  SerialBT.begin("ESP32");
}
 
void loop() {
 
  SerialBT.println("Hello World");
  delay(1000);
}

todo correcto.
luego con el ejemplo de la libreria TinyGPS++ para esp32

#include <TinyGPS++.h>

HardwareSerial uart(1);

TinyGPSPlus gps;


void setup()
{
  uart.begin(9600, SERIAL_8N1, 17, 16);
  Serial.begin(9600);
  
  Serial.println(F("DeviceExample.ino"));
  Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
  Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
  Serial.println(F("by Mikal Hart"));
  Serial.println();
}

void loop()
{
  // This sketch displays information every time a new sentence is correctly encoded.
   while (uart.available() > 0)
    if (gps.encode(uart.read()))
      displayInfo();

  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
    Serial.println(F("No GPS detected: check wiring."));
    while(true);
  }
}

void displayInfo()
{
  Serial.print(F("Location: ")); 
  if (gps.location.isValid())
  {
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.print(gps.location.lng(), 6);
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.print(F("  Date/Time: "));
  if (gps.date.isValid())
  {
    Serial.print(gps.date.month());
    Serial.print(F("/"));
    Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.year());
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.print(F(" "));
  if (gps.time.isValid())
  {
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(F("."));
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.print(gps.time.centisecond());
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.println();
}

también funciona.
Ahora mi problema viene cuando quiero pasar estos datos por blutooth, complila ,cuando escribo en el monitor del serial sale en el otro puerto uart monitoreado en putty (hay conexion) ,pero no salen los datos que manda el gps EN EL 1 puerto, si cambio serial.print por serialBT.print si que sale
se puede mandar a los 2 puertos simultaneamente?

#include <TinyGPS++.h>

HardwareSerial uart(1);

TinyGPSPlus gps;

#include "BluetoothSerial.h"

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

BluetoothSerial SerialBT;



void setup()
{
  SerialBT.begin("ESP32test"); //Bluetooth device name
  Serial.println("The device started, now you can pair it with bluetooth!");

  uart.begin(9600, SERIAL_8N1, 17, 16);
  Serial.begin(9600);
  
  Serial.println(F("DeviceExample.ino"));
  Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
  Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
  Serial.println(F("by Mikal Hart"));
  Serial.println();
}

void loop()
{
  // This sketch displays information every time a new sentence is correctly encoded.
  while (uart.available() > 0)
    if (gps.encode(uart.read()))
      displayInfo();

  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
    Serial.println(F("No GPS detected: check wiring."));
    while(true);
  }



}

void displayInfo()
{
  Serial.print(F("Location: ")); 
  if (gps.location.isValid())
  {
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.print(gps.location.lng(), 6);
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.print(F("  Date/Time: "));
  if (gps.date.isValid())
  {
    Serial.print(gps.date.month());
    Serial.print(F("/"));
    Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.year());
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.print(F(" "));
  if (gps.time.isValid())
  {
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(F("."));
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.print(gps.time.centisecond());
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.println();
 /////////////////////////supuesto comando bluetooth

  SerialBT.println(Serial.read());
  delay(20);


}

mi idea es poder enviar datos de varios dispositivos conectados al esp32 via bluetooth a una raspberry con openplotter

similar a este proyecto

Lo que en realidad hace el arduino es primero enviar por un puerto y luego por el otro lo que parecería que lo hiciera "simultaneo" por la rapidez con que lo hace. Por otro lado no termino de comprender cómo tienes conectado esto, dices que tienes un monitor monitoreado con putty, y otro por el BT, el que tienes por putty es el serial de fabrica de la tarjeta o es al que tienes declarado como uart?. Si te fijas bien en el loop al while le hacen falta las llaves

No estoy trabajando con arduino sino con esp32, nose si trabaja igual que arduino pues tiene dos procesadores, el caso es que envio a traves del esp32 por bluetooth las cordenadas que le da el gps via uart y las recivo en el portatil, de dos maneras bluetooth y por el serial cuando enchufo el usb.
Osea el esp32 +gps a 5 metros del ordenador y putty o monitor arduino escuchando por el puerto bluetooth
En opencpn ya me ubica en el “chart” mapa.
he conseguido hacer funcionar parte del codigo

   HardwareSerial uart(1);
 #include <Wire.h>  
// #include "I2Cdev.h"  
 //#include "RTIMUSettings.h"  
// #include "RTIMU.h"  
 //#include "RTFusionRTQF.h"  
 #include "CalLib.h"  
 //#include <EEPROM.h>  
 #include <PString.h>  
 #include <stdint.h>  
 //#include <SparkFunBME280.h>  
 #include <nmea.h>  

#include "BluetoothSerial.h"

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

BluetoothSerial SerialBT;



   
 //RTIMU *imu;               // the IMU object  
 //RTFusionRTQF fusion;          // the fusion object  
 //RTIMUSettings settings;         // the settings object  
// BME280 atmo;       // the BME-280 Atmospheric Sensor  
 NMEA nmeaDecoder(ALL);         // NMEA data decoder for all sentence types (for the Transducer, and Anemometer)  
    
 // NMEA-0183 Sentences to Print:    
 boolean outputgps = true; // gps  
 boolean outputvhw = true; // waterspeed and heading (speed of vessel relative to water)  
 boolean outputdpt = true; // depth    
 boolean outputmtw = true; // mean temperature of water  
 boolean outputvlw = true; // distance through water   
 boolean outputhdm = true; // magnetic heading    
 boolean outputhdt = true; // true heading    
 boolean outputrot = true; // rate of turn    
 boolean outputxdr = true; // pitch and roll (and rate of pitch and roll)  
 boolean outputvdr = true; // set and drift   
 boolean outputmda = true; // meteorological composite  
   
 // User defined variables (for your own boat, geographic location, and preferences):  
 float magd = -13.73; // magnetic deviation; if it's East, it's negative (13.73E in San Francisco 2015)    
 float tdo = .5;   // transducer offset from waterline (positive) or from bottom of keel (negative) (in meters)    
 float tda = 23.0;  // triducer angle from straight down (in degrees, positive to starboard)  
 float pof = -.07;  // pitch offset from neutral  
 float rof = .39;   // roll offset from neutral  
   
 // Dampening variables  
 const int five = 5;  
 const int ten = 10;  
 const int thirty = 30;  
 int tgps = 0;  
 int tvhw = 0;  
 int t1 = 0;  
 int tp = 0;  
 int tr = 0;  
 int t3 = 0;  
 int t10 = 0;  
 float sogrun[five];  
 float sogtotal = 0;  
 float cogxrun[five];  
 float cogxtotal = 0;  
 float cogyrun[five];  
 float cogytotal = 0;  
 float vhwrun[five];  
 float vhwtotal = 0;  
 float hdmxrun[thirty];  
 float hdmyrun[thirty];  
 float hdmxtotal = 0;  
 float hdmytotal = 0;  
 float rollrun[ten];  
 float rolltotal = 0;  
 float pitchrun[ten];  
 float pitchtotal = 0;  
 float rrlrun[ten];  
 float rrltotal = 0;  
 float rphrun[ten];  
 float rphtotal = 0;  
 float rywrun[ten];  
 float rywtotal = 0;  
 float vdrxrun[ten];  
 float vdryrun[ten];  
 float vdrdrun[ten];  
 float vdrxtotal = 0;  
 float vdrytotal = 0;  
 float drifttotal = 0;  
   
 // Global variables:  
 #define DISPLAY_INTERVAL 100  // rate (in milliseconds) in which MPU9150 results are displayed. This also drives universal counters for ***ref above  
 int gpsworking = 100;      // this ticks up everytime the MPU runs, which is defined in DISPLAY INTERVAL and is used as a counter  
 int wspworking = 100;      // so that if no GPS or Waterspeed data is received for 10 seconds (wspworking*DISPLAY_INTERVAL), then VDR won't calculate  
 int mtwworking = 100;  
 unsigned long lastDisplay;  
 unsigned long lastRate;  
 int sampleCount;  
 boolean vlwfirst = true; // used one time for the VLW sentence  
 float tcd0;       // so is this  
 float r = M_PI / 180.0f; // degrees to radians  
 float d = 180.0f / M_PI; // radians to degrees  
 int t60 = 49;      // used for the temperature sensor  
   
 // Variables exchanged between instruments:  
 float sog; // speed over ground  
 float cog; // course over ground  
 float wsp; // water speed, or hull speed through the water  
 float mtw; // mean temp of water  
 float hdm; // magnetic heading  
 float hdt; // true heading  
 float roll; // roll in degrees  
 float pitch; // pitch  
 float yaw; // yaw (0 yaw corresponds to 270 magnetic)  
 float ror; // rate of roll (degrees per second, negative to port)  
 float rop; // rate of pitch  
 float roy; // rate of yaw  
   

void setup() {
  int errcode; 
SerialBT.begin("ESP32test"); //Bluetooth device name
  Serial.begin(9600);  // output port to computer  
  uart.begin(9600, SERIAL_8N1, 17, 16);  // from GPS  

////mpu



// Setup the dampening functions  
  for (int i = 0; i < five; i++) {  
   sogrun[i] = 0;  
   cogxrun[i] = 0;  
   cogyrun[i] = 0;  
   vhwrun[i] = 0;  
  }  
  for (int i = 0; i < thirty; i++) {  
   hdmxrun[i] = 0;  
   hdmyrun[i] = 0;  
  }  
  for (int i = 0; i < ten; i++) {  
   rollrun[i] = 0;  
   pitchrun[i] = 0;  
   rrlrun[i] = 0;  
   rphrun[i] = 0;  
   rywrun[i] = 0;  
   vdrxrun[i] = 0;  
   vdryrun[i] = 0;  
   vdrdrun[i] = 0;  
  }
}  
 // calculate checksum function (thanks to https://mechinations.wordpress.com)  
 byte checksum(char* str)  
 {  
  byte cs = 0;  
  for (unsigned int n = 1; n < strlen(str) - 1; n++)  
  {  
   cs ^= str[n];  
  }  
  return cs;  
 }  
   
 // Dampen Function  
 float dampen(float array[], int arraysize, float data, float &total, int t){  
  total = total - array[t];  
  array[t] = data;  
  total = total + array[t];  
  return total / arraysize;  
 }  
   
 


void loop()  
 {  
    
  // ***** neo6 GPS ***** //   
   if (uart.available()) {   
   if (nmeaDecoder.decode(uart.read())) {  
    char* title = nmeaDecoder.term(0);  
    if (strcmp(title,"GPRMC") == 0) {  
    gpsworking = 0; // resets the "gps is bad" counter back to 0 since it's good  
    sog = nmeaDecoder.term_decimal(7);   
    cog = nmeaDecoder.term_decimal(8);  
    if (sog == 0.0) { // this removes artifacts in cog when sog = 0  
     cog = hdt;   
    }  
   
    // Dampen the last 5 readings  
    float cogxave = dampen(cogxrun, five, cos(cog*r), cogxtotal, tgps);  
    float cogyave = dampen(cogyrun, five, sin(cog*r), cogytotal, tgps);  
    cog = atan2(cogyave,cogxave)*d;  
    if (cog<0.0){  
     cog=360+cog;  
    }  
    sog = dampen(sogrun, five, sog, sogtotal, tgps);  
    tgps++;  
    if (tgps>=five){  
     tgps=0;  
    }  
    if (outputgps == true) {  
     char rmcSentence [71];    
     byte csg;    
     PString strg(rmcSentence, sizeof(rmcSentence));    
     strg.print("$GPRMC,");   
     strg.print(nmeaDecoder.term_decimal(1));   
     strg.print(",");   
     strg.print(nmeaDecoder.term(2));   
     strg.print(",");   
     strg.print(nmeaDecoder.term_decimal(3));   
     strg.print(",");   
     strg.print(nmeaDecoder.term(4));   
     strg.print(",");   
     strg.print(nmeaDecoder.term_decimal(5));   
     strg.print(",");   
     strg.print(nmeaDecoder.term(6));   
     strg.print(",");   
     strg.print(sog);  
     strg.print(",");   
     strg.print(cog);   
     strg.print(",");   
     strg.print(nmeaDecoder.term_decimal(9));   
     strg.print(",,,");   
     strg.print(nmeaDecoder.term(12));   
     strg.print("*");   
     csg = checksum(rmcSentence);    
     if (csg < 0x10) strg.print('0');    
     strg.print(csg, HEX);    
     SerialBT.println(rmcSentence);    
    }  
    }  
    else {  
    Serial.println(nmeaDecoder.sentence());   
    }  
   }  
   // Timers tick up  
     t1++;  
     tp++;  
     tr++;  
     t3++;  
     if(t1>9){  
     t1=0;  
     tp=0;  
     tr=0;  
     t10++;  
     t60++;  
     if (t10>9) {  
      t10 = 0;  
     }  
     if (t60>59){  
       t60=0;  
      }  
     }  
   }
 }   
  // ***** End neo6 GPS ***** //

quiero poner el magnetometro mpu y un bme280 para la presion atmosferica como lo lleva el sketch original de kingtide lo que no encuentro una libreria rtimu compatible con esp32

Muy bien, vamos por partes.

Primero me dices que tienes conectado el módulo a 5 metros del computador viendo el monitor serial por putty, 5 metros es muy al límite de lo que el protocolo funciona que son 5 metros exactamente, así que intenta acortar más esa distancia y primero comprueba de que funciona con 1 o 2 metros tal vez por eso no logras ver nada por el monitor serie y si por el BT.

Segundo, yo he usado el ESP8266 y ps prácticamente se programa igual que arduino, tiene ciertos cambios en cosas muy mínimas pero es cuando deseas hacer cosas muy específicas de resto funcionan prácticamente igual y no creo que haya mucha diferencia entre el ESP32 y el ESP8266, al menos no vi grandes cambios en lo poco que busqué en internet.

Tercero si no encuentras una librería para esos sensores sería mejor que te leyeras el datasheet de cada uno y comenzaras a jugar con ellos, a veces las facilidades de las librerías nos hacen ser flojos (me incluyo) y no leer los datasheets de cada sensor y aprender cómo funcionan en realidad. Yo utilicé un BPM180 para la presión atmosférica y la librería fue compatible con el ESP8266.

El ESP32 puede tener dos núcleos pero cuando lo programas en ambiente arduino te manejas como si lo fuera aprovechando su hardware y las librerías que van mejorando con el tiempo.

El post#2 es un ejemplo de una explicación que no explica nada.

Olvida tu objetivo y los sensores y concéntrate en explicar lo que necesitas si me permites la corrección porque el resto solo introduce confusión a lo que tenemos que entender.

Un dispositivo serial por hardwareSerial y otro por BT.
Ambos deben funcionar, ese es tu objetivo. Lo demás lo dibujas como gustes.

A ver si te entendí bien:
Un GPS conectado a hardwareSerial.
BT conectado a un enlace de tu PC/Android/lo que sea aprovechando el BT del ESP32.

Supongo que esto enlace el BT del ESP32 con el siguiente dispositivo.

include "BluetoothSerial.h"
BluetoothSerial SerialBT;

Me resulta raro que hagas tanta complicación para conectar el GPS si dispones del HardwareSerial simplemente diciendole

Serial.begin(BAUD);

Asi que esto

uart.begin(9600, SERIAL_8N1, 17, 16);
  Serial.begin(9600);

implica que ademas de usar un puerto serie, usas el monitor serie para ver ADEMAS lo que ya puedes ver por BT? (reconozco que son maneras de trabajar, para mi sería suficiente con lo que veo en el BT, tal vez para ti no lo sea).

Bueno, no se que responderte porque los códigos del post#2 me parecen exagerados si los del ejemplo simple del primer post no fueron resueltos.

Si te parece volvamos al ejemplo incial y dinos que no funciona.

Como no, saludos Surbyte

En el primer post quiero enviar el desglose gps por BT y puerto serie0, por serie0 lo veo, pero no por BT, si cambio todos los serial.print por seialBT.print, si.

implica que ademas de usar un puerto serie, usas el monitor serie para ver ADEMAS lo que ya puedes ver por BT?

Si , para leer desde dos ordenadores a la vez

Pido disculpas por el vómito, de El post#2 al COPIAR de librerias y ejemplos se me hace revirado.