#include <Wire.h> // Librería para comunicación I2C
#include <Adafruit_GFX.h> // Librería gráfica para manejar gráficos en pantallas
#include <Adafruit_SSD1306.h> // Librería para controlar pantallas OLED con controlador SSD1306
Adafruit_SSD1306 display(-1); // Objeto 'display' de la clase Adafruit_SSD1306 sin pin de reset
#define DIS_WIDTH 128 // Ancho de la pantalla OLED en píxeles
#define DIS_HEIGHT 64 // Altura de la pantalla OLED en píxeles
#define IMG_HEIGHT 32 // Altura de la imagen a mostrar
#define IMG_WIDTH 32 // Ancho de la imagen a mostrar
int xOffset = (DIS_WIDTH - IMG_WIDTH) / 2; // Desplazamiento horizontal para centrar la imagen
int yOffset = (DIS_HEIGHT - IMG_HEIGHT) / 2 - 15; // Desplazamiento vertical para centrar la imagen
int Pot1 = 34; // Pin analógico para el primer potenciómetro
int Pot2 = 35; // Pin analógico para el segundo potenciómetro
// Bitmap de la imagen de advertencia de 32x32 píxeles
const unsigned char epd_bitmap_Advertencia [] PROGMEM = {
// Datos de la imagen en formato hexadecimal
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00,
0x01, 0xFF, 0x80, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xF0, 0x00,
0x1F, 0xFF, 0xF8, 0x00, 0x3E, 0x7F, 0xFC, 0x00, 0x7C, 0x3E, 0x7E, 0x00, 0x78, 0x1F, 0x3E, 0x00,
0xF0, 0x0F, 0x1E, 0x00, 0xF0, 0x0F, 0x1E, 0x00, 0xF0, 0x0F, 0x1E, 0x00, 0xF8, 0x1F, 0x3E, 0x00,
0x7C, 0x3E, 0x7E, 0x00, 0x3E, 0x7F, 0xFC, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xF0, 0x00,
0x07, 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x7E, 0x00, 0x00
};
// Arreglo de imágenes (en este caso, solo contiene la imagen de advertencia)
const int epd_bitmap_allArray_LEN = 1;
const unsigned char* epd_bitmap_allArray[1] = {
epd_bitmap_Advertencia
};
// Función para mostrar un mensaje en pantalla cuando se alcanza el setpoint
void SP_Message() {
display.clearDisplay(); // Limpia la pantalla
display.setTextSize(1); // Ajusta 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" en la pantalla
display.println("Alcanzado"); // Muestra "Alcanzado" en la pantalla
display.display(); // Actualiza la pantalla para mostrar el mensaje
}
// Función de configuración que se ejecuta al iniciar
void setup() {
pinMode(Pot1, INPUT); // Configura el pin del potenciómetro 1 como entrada
pinMode(Pot2, INPUT); // Configura el pin del potenciómetro 2 como entrada
Serial.begin(9600); // Inicia la comunicación serial a 9600 bps
// Inicializa la pantalla OLED y verifica si está conectada correctamente
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 no encontrado")); // Muestra un mensaje de error si la pantalla falla
for (;;); // Detiene el programa si hay un error de inicialización
}
delay(2000); // Pausa de 2 segundos para asegurar la inicialización completa
}
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
// Mapea los valores de los potenciómetros a un rango de 0 a 2000
float pv = map(pot1_value, 0, 4095, 0, 2000);
float sp = map(pot2_value, 0, 4095, 0, 2000);
// Compara los valores del proceso (pv) y el setpoint (sp)
if (pv == sp) {
SP_Message(); // Llama a la función para mostrar el mensaje de setpoint alcanzado
delay(1000); // Pausa de 1 segundo
display.clearDisplay(); // Limpia la pantalla
// Dibuja la imagen de advertencia en el centro de la pantalla
display.drawBitmap(xOffset, yOffset, epd_bitmap_allArray[0], IMG_WIDTH, IMG_HEIGHT, WHITE);
display.display(); // Muestra la imagen en pantalla
delay(2000); // Pausa de 2 segundos antes de continuar
} else {
// Muestra los valores de SP y PV si no son iguales
display.clearDisplay(); // Limpia la pantalla
display.setTextSize(1); // Ajusta el tamaño del texto
display.setTextColor(WHITE); // Define el color del texto
display.setCursor(0, 0); // Posiciona el cursor en la esquina superior izquierda
display.print("SP: "); // Imprime "SP: " en pantalla
display.println(sp); // Muestra el valor del setpoint
display.print("PV: "); // Imprime "PV: " en pantalla
display.println(pv); // Muestra el valor del proceso
display.display(); // Actualiza la pantalla para mostrar los valores actuales
}
}