/*
* 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;
}