/*
Se empleó un potenciómetro para simular las lecturas del sensor de temperatura
*/
#include <SPI.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C LCD(0x27, 20, 4);
const int pinPotenciometro = 4;
const int pinLed = 16;
const int pinSDA = 1;
const int pinSCL = 2;
bool EstadoLed = false;
bool Configuracion;
bool RangoValido;
unsigned int TiempoAnterior;
unsigned int TiempoActual;
int i;
int TemperaturaMinima;
int TemperaturaMaxima;
int Temperatura;
void setup() {
//Configuración
Serial.begin(115200);
Wire.begin(pinSDA,pinSCL);
pinMode(pinLed,OUTPUT);
//Inicialización
digitalWrite(pinLed,LOW);
LCD.init();
LCD.backlight();
LCD.home();
TiempoAnterior = millis();
Configuracion = true;
}
void loop() {
if(Configuracion){
LeerIntervalosInicialesDeTemperatura();
Configuracion = false;
}
Temperatura = LeerDatosSensor();
LCD.setCursor(0,1);
LCD.printf("Temperatura: %d C ",Temperatura);
if(Temperatura >= TemperaturaMaxima || Temperatura <= TemperaturaMinima){
LCD.setCursor(7,3);
LCD.print("ALERTA");
TiempoActual = millis();
if(TiempoActual-TiempoAnterior>=250){
TiempoAnterior = TiempoActual;
EstadoLed ^= 1;
digitalWrite(pinLed,EstadoLed);
}
}else{
LCD.setCursor(7,3);
LCD.print(" ");
digitalWrite(pinLed,LOW);
}
LeerComandos();
delay(10);
}
void LeerIntervalosInicialesDeTemperatura(){
RangoValido = false;
LCD.clear();
LCD.setCursor(0,0);
LCD.println("Ingrese el rango de");
LCD.print("temperatura (A-B)");
while(!RangoValido){
LeerRango();
}
ImprimirRango();
}
void LeerRango(){
bool LeyendoLimiteInferior = true;
bool LimiteInferiorValido = false;
bool LimiteSuperiorValido = false;
char Caracter;
char LimiteInferior[4] = {0};
char LimiteSuperior[4] = {0};
bool Inicio = true;
i = 0;
while(Serial.available()>0){
Caracter = Serial.read();
if(Caracter >= 48 && Caracter <= 57){
//El caracter es un número
if(Inicio){
Inicio = false;
}
if(LeyendoLimiteInferior){
LimiteInferior[i] = Caracter;
//Serial.printf("Número LI: %c\n",LimiteInferior[i]);
i++;
LimiteInferiorValido = true;
}else{
LimiteSuperior[i] = Caracter;
//Serial.printf("Número LS: %c \n",LimiteSuperior[i]);
i++;
LimiteSuperiorValido = true;
}
}else if(Caracter == '-' || Caracter == '\n'){
if(Inicio){
RangoInvalido();
}else if(LimiteInferiorValido && Caracter == '-'){
LeyendoLimiteInferior = false;
i = 0;
//Serial.println("Se decteó el guión");
}else if(LimiteSuperiorValido && Caracter == '\n'){
//Serial.println("Comparando límites");
//Serial.printf("LI: %d \n",atoi(LimiteInferior));
//Serial.printf("LS: %d \n",atoi(LimiteSuperior));
if(atoi(LimiteInferior)<atoi(LimiteSuperior)){
//Serial.println("Intervalo válido");
RangoValido = true;
TemperaturaMinima = atoi(LimiteInferior);
TemperaturaMaxima = atoi(LimiteSuperior);
}else{
RangoInvalido();
}
}
}else{
//Caracter no válido
RangoInvalido();
}
}
delay(50);
}
void RangoInvalido(){
LCD.clear();
LCD.setCursor(6,2);
LCD.println("Rango inválido");
LimpiarBuffer();
i = 0;
}
void LimpiarBuffer(){
while(Serial.available()>0){
Serial.read();
}
}
int LeerDatosSensor(){
int ValorPotenciometro;
ValorPotenciometro=analogRead(pinPotenciometro);
return map(ValorPotenciometro,0,4095,5,90);
}
void LeerComandos(){
char Caracter;
RangoValido = false;
if(Serial.available()>2){
Serial.println("Leyendo rango");
LeerRango();
if(!RangoValido){
LCD.clear();
}
ImprimirRango();
}else if(Serial.available()==2){
Serial.println("Leyendo caracter");
Caracter = Serial.read();
if(Caracter == 'R'){
Configuracion = true;
LCD.clear();
LCD.home();
LimpiarBuffer();
}
}
}
void ImprimirRango(){
LCD.clear();
LCD.setCursor(0,0);
LCD.printf("Rango: %d C - %d C",TemperaturaMinima,TemperaturaMaxima);
}