#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Definiciones de la pantalla OLED
#define ANCHO_PANTALLA 128
#define ALTO_PANTALLA 64
// Instancia de la pantalla OLED
Adafruit_SSD1306 pantalla(ANCHO_PANTALLA, ALTO_PANTALLA, &Wire, -1);
// Configuración de pines y variables
uint16_t pinPotenciometro = 34; // Pin conectado al potenciómetro
const int tasaMuestreo = 200; // Tasa de muestreo en milisegundos
const int anchoGrafica = 105; // Ancho de la gráfica en píxeles
const int altoGrafica = 30; // Altura de la gráfica en píxeles
const int Yinicial = 20; // Valor inicial de la coordenada Y para la gráfica
static int Xinicial = 4; // Valor inicial de la coordenada X para la gráfica
// Variables para monitorear la tendencia de la señal
const int umbralTendencia = 0; // Umbral para detectar la tendencia
const int umbralAlarma = 2000; // Umbral para activar la alarma visual
int valorAnterior = 0; // Valor leído previamente para comparar tendencias
int contadorTendencia = 0; // Contador de incrementos/decrementos consecutivos
bool estaIncrementando = false; // Indica si la señal está aumentando
bool estaEstable = false; // Indica si la señal es constante
// Variables para graficar la señal
int valorSeñal;
int valorSensor;
int Xprevio = 0, Yprevio = 0; // Coordenadas anteriores para el gráfico
// Función para dibujar los ejes de la gráfica
void dibujarEjes() {
// Dibuja el eje Y (vertical)
pantalla.drawLine(Xinicial, Yinicial - 5, Xinicial, Yinicial + altoGrafica, SSD1306_WHITE);
// Dibuja el eje X (horizontal)
pantalla.drawLine(Xinicial, Yinicial + altoGrafica, Xinicial + anchoGrafica, Yinicial + altoGrafica, SSD1306_WHITE);
// Dibuja las etiquetas en los ejes
pantalla.setCursor(2, Yinicial + altoGrafica + 2);
pantalla.setTextSize(1);
pantalla.print("0");
pantalla.setCursor(90, Yinicial + altoGrafica + 2);
pantalla.print("(t)");
}
// Configuración inicial
void setup() {
Serial.begin(9600); // Inicia la comunicación serial
pantalla.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Inicia la pantalla OLED
pantalla.clearDisplay(); // Limpia la pantalla
pantalla.setTextColor(SSD1306_WHITE); // Establece el color de texto en blanco
dibujarEjes(); // Dibuja los ejes de la gráfica
}
// Bucle principal
void loop() {
// Leer el valor del potenciómetro (entrada analógica)
valorSensor = analogRead(pinPotenciometro);
// Escalar el valor leído para ajustarlo a la gráfica
valorSeñal = map(valorSensor, 0, 4095, Yinicial + altoGrafica, Yinicial);
// Mostrar el valor leído en la pantalla
pantalla.fillRoundRect(79, 0, 45, 10, 1, SSD1306_BLACK); // Limpiar área de visualización de valores
pantalla.setCursor(80, 0);
pantalla.print(valorSensor);
// Detectar la tendencia de la señal
if (valorSensor > valorAnterior) {
// La señal está en aumento
if (estaIncrementando) {
contadorTendencia++; // Aumenta el contador si la señal sigue subiendo
} else {
estaIncrementando = true; // La señal comenzó a subir
contadorTendencia = 1; // Resetea el contador
}
estaEstable = false; // No está estable
} else if (valorSensor < valorAnterior) {
// La señal está en disminución
if (!estaIncrementando) {
contadorTendencia++; // Aumenta el contador si la señal sigue bajando
} else {
estaIncrementando = false; // La señal comenzó a bajar
contadorTendencia = 1; // Resetea el contador
}
estaEstable = false; // No está estable
} else {
// La señal está constante
contadorTendencia++;
estaEstable = true; // Está estable
}
// Comprobar y mostrar la alerta de tendencia
pantalla.fillRect(0, 0, 80, 12, SSD1306_BLACK); // Limpiar área de alerta
pantalla.setCursor(0, 0);
pantalla.setTextSize(1);
pantalla.setTextColor(SSD1306_WHITE);
// Mostrar la alarma si se supera el umbral
if (valorSensor >= umbralAlarma) {
pantalla.print("!!!"); // Muestra la alerta
}
// Mostrar el tipo de tendencia
pantalla.setCursor(25, 0);
if (estaEstable) {
pantalla.print("T: Const"); // La señal es constante
} else if (estaIncrementando) {
pantalla.print("T: Up"); // La señal está subiendo
} else {
pantalla.print("T: Down"); // La señal está bajando
}
// Mostrar la alarma si la señal supera el umbral en la gráfica
if (valorSeñal >= umbralAlarma) {
pantalla.fillRect(15, 0, 15, 12, SSD1306_BLACK); // Limpiar área de alerta
pantalla.setCursor(5, 0);
pantalla.setTextSize(1);
pantalla.setTextColor(SSD1306_WHITE);
pantalla.print("!!!"); // Muestra la alerta
}
// Graficar la señal en la pantalla
if (Yprevio == 0) {
pantalla.drawPixel(Xinicial, valorSeñal, SSD1306_WHITE); // Primer punto en la gráfica
} else {
pantalla.drawLine(Xprevio, Yprevio, Xinicial, valorSeñal, SSD1306_WHITE); // Línea de la gráfica
}
pantalla.display(); // Actualiza la pantalla con los nuevos datos
// Actualizar las variables para la siguiente iteración
valorAnterior = valorSensor; // Actualiza el valor anterior
Yprevio = valorSeñal; // Actualiza las coordenadas Y previas
Xprevio = Xinicial; // Actualiza las coordenadas X previas
Xinicial++; // Avanza a la siguiente posición en X
// Reiniciar la gráfica si se llena
if (Xinicial >= anchoGrafica) {
Xinicial = 4; // Reinicia la posición X
pantalla.clearDisplay(); // Limpia la pantalla
dibujarEjes(); // Redibuja los ejes
Yprevio = 0; // Reinicia las coordenadas Y previas
}
// Espera antes de la siguiente lectura
delay(tasaMuestreo);
}