#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1 // No reset pin required for 4-wire SPI
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET, SSD1306_SWITCHCAPVCC);
const int sensorPin = A0;
float temperaturaActual;
const int numPoints = 60;
float temperaturaHistorial[numPoints] = {0};
const int barWidth = SCREEN_WIDTH / numPoints;
int tempMaxOptions[] = {40, 42, 45, 48, 50};
int numOptions = 5;
int selectedOption = 2; // Opcion seleccionada inicialmente (45C)
int tempMin = 0;
int tempMax;
const int botonArriba = 6;
const int botonAbajo = 7;
const int botonSeleccionar = 5;
void mostrarMenuConfiguracion();
void configurarTemperaturaMaxima();
void mostrarGraficoTemperatura();
void setup()
{
Serial.begin(9600);
//pinMode(botonArriba, INPUT_PULLUP);
//pinMode(botonAbajo, INPUT_PULLUP);
//pinMode(botonSeleccionar, INPUT_PULLUP);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Error al iniciar el OLED"));
for (;;)
;
}
display.clearDisplay();
display.display();
mostrarMenuConfiguracion();
delay(1000);
}
void mostrarMenuConfiguracion()
{
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Configuracion:");
display.println();
display.print("Selecciona Temp Max:");
display.println();
for (int i = 0; i < numOptions; i++)
{
display.print(i + 1);
display.print(tempMaxOptions[i]);
display.println("C");
}
display.display();
while (digitalRead(botonSeleccionar) == HIGH)
{
if (digitalRead(botonArriba) == LOW)
{
selectedOption = (selectedOption + 1) % numOptions;
delay(200);
}
if (digitalRead(botonAbajo) == LOW)
{
selectedOption = (selectedOption - 1 + numOptions) % numOptions;
delay(200);
}
mostrarMenuConfiguracion();
}
tempMax = tempMaxOptions[selectedOption];
configurarTemperaturaMaxima();
}
void configurarTemperaturaMaxima()
{
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Temp Max configurada:");
display.setCursor(0, 16);
display.print(tempMax);
display.println("C");
display.display();
delay(2000);
mostrarGraficoTemperatura();
}
void mostrarGraficoTemperatura()
{
while (true)
{
int sensorValue = analogRead(sensorPin);
float voltage = sensorValue * 5.0 / 1023.0;
temperaturaActual = (voltage - 0.5) * 100;
for (int i = 0; i < numPoints - 1; i++)
{
temperaturaHistorial[i] = temperaturaHistorial[i + 1];
}
temperaturaHistorial[numPoints - 1] = temperaturaActual;
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Temp: ");
display.print(temperaturaActual);
display.println(" C");
// Mostrar la gráfica de temperatura en el resto de la pantalla
for (int i = 0; i < numPoints; i++) {
int x = i * barWidth;
int barHeight = map(temperaturaHistorial[i], 0, 45, 0, 50);
display.fillRect(x, SCREEN_HEIGHT - barHeight, barWidth, barHeight-14, SSD1306_WHITE);
//display.fillRect(x, 32 , 1, 6, SSD1306_WHITE);
}
// Mostrar las líneas horizontales para las temperaturas máxima y mínima
int yMax = map(tempMax, 0, 45, 0, 14);
int yMin = map(tempMin, 0, 45, 50, 0);
display.drawFastHLine(0, yMax, SCREEN_WIDTH, SSD1306_WHITE);
display.drawFastHLine(0, yMin, SCREEN_WIDTH, SSD1306_WHITE);
// Mostrar la etiqueta de temperatura máxima y mínima
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(80, 2); // Ajuste de posición para la leyenda Max
display.print("Max: ");
display.print(tempMax);
display.print("C");
display.setCursor(80, SCREEN_HEIGHT-8); // Ajuste de posición para la leyenda Min
display.print("Min: ");
display.print(tempMin);
display.print("C");
display.display();
// Esperar 1 segundo
delay(1000);
}
}