//CODIGO
//se incluyen las librerias
#include <OneWire.h>
#include <DallasTemperature.h>
 
//includes para usar display ssd1306 (recuerda corregir en el .h el tamaño correcto de tu display)
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
 
//si tu display no usa pin reset, aquí pon -1 para no desperdiciar un pin de tu arduino
Adafruit_SSD1306 display(-1);
 
//se define el pin que vamos a usar con one wire
#define ONE_WIRE_BUS 7
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor (&oneWire);
 
char buffer_temps[128];
 
//definicion de pines
byte led = 6;
byte boton_dwn = 2;
byte boton_up = 3;
byte ventilador = 5;
 
//variables globales
float temperatura;
bool ventilador_activado = false;
int temperatura_limite = 29;
bool cambio_limite = false;
 
long tiempo_anterior_up;
long diferencia_up;
long tiempo_anterior_dwn;
long diferencia_dwn;
 
void sube_limite();
 
 
void setup() {
 
  //leno array con valor alot
for(int i = 0; i < 128; i++){
  buffer_temps[i] = 110;
}
 
    //Inicio el display para la AxAA dirección
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)
 
  // Borrar display
  display.clearDisplay();
 
  //TCCR0B = TCCR0B & B11111000 | B00000101;    // for PWM frequency of 30.64 Hz
  Serial.begin(9600);                //activo puerto Serial
 
  pinMode (ventilador,OUTPUT);      //pin de ventilador como salida digital
 
  //pullup a boton up, y luego activo interrupción
  pinMode(boton_up, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(boton_up), sube_limite, FALLING);
 
  //pullup a boton up, y luego activo interrupción
  pinMode(boton_dwn, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(boton_dwn), baja_limite, FALLING);
 
  dibuja_limite(temperatura_limite);
 
}
 
long contador1 =0;
 
void loop() {
 
 
  if (millis() - contador1 > 1000){
      contador1 = millis();
      sensor.requestTemperatures();
      temperatura = sensor.getTempCByIndex(0);
      llena_buffer(temperatura);
      ventilador_accion();
      dibuja_temperatura(temperatura);
      dibuja_cuadricula();
      dibuja_curva();
    }
 
  if (cambio_limite){
    dibuja_limite(temperatura_limite);
    cambio_limite = false;
  }
 
}
 
 
void ventilador_accion(){
 
  if (temperatura > temperatura_limite){
    digitalWrite(ventilador,HIGH);
    ventilador_activado = true;
 
  }else{
    digitalWrite(ventilador,LOW);
    ventilador_activado = false;
 
  }
 
}
 
void sube_limite(){
  diferencia_up = millis() - tiempo_anterior_up;
  tiempo_anterior_up = millis();
  if (diferencia_up > 250){
      temperatura_limite++;
      cambio_limite = true;
  }
}
 
void baja_limite(){
  diferencia_dwn = millis() - tiempo_anterior_dwn;
  tiempo_anterior_dwn = millis();
 
  if (diferencia_dwn > 250){
      temperatura_limite--;
      cambio_limite = true;
  }
}
 
void dibuja_temperatura(float temp){
  display.setTextColor(WHITE,BLACK);
  display.setTextSize(1);
  display.setCursor(0,0);
  display.println("T = " + String(temp,1));
  display.display();
}
 
void dibuja_limite(float temp){
  display.setTextColor(WHITE,BLACK);
  display.setTextSize(1);
  display.setCursor(64,0);
  display.println("T = " + String(temp,0));
  display.display();
}
 
void dibuja_cuadricula(){
  display.fillRect(0,13,128,64,BLACK);
  //este for repite cada 10 pixeles verticales la linea de puntos que genera el for de adentro
  for (int b = 13; b < 64; b = b + 10){
    //esto dibuja una linea de puntos
    for (int i = 0; i < 128; i = i + 12) {
      display.drawPixel(i, b, WHITE);
    }
 
    if (b == 43) {
      for (int i = 0; i < 128; i = i + 3) {
        display.drawPixel(i, b, WHITE);
      }
    }
  }
}
 
void dibuja_curva(){
  for (int i = 0; i < 128; i++){
    if(buffer_temps[i]<109){
      int y = map (buffer_temps[i],-10,50,64,13);
      display.drawPixel(i, y , WHITE);
  }
  }
}
 
void llena_buffer(float temp){
  for (int i = 1 ; i < 128; i++){
    buffer_temps[i-1] = buffer_temps[i];
  }
  buffer_temps[127] = temp;
 
 
// for (int i ; i < 128 ; i++){
//   Serial.print(buffer_temps[i]);
//    Serial.print(" - ");
//  }
//  Serial.print(" X ");
//  Serial.println("");
//
 
}