#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // Ancho de la pantalla OLED en píxeles
#define SCREEN_HEIGHT 64 // Alto de la pantalla OLED en píxeles

// Inicializa el objeto display OLED utilizando las bibliotecas Adafruit
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

const int sensorPin = 27; // Pin del sensor NTC conectado al ESP32

void setup() {
  Serial.begin(9600);
  
  // Inicializa la comunicación I2C (pines SDA: GPIO21, SCL: GPIO22)
  Wire.begin(21, 22);
  
  // Inicializa el display OLED con dirección I2C predeterminada (0x3C)
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("Error al iniciar SSD1306"));
    while (true); // En caso de error detiene el programa
   }

   delay(2000); 
   
   display.clearDisplay();
}

void loop() {
  
 float temp = readTemperature(); 
  
 drawGraph(temp);
   
 delay(500); 
}

float readTemperature(){
  
 int reading = analogRead(sensorPin); 

 float voltage = reading * (5.0 /1023.0);

 float resistance = ((5.0 - voltage)/voltage) *10000;

 float temperature =(1/(log(resistance/10000)/3959 +1/(273.15+25))) -273.15;
 
 return temperature;
}


void drawGraph(float temp){
  
  display.clearDisplay();
  display.setCursor(0, 0);
  display.print("Temperature: ");
  display.print(temp);
  display.print(" C");
  // Dibuja un rectángulo como fondo del gráfico
  display.drawRect(0, 0, SCREEN_WIDTH-1, SCREEN_HEIGHT-1, WHITE);
  
  // Calcula la posición en el eje Y para dibujar el valor de temperatura
  int yPosition = map(temp, -50.0f, 100.0f, SCREEN_HEIGHT-2 ,1);
  
   for (int x = 3; x < SCREEN_WIDTH-3; x++) {
     
    // Dibuja una línea vertical desde la parte inferior hasta la posición de la temperatura
    display.drawLine(x,yPosition,x,(SCREEN_HEIGHT -2), WHITE);   
   }
   
   display.display();
}