#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // Ancho de la pantalla OLED
#define SCREEN_HEIGHT 64 // Alto de la pantalla OLED
#define OLED_RESET -1 // Pin de reset de la pantalla (no se utiliza)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // Inicializa el objeto de la pantalla OLED
String cadena; // Variable para almacenar toda la trama recibida
void setup() {
Serial.begin(9600);
// Inicializamos la pantalla OLED con la dirección I2C por defecto 0x3C
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("No se pudo encontrar la pantalla SSD1306")); // Mensaje de error si la pantalla no se encuentra
for (;;); // Bucle infinito en caso de error
}
delay(2000); // Espera 2 segundos para dar tiempo a la pantalla
display.clearDisplay(); // Limpia el buffer de la pantalla
display.display(); // Muestra el buffer inicial en la pantalla
}
void loop() {
leerDatosSerial(); // Llama a la función para leer datos del serial
}
//Temperatura&86.75Cº&Potenciometro&4095&
//SUBFUNCION PARA LEER DATO EN EL SERIAL DE DICHA TRAMA
void leerDatosSerial() {
if (Serial.available() > 0) { // Comprueba si hay datos disponibles en el puerto serie
char datoAux = Serial.read(); // Almacena el carácter leído de forma temporal
cadena += datoAux; // Concatena el carácter en la variable cadena
if (datoAux == '\n') { // Verifica si el carácter es un salto de línea (fin de la trama)
procesoDeTrama(cadena); // Procesa la cadena completa
cadena = ""; // Reinicia la cadena para la próxima trama
}
}
}
//SUBFUNCION PARA EL PROCESO DE LA TRAMA QUE SE REFLEJARA
void procesoDeTrama(String data) {
String tempC = getValue(data, '&', 1); // Extrae el valor de temperatura (índice 1)
String pot = getValue(data, '&', 3); // Extrae el valor del potenciómetro (índice 3)
// Imprimir los valores en el monitor serial
Serial.println("Datos:");
Serial.print("Temperatura: ");
Serial.println(tempC); // Muestra la temperatura
Serial.print("Potenciometro: ");
Serial.println(pot); // Muestra el valor del potenciómetro
// Mostrar los valores en la pantalla OLED
display.clearDisplay(); // Limpia la pantalla OLED
display.setTextSize(1); // Establece el tamaño del texto
display.setTextColor(WHITE); // Establece el color del texto a blanco
display.setCursor(0, 0); // Establece la posición del cursor en la pantalla
display.println("Datos:");
display.print("Temp: "); // Imprime la etiqueta "Temp: "
display.println(tempC); // Imprime el valor de la temperatura
display.print("Pot: "); // Imprime la etiqueta "Pot: "
display.print(pot); // Imprime el valor del potenciómetro
display.display(); // Actualiza la pantalla para mostrar los nuevos datos
}
String getValue(String data, char separator, int index) {
int found = 0; // Contador de valores encontrados
int strIndex[] = {0, -1}; // Índices para las posiciones de inicio y fin de los valores
int maxIndex = data.length() - 1; // Longitud máxima de la cadena
// Bucle para encontrar el valor en el índice especificado
for (int i = 0; i <= maxIndex && found <= index; i++) {
if (data.charAt(i) == separator || i == maxIndex) { // Verifica si se encuentra un separador o se alcanza el final
found++; // Incrementa el contador de valores encontrados
strIndex[0] = strIndex[1] + 1; // Actualiza el índice de inicio
strIndex[1] = (i == maxIndex) ? i + 1 : i; // Actualiza el índice de fin
}
}
// Devuelve el valor encontrado si se encuentra en el índice especificado, de lo contrario, devuelve una cadena vacía
return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}