#include <Wire.h> // Incluye la librería Wire para comunicación I2C
#include <Adafruit_GFX.h> // Incluye la librería gráfica de Adafruit GFX para gráficos en pantalla
#include <Adafruit_SSD1306.h> // Incluye la librería para controlar pantallas OLED con controlador SSD1306
Adafruit_SSD1306 display(-1); // Crea un objeto 'display' de la clase Adafruit_SSD1306, sin pin de reset
#define DIS_WIDTH 128 // Define el ancho de la pantalla OLED en píxeles
#define DIS_HEIGHT 64 // Define la altura de la pantalla OLED en píxeles
#define IMG_HEIGHT 32 // Define la altura de la imagen a mostrar
#define IMG_WIDTH 32 // Define el ancho de la imagen a mostrar
int xOffset = (DIS_WIDTH - IMG_WIDTH) / 2; // Calcula el desplazamiento horizontal para centrar la imagen
int yOffset = (DIS_HEIGHT - IMG_HEIGHT) / 2 - 15; // Calcula el desplazamiento vertical para centrar la imagen
int Pot1 = A0; // Pin analógico donde está conectado el potenciómetro 1
int Pot2 = A1; // Pin analógico donde está conectado el potenciómetro 2
// Definición del gráfico 'Skull' en formato bitmap de 32x32 píxeles
const unsigned char epd_bitmap_Skull [] PROGMEM = {
// Datos en formato hexadecimal para representar la imagen
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x03, 0xc0, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x7f, 0xfe, 0x00,
0x00, 0x7f, 0xfe, 0x00, 0x0c, 0xff, 0xff, 0x30, 0x0e, 0xff, 0xff, 0x70, 0x1f, 0xff, 0xff, 0x78,
0x3f, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xf8, 0x0f, 0x63, 0xc6, 0xf0, 0x00, 0x41, 0x82, 0x00,
0x00, 0x41, 0x82, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x7e, 0x7e, 0x00, 0x00, 0x7e, 0x7e, 0x00,
0x00, 0x27, 0xf4, 0x00, 0x00, 0x77, 0xee, 0x00, 0x1f, 0xff, 0x7f, 0xf8, 0x1f, 0xdf, 0xfb, 0xf8,
0x1f, 0x9f, 0xf9, 0xf8, 0x0f, 0x0f, 0xf0, 0xf0, 0x0e, 0x0f, 0xf0, 0x70, 0x00, 0x03, 0xc0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
// Arreglo que contiene todas las imágenes (en este caso, solo la imagen 'Skull')
const int epd_bitmap_allArray_LEN = 1;
const unsigned char* epd_bitmap_allArray[1] = {
epd_bitmap_Skull
};
// Función que muestra un mensaje en pantalla cuando se alcanza el setpoint
void SP_Message() {
display.clearDisplay(); // Limpia la pantalla OLED
display.setTextSize(1); // Establece el tamaño del texto
display.setTextColor(WHITE); // Define el color del texto como blanco
display.setCursor(0, 0); // Posiciona el cursor en la esquina superior izquierda
display.println("Setpoint"); // Muestra "Setpoint"
display.println("Alcanzado"); // Muestra "Alcanzado"
display.display(); // Actualiza la pantalla para mostrar el mensaje
}
// Función de configuración que se ejecuta una vez al iniciar
void setup() {
Serial.begin(9600); // Inicializa la comunicación serial
// Inicializa la pantalla OLED con su tipo y dirección I2C
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 está fallando")); // Muestra un mensaje de error si falla
for (;;); // Detiene el programa en caso de error
}
delay(2000); // Pausa de 2 segundos para asegurar la inicialización
}
void loop()
{
int pot1_value = analogRead(Pot1); // Lee el valor del potenciómetro 1
int pot2_value = analogRead(Pot2); // Lee el valor del potenciómetro 2
// Mapear los valores de los potenciómetros a un rango de 0 a 2000
float pv = map(pot1_value, 0, 1023, 0, 2000);
float sp = map(pot2_value, 0, 1023, 0, 2000);
// Compara los valores de proceso y setpoint
if (pv == sp) {
SP_Message(); // Muestra el mensaje de setpoint alcanzado
delay(1000); // Pausa de 1 segundo
display.clearDisplay(); // Limpia la pantalla
// Dibuja la imagen en el centro de la pantalla
display.drawBitmap(xOffset, yOffset, epd_bitmap_allArray[0], IMG_WIDTH, IMG_HEIGHT, WHITE);
display.display(); // Muestra la imagen
delay(2000); // Pausa de 2 segundos antes de actualizar
}
else {
// Muestra los valores de SP y PV si no son iguales
display.clearDisplay(); // Limpia la pantalla
display.setTextSize(1); // Establece el tamaño del texto
display.setTextColor(WHITE); // Define el color del texto
display.setCursor(0, 0); // Posiciona el cursor
display.print("SP: "); // Imprime "SP: " en la pantalla
display.println(sp); // Imprime el valor del setpoint
display.print("PV: "); // Imprime "PV: " en la pantalla
display.println(pv); // Imprime el valor del proceso
display.display(); // Actualiza la pantalla para mostrar los valores
}
}