#include <LiquidCrystal.h>
#include <TimerOne.h>
LiquidCrystal lcd(12, 10, 5, 4, 3, 2);
int ThermistorPin = A0;
int PhotoResistorPin = A1;
// Estas constantes deben coincidir con los atributos "gamma" y "rl10" del fotorresistor.
const float GAMMA = 1.2;
const float RL10 = 20.0;
int analogValue = 0;
float voltage = 0.0;
float resistance = 0.0;
float lux = 0.0;
float Vo;
float R1 = 10000;
float logR2, R2, kelvin, celsius;
float c1 = 1.0266267e-03; //coeficiente A
float c2 = 2.5236164e-04; //coeficiente B
float c3 = 3.2744565e-09; //coeficiente C
unsigned long timerPeriod = 1000000; // 1 segundo por defecto
void setup() {
lcd.begin(16, 2);
Serial.begin(9600);
Timer1.initialize(timerPeriod); // Inicializar con el periodo por defecto
Timer1.attachInterrupt(timerIsr); // Asociar la función de interrupción al temporizador
Serial.println("Ingrese el tiempo del timer");
}
void loop() {
// Leer el puerto serial para recibir comandos de configuración
if (Serial.available() > 0) {
timerPeriod = Serial.parseInt(); // Leer el nuevo periodo
if(timerPeriod>0){
Timer1.stop(); // Detener el temporizador mientras se actualiza
Timer1.initialize(timerPeriod); // Configurar el nuevo periodo
Timer1.start(); // Reiniciar el temporizador
}
}
Vo = analogRead(ThermistorPin)+0.5;
R2 = R1 / (1024.0 / (float)Vo - 1.0); // VCC-R1-R_therm-GND (pullup+NTC)
logR2 = log(R2);
kelvin = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
celsius = kelvin - 273.15;
// Convertir el valor analógico en valor de lux:
analogValue = analogRead(PhotoResistorPin);
voltage = float(analogValue) / 1024.0 * 5.0;
resistance = 2000.0 * voltage / (1.0 - voltage / 5.0);
lux = pow(RL10 * 1e3 * pow(10.0, GAMMA) / resistance, (1.0 / GAMMA));
}
// Función de interrupción del temporizador
void timerIsr() {
lcd.setCursor(0, 0);
lcd.print("Grados: " + String(celsius, 2));
lcd.setCursor(0, 1);
lcd.print("Luxes: " + String(lux, 2));
}