Buenas, estoy intentado conectar el gps con la placa pero no me funciona, es más ni el gps se enciende, adjunto mi código para ver si alguien sabe del tema, el código compila, y no afecta al funcionamiento de los otros sensores pero no me funciona el gps.
#include <Wire.h>
#include <Adafruit_AHTX0.h>
#include "HT_SSD1306Wire.h"
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>
#include <SparkFun_AS7265X.h>
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <FS.h>
#include <SPIFFS.h>
#include <TinyGPS++.h>
#include <HardwareSerial.h>
TinyGPSPlus gps;
HardwareSerial neogps(1); // UART1
float gpsLatitude = 0.0;
float gpsLongitude = 0.0;
#define BUTTON_PIN 20 //DIGITAL
const int buzzer = 26; // Buzzer pin
int ledRojo = 48;
int ledVerde = 47;
int ledAzul = 33;
// Configuración de la pantalla OLED en el bus principal I²C
static SSD1306Wire display(0x3C, 500000, SDA_OLED, SCL_OLED, GEOMETRY_128_64, RST_OLED);
// Declaración de los gpios para sda y scl
uint8_t sda_aht10 = 6; // SDA para los sensores
uint8_t scl_aht10 = 7; // SCL para los sensores
// Declaración de variables para el muestreo de los datos en la oled
unsigned long lastUpdate = 0;
const long interval = 3000; // 3 segundos por cada conjunto de datos
bool showSensor1 = true; // Alternador de pantallas
// Instancia del sensor AHT10
Adafruit_AHTX0 aht10;
// Instancia del sensor ADXL345
Adafruit_ADXL345_Unified adxl = Adafruit_ADXL345_Unified(12345);
// Instancia del sensor AS7265x
AS7265X as7265x;
// WiFi y Web Server
AsyncWebServer server(80);
void VextON(void) {
pinMode(Vext, OUTPUT);
digitalWrite(Vext, LOW);
}
void VextOFF(void) {
pinMode(Vext, OUTPUT);
digitalWrite(Vext, HIGH);
}
void checkSerialCommands() {
if (Serial.available()) {
String command = Serial.readStringUntil('\n');
command.trim();
if (command == "GET_CSV") {
File file = SPIFFS.open("/data.csv", "r");
if (!file) {
Serial.println("ERROR: No se pudo abrir datos.csv");
return;
}
Serial.println("BEGIN_CSV");
while (file.available()) {
Serial.write(file.read());
}
file.close();
Serial.println("END_CSV");
}
else if (command == "DELETE_CSV") {
if (SPIFFS.remove("/data.csv")) {
Serial.println("CSV_DELETED");
} else {
Serial.println("CSV_DELETE_FAILED");
}
}
}
}
void setup() {
Serial.begin(115200);
neogps.begin(9600, SERIAL_8N1, 44, 43); // RX = 43, TX = 44
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
pinMode(ledRojo,OUTPUT);
pinMode(ledVerde,OUTPUT);
pinMode(ledAzul,OUTPUT);
VextON();
delay(100);
// Inicializar el bus I²C principal para la OLED
//Wire.begin(); // No es necesario inicializarla ya que por defecto la oled está conectada a los pines especificos de I2C
// Inicializar el segundo bus I²C en GPIO6 (SDA) y GPIO7 (SCL) para los sensores usando Wire1
Wire1.begin(sda_aht10, scl_aht10, 400000);
// Inicializar pantalla OLED
display.init();
display.clear();
display.setFont(ArialMT_Plain_10);
display.display();
// Inicializar el sensor AHT10 en el bus I²C secundario
if (!aht10.begin(&Wire1)) {
Serial.println(F("AHT10 not connected or failed to load calibration coefficient"));
while (1) { delay(5000); } // Bucle infinito si falla la conexión
}
Serial.println(F("AHT10 OK"));
// Inicialización del sensor ADXL345 en el bus I²C secundario
if (!adxl.begin(ADXL345_DEFAULT_ADDRESS, &Wire1)) {
Serial.println(F("ADXL345 not connected or failed to load calibration coefficient"));
while (1) { delay(5000); } // Bucle infinito si falla la conexión
}
Serial.println(F("ADXL345 OK"));
// Inicialización del sensor AS7265x en el bus I²C secundario
if (!as7265x.begin(Wire1)) {
Serial.println(F("AS7265X not connected"));
while (1) delay(5000);
}
Serial.println(F("AS7265X OK"));
if (!SPIFFS.begin(true)) {
Serial.println("Error al montar SPIFFS");
return;
}
File file = SPIFFS.open("/data.csv", FILE_APPEND);
if (!file || file.size() == 0) {
file.println("Temperatura, Humedad, X, Y, Z, 410, 435, 460, 485, 510, 535, 560, 585, 610, 645, 680, 705, 730, 760, 810, 860, 900, 940, Latitud, Longitud");
}
file.close();
WiFi.softAP("Heltec-Logger");
Serial.println("AP IP address: " + WiFi.softAPIP().toString());
server.on("/data.csv", HTTP_GET, [](AsyncWebServerRequest *request) {
request->send(SPIFFS, "/data.csv", "text/csv", true);
});
server.begin();
}
void loop() {
checkSerialCommands();
byte buttonState = digitalRead(BUTTON_PIN);
if (buttonState == LOW) {
for(int i = 500; i > 0 ; --i) {
digitalWrite(buzzer, HIGH);
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1);
digitalWrite(buzzer, LOW);
digitalWrite(LED_BUILTIN, LOW);
delay(1);
}
//Hacer color rojo
digitalWrite(ledRojo,255);
digitalWrite(ledVerde,0);
digitalWrite(ledAzul,0);
//delay(1500);
Serial.println(digitalRead(BUTTON_PIN));
byte buttonState = digitalRead(BUTTON_PIN);
Serial.println("Botón Pulsado");
// AHT10
Serial.println(F("Reading AHT10 sensor..."));
sensors_event_t humidity, temp;
aht10.getEvent(&humidity, &temp);
Serial.print(F("Temperature: "));
Serial.print(temp.temperature);
Serial.println(F(" °C"));
Serial.print(F("Humidity...: "));
Serial.print(humidity.relative_humidity);
Serial.println(F(" %"));
display.clear();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(0, 0, "Temperature: ");
display.drawString(70, 0, String(temp.temperature, 2));
display.drawString(0, 10, "Humidity:");
display.drawString(50, 10, String(humidity.relative_humidity, 2));
display.display();
// ADXL345
Serial.println(F("Reading ADXL345 sensor..."));
sensors_event_t event;
adxl.getEvent(&event);
Serial.print(F("Aceleración X: "));
Serial.print(event.acceleration.x);
Serial.println(F(" m/s²"));
Serial.print(F("Aceleración Y: "));
Serial.print(event.acceleration.y);
Serial.println(F(" m/s²"));
Serial.print(F("Aceleración Z: "));
Serial.print(event.acceleration.z);
Serial.println(F(" m/s²"));
display.drawString(0, 20, "X: " + String(event.acceleration.x, 2));
display.drawString(0, 30, "Y: " + String(event.acceleration.y, 2));
display.drawString(0, 40, "Z: " + String(event.acceleration.z, 2));
display.display();
// AS7265x
Serial.println(F("Reading AS7265x sensor..."));
as7265x.takeMeasurementsWithBulb(); //This is a hard wait while all 18 channels are measured
Serial.print(as7265x.getCalibratedA()); //410nm
Serial.print(",");
Serial.print(as7265x.getCalibratedB()); //435nm
Serial.print(",");
Serial.print(as7265x.getCalibratedC()); //460nm
Serial.print(",");
Serial.print(as7265x.getCalibratedD()); //485nm
Serial.print(",");
Serial.print(as7265x.getCalibratedE()); //510nm
Serial.print(",");
Serial.print(as7265x.getCalibratedF()); //535nm
Serial.print(",");
Serial.print(as7265x.getCalibratedG()); //560nm
Serial.print(",");
Serial.print(as7265x.getCalibratedH()); //585nm
Serial.print(",");
Serial.print(as7265x.getCalibratedR()); //610nm
Serial.print(",");
Serial.print(as7265x.getCalibratedI()); //645nm
Serial.print(",");
Serial.print(as7265x.getCalibratedS()); //680nm
Serial.print(",");
Serial.print(as7265x.getCalibratedJ()); //705nm
Serial.print(",");
Serial.print(as7265x.getCalibratedT()); //730nm
Serial.print(",");
Serial.print(as7265x.getCalibratedU()); //760nm
Serial.print(",");
Serial.print(as7265x.getCalibratedV()); //810nm
Serial.print(",");
Serial.print(as7265x.getCalibratedW()); //860nm
Serial.print(",");
Serial.print(as7265x.getCalibratedK()); //900nm
Serial.print(",");
Serial.print(as7265x.getCalibratedL()); //940nm
Serial.print(",");
Serial.println();
// Mostrar valores del sensor AS7265X en la pantalla OLED
display.display(); // Mostrar en la OLED
delay(5000); // Pausa de 5 segundos antes de mostrar la primera parte
display.clear(); // Limpiar la pantalla para la primera parte
display.drawString(0, 0, "410nm: " + String(as7265x.getCalibratedA(), 2));
display.drawString(0, 10, "435nm: " + String(as7265x.getCalibratedB(), 2));
display.drawString(0, 20, "460nm: " + String(as7265x.getCalibratedC(), 2));
display.drawString(0, 30, "485nm: " + String(as7265x.getCalibratedD(), 2));
display.drawString(0, 40, "510nm: " + String(as7265x.getCalibratedE(), 2));
display.drawString(0, 50, "535nm: " + String(as7265x.getCalibratedF(), 2));
display.display(); // Mostrar en la OLED
delay(5000); // Pausa de 5 segundos antes de mostrar la siguiente parte
display.clear(); // Limpiar la pantalla para la segunda parte
display.drawString(0, 0, "560nm: " + String(as7265x.getCalibratedG(), 2));
display.drawString(0, 10, "585nm: " + String(as7265x.getCalibratedH(), 2));
display.drawString(0, 20, "610nm: " + String(as7265x.getCalibratedR(), 2));
display.drawString(0, 30, "645nm: " + String(as7265x.getCalibratedI(), 2));
display.drawString(0, 40, "680nm: " + String(as7265x.getCalibratedS(), 2));
display.drawString(0, 50, "705nm: " + String(as7265x.getCalibratedJ(), 2));
display.display(); // Mostrar en la OLED
delay(5000); // Pausa de 5 segundos antes de mostrar la tercera parte
display.clear(); // Limpiar la pantalla para la tercera parte
display.drawString(0, 0, "730nm: " + String(as7265x.getCalibratedT(), 2));
display.drawString(0, 10, "760nm: " + String(as7265x.getCalibratedU(), 2));
display.drawString(0, 20, "810nm: " + String(as7265x.getCalibratedV(), 2));
display.drawString(0, 30, "860nm: " + String(as7265x.getCalibratedW(), 2));
display.drawString(0, 40, "900nm: " + String(as7265x.getCalibratedK(), 2));
display.drawString(0, 50, "940nm: " + String(as7265x.getCalibratedL(), 2));
display.display();
delay(5000); // Pausa de 5 segundos antes de mostrar la cuarta parte
float spectrum[18] = {
as7265x.getCalibratedA(), as7265x.getCalibratedB(), as7265x.getCalibratedC(),
as7265x.getCalibratedD(), as7265x.getCalibratedE(), as7265x.getCalibratedF(),
as7265x.getCalibratedG(), as7265x.getCalibratedH(), as7265x.getCalibratedR(),
as7265x.getCalibratedI(), as7265x.getCalibratedS(), as7265x.getCalibratedJ(),
as7265x.getCalibratedT(), as7265x.getCalibratedU(), as7265x.getCalibratedV(),
as7265x.getCalibratedW(), as7265x.getCalibratedK(), as7265x.getCalibratedL()
};
unsigned long gpsStart = millis();
while (millis() - gpsStart < 2000) { // Esperar hasta 2 segundos por datos GPS
while (neogps.available()) {
gps.encode(neogps.read());
}
}
if (gps.location.isValid()) {
gpsLatitude = gps.location.lat();
gpsLongitude = gps.location.lng();
} else {
gpsLatitude = 0.0;
gpsLongitude = 0.0;
}
bool writeHeader = !SPIFFS.exists("/data.csv");
File file = SPIFFS.open("/data.csv", FILE_APPEND);
if (!file) {
Serial.println("Error abriendo data.csv");
return;
}
if (writeHeader) {
file.println("Temperatura, Humedad, X, Y, Z, 410, 435, 460, 485, 510, 535, 560, 585, 610, 645, 680, 705, 730, 760, 810, 860, 900, 940");
}
file.printf("%.2f,%.2f,%.2f,%.2f,%.2f", temp.temperature, humidity.relative_humidity, event.acceleration.x, event.acceleration.y, event.acceleration.z);
for (int i = 0; i < 18; i++) file.printf(",%.2f", spectrum[i]);
file.printf(",%.6f,%.6f", gpsLatitude, gpsLongitude);
file.println();
file.close();
// Mostrar en pantalla
display.clear();
display.drawString(0, 0, "Lat: " + String(gpsLatitude, 6));
display.drawString(0, 10, "Lng: " + String(gpsLongitude, 6));
display.display();
delay(5000);
display.clear();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(0, 0, "Medida guardada y enviada");
display.display(); // Mostrar en la OLED
delay(5000);
}
else {
//Hacer color verde
digitalWrite(ledRojo,0);
digitalWrite(ledVerde,255);
digitalWrite(ledAzul,0);
//delay(1500);
display.clear();
Serial.println("El botón no está pulsado");
display.drawString(0, 0, "ESPERANDO... ");
display.display(); // Mostrar en la OLED
}
}
