/*
 * AFPT - Arduino Fácil Para Todos
 * 
 * Lectura del sensor KY-013 y presentación de resultados en un Display LCD 1602
 * 
 * Modulo_KY-013.ino
 * 
 * www.fantasystudios.es/arduino
 * 
 * Creado el 9 de Noviembre de 2020
 * Por Manuel Peláez
 * 
 */

 
// Modulo Sensor KY-013   
// Sensor de temperatura analogico
// Se lee el valor de la NTC
// Se convierte a Kelvin y despues a grados centigrados.
// Conexion del modulo kKY-013
// S -> +5V (Pin izquierdo) ; Pin central GND ; Pin derecho  Salida (- -> Salida)  
// 




// Librerías necesarias

#include <math.h>                         //necesaria para el logaritmo
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>

//Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire, -1);
//Adafruit_SH1107 display(64, 128, &Wire, -1);
Adafruit_SH1106G display(128, 64, &Wire, -1);
//unsigned long delayTime;



//Definimos el pin analógico por donde entrara la señal de la placa sensora KY-013
const int sensor_pin = A0;


//declaro variables del programa
char Raw[5];                              //Para almacenar el valor leido (CHAR)
int valor_leido;                          //Para almacenar el valor leido (INT)
double TempK;                             //Para almacenar la temperatura calculada en Kelvin
double TempC;                             //Para almacenar la temperatura calculada en Centigrados
float Temperatura;              // Para visualizar en pantalla oled     
float Humidity;                 // Para visualizar en pantalla oled     


void setup() {

  
  Serial.begin (57600) ;
  
  display.begin(0x3C, true); // Address 0x3C default
 
   // Clear the buffer.
  display.clearDisplay();
  
  display.setRotation(0);    //Rotar Pantalla
  display.drawRoundRect( 1, 18, 125, 29, 4, SH110X_WHITE);
  display.setTextSize(2);
  display.setCursor(5, 26);
  display.setTextColor(SH110X_WHITE);
  display.println("TERMOMETRO");
  display.println("  KY-013  ");  
  display.display();
  delay(1500);
  
  
  
}


void loop() {
  valor_leido = analogRead(sensor_pin);   //leemos el valor analógico y lo almacenamos
  
  sprintf(Raw,"%04d", valor_leido);       //convertimos el valor leido en una cadena "char" de 4 
                                          //caractereres y le añadimos ceros a la izquierda para
                                          //que la longitud sea siempre igual. De 0000 a 9999.
                                          //Si no hacemos esto sería de 0 a 9999 y tendriamos
                                          //problemas al visualizar el dato en el display
 
  

        //convertimos el valor leido a grados Kelvin



  Serial.println(valor_leido);

  Serial.print("Formato Raw: ");
  Serial.println(Raw);
  
  Serial.print("Formato Kelvin: ");
  Serial.println(TempK);

  TempK = conversion(valor_leido);  

  //Serial.println(valor_leido);

  TempC = TempK - 273.15;                 //convertimos el valor de kelvin a centrígrados

  Serial.print("Formato Centigrados: ");
  Serial.println(TempC);
  
  Temperatura = TempC;

  Serial.print("Temperatura : ");
  Serial.println(Temperatura);
  
  delay (1000);


  // Limpiar buffer
  display.clearDisplay();

  display.setTextSize(1);
  display.setCursor(30,0);
  display.setTextColor(SH110X_WHITE);
  
  display.print("TEMPERATURA");
  display.setTextSize(2);
  display.setCursor(30,12);
  display.print(Temperatura);
  display.print(" ");
  display.setTextSize(1);
  display.cp437(true);      // Cargar tabla caracteres ASCII
  display.write(167);       // Escribe el simbolo grados ª 
  display.setTextSize(2);
  display.print("C");
  
  // display humidity
  display.setTextSize(1);
  display.setCursor(40, 35);
  display.print("HUMEDAD: ");
  display.setTextSize(2);
  display.setCursor(30, 47);
  display.print(Humidity);
  display.println(" %");
  
  
  display.display();
  //delay(500);

  /*

  lcd.setCursor(0,0);                     //movemos el cursor a 1ªcolumna y 1ª fila
  lcd.print("RAW=");                      //mostramos el mensaje
  lcd.print(Raw);                         //mostramos el char de 4 caracteres con el valor leido

  TempK = conversion(valor_leido);        //convertimos el valor leido a grados Kelvin

  lcd.setCursor(0,1);                     //movemos el cursor a 1ª columna y 2ª fila
  lcd.print("K=");                        //mostramos el mensaje de grados kelvin
  lcd.print(TempK,1);                     //mostramos los grados kelvin leidos (con 1 decimal)

  TempC = TempK - 273.15;                 //convertimos el valor de kelvin a centrígrados

  lcd.setCursor(10,1);                     //movemos el cursor a 11ª columna y 2ª fila
  lcd.print("C=");                        //mostramos el mensaje de grados centrígrados
  lcd.print(TempC,1);                     //mostramos los grados centrígrados (con 1 decimal)

  delay(1000);                            //esperamos 1 segundo y repetimos la función "loop"

  */



}


//función que le damos un valor INT leido del sensor y lo convertimos usando la ecuación
//Steinhart-Hart (https://en.wikipedia.org/wiki/Steinhart–Hart_equation) que se usa para convertir
//los valores leidos de una NTC a temperatura.
//Nos devuelve la conversión en un valor DOUBLE
double conversion(int dato) {
  double x;
  x = log(10000.0*(1024.0/dato-1));
  x = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * x * x)) * x);
  return x;
}