#include "TinyGPSPlus.h" #include "DHT.h" #include #include #include #include "FS.h" #include "SD.h" #include "SPI.h" /* Uncomment and set up if you want to use custom pins for the SPI communication #define REASSIGN_PINS int sck = -1; int miso = -1; int mosi = -1; int cs = -1; */ #define SCREEN_WIDTH 128 // Ancho píxeles #define SCREEN_HEIGHT 64 // Alto píxeles #define OLED_RESET -1 // Reset pin (no usado) // Pines para UART2 (Serial2) #define RX_PIN 16 // RX del ESP32 conectado a TX del GPS #define TX_PIN 17 // TX del ESP32 conectado a RX del GPS #define GPS_BAUD 115200 #define DHTPIN 4 // Digital pin connected to the DHT sensor #define DHTTYPE DHT22 // Objeto TinyGPS++ TinyGPSPlus gps; // Serial para GPS HardwareSerial gpsSerial(2); // Configuracion del DHT DHT dht(DHTPIN, DHTTYPE); // Bandera volátil para interrupción volatile bool gpsFlag = false; void ARDUINO_ISR_ATTR onTimer(void) { gpsFlag = true; // Activa bandera para procesar GPS en el loop } Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void DHT_test() { dht.begin(); float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { Serial.println("Failed to read from DHT sensor!"); OLED_print("DHT22", "Error"); while(1); // Detener si hay error } else OLED_print("DHT22", "Correcto"); } void OLED_test() { //pantallazo a blanco y luego iniciando // Inicia I2C en pines default ESP32 (21 SDA, 22 SCL) if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Dirección común: 0x3C Serial.println(F("Error: OLED no encontrado!")); for (;;); // Para siempre } display.clearDisplay(); display.fillScreen(SSD1306_WHITE); // Pantalla blanca delay(500); display.display(); display.clearDisplay(); display.setTextSize(2); // Tamaño texto display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); // Posición display.println("Iniciando..."); display.display(); // Muestra delay(1000); } void OLED_print(const char* line1, const char* line2) { display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.println(line1); display.println(line2); display.display(); } void SD_test() { if (!SD.begin()) { Serial.println("SD Card Mount Failed"); OLED_print("SD Card", "Error"); while(1); // Detener si hay error } else OLED_print("SD Card", "Correcto"); } void GPS_test_wait() { // Iniciar Serial2 para GPS gpsSerial.begin(GPS_BAUD, SERIAL_8N1, RX_PIN, TX_PIN); while ((gpsSerial.available() > 0) && !gps.location.isValid()) { gps.encode(gpsSerial.read()); delay(10); OLED_print("GPS", "Esperando."); OLED_print("GPS", "Esperando.."); OLED_print("GPS", "Esperando..."); } OLED_print("GPS", "Encontrado"); } void setup() { Serial.begin(115200); // Configurar temporizador hardware con frecuencia de 1 MHz (tick cada 1 us) hw_timer_t *timer = timerBegin(1000000); // Frecuencia en Hz // Adjuntar interrupción al temporizador timerAttachInterrupt(timer, &onTimer); // Configurar alarma para 1 segundo (1,000,000 ticks), autoreload activado, unlimited timerAlarm(timer, 1000000, true, 0); // SD Card initialization if (!SD.begin()) { Serial.println("SD Card Mount Failed"); } else { Serial.println("SD Card Mounted"); } // OLED check OLED_test(); delay(500); // DHT check DHT_test(); delay(500); // SD Card check SD_test(); delay(500); // GPS check GPS_test_wait(); delay(2000); } void loop() { }