#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Definiciones para 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);
// Pines de los potenciómetros
uint16_t pinPotenciometro1 = 34;
uint16_t pinPotenciometro2 = 35;
// Configuración de la gráfica
const int tasaMuestreo = 200; // Tiempo entre mediciones en milisegundos
const int anchoGrafica = 105; // Ancho de la gráfica en píxeles
const int altoGrafica = 43; // Altura de la gráfica en píxeles
const int Yinicial = 16; // Coordenada Y inicial de la gráfica
static int Xinicial = 4; // Coordenada X inicial de la gráfica
static int Xprev1, Yprev1 = 0; // Coordenadas anteriores para la señal 1
static int Xprev2, Yprev2 = 0; // Coordenadas anteriores para la señal 2
// Variables para almacenar los valores leídos y escalados
int valorEscalado1, valorEscalado2; // Valores escalados para las gráficas
int valorSensor1, valorSensor2; // Valores leídos de los sensores
// Función para dibujar los ejes de la gráfica
void dibujarEjes() {
// Dibuja el eje Y (vertical)
pantalla.drawLine(Xinicial, Yinicial - 10, Xinicial, Yinicial + 35, SSD1306_WHITE);
// Dibuja el eje X (horizontal)
pantalla.drawLine(Xinicial, Yinicial + 35, Xinicial + 104, Yinicial + 35, SSD1306_WHITE);
// Muestra etiquetas en los ejes
pantalla.setCursor(6, 5);
pantalla.setTextSize(1);
pantalla.print("PV-"); // Leyenda para el valor leído
pantalla.setCursor(95, Yinicial + 40);
pantalla.print("(t)"); // Etiqueta de tiempo
pantalla.setCursor(0, Yinicial + 40);
pantalla.print("0"); // Origen de la gráfica
pantalla.display();
}
// Configuración inicial
void setup() {
Serial.begin(9600); // Inicia comunicación serial
pantalla.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Inicia la pantalla OLED
pantalla.clearDisplay(); // Limpia la pantalla
pantalla.setTextColor(SSD1306_WHITE); // Establece el color del texto
pantalla.setTextSize(1); // Tamaño de texto pequeño
dibujarEjes(); // Dibuja los ejes iniciales
}
// Bucle principal
void loop() {
// Leer valores analógicos de los potenciómetros
valorSensor1 = analogRead(pinPotenciometro1);
valorSensor2 = analogRead(pinPotenciometro2);
// Escalar los valores para ajustarlos a la gráfica
valorEscalado1 = map(valorSensor1, 0, 4095, altoGrafica + 5, Yinicial);
valorEscalado2 = map(valorSensor2, 0, 4095, altoGrafica + 5, Yinicial);
// Mostrar los valores actuales en la pantalla
pantalla.fillRoundRect(35, 5, 100, 11, 1, SSD1306_BLACK); // Limpia la zona de texto
pantalla.setCursor(25, 5);
pantalla.print("Y1:"); // Muestra etiqueta para la señal 1
pantalla.setCursor(45, 5);
pantalla.print(valorSensor1); // Valor del sensor 1
pantalla.setCursor(80, 5);
pantalla.print("Y2:"); // Muestra etiqueta para la señal 2
pantalla.setCursor(100, 5);
pantalla.print(valorSensor2); // Valor del sensor 2
// Graficar la señal del primer potenciómetro
if (Yprev1 == 0) pantalla.drawPixel(Xinicial, Yinicial, SSD1306_WHITE);
else pantalla.drawLine(Xprev1, Yprev1, Xinicial, valorEscalado1, SSD1306_WHITE);
// Graficar la señal del segundo potenciómetro
if (Yprev2 == 0) pantalla.drawPixel(Xinicial, Yinicial, SSD1306_WHITE);
else pantalla.drawLine(Xprev2, Yprev2, Xinicial, valorEscalado2, SSD1306_WHITE);
// Actualiza la pantalla con los nuevos valores
pantalla.display();
// Actualizar los valores anteriores
Yprev1 = valorEscalado1;
Xprev1 = Xinicial;
Yprev2 = valorEscalado2;
Xprev2 = Xinicial;
// Incrementar la coordenada X para avanzar en la gráfica
Xinicial++;
// Reiniciar la gráfica si se alcanza el borde derecho
if (Xinicial >= anchoGrafica) {
Xinicial = 4; // Reinicia la coordenada X
pantalla.clearDisplay(); // Limpia la pantalla
dibujarEjes(); // Redibuja los ejes
Yprev1 = 0; // Reinicia las coordenadas anteriores
Yprev2 = 0;
}
// Espera antes de la siguiente lectura
delay(tasaMuestreo);
}