surbyte:
Y si le sobra con un pulsador para que sugieres un encoder?
¿Quien le sugiere un encoder? El texto es claro y dice que es el tiempo que me llevaría hacerlo de esa forma, que por desatento o desagradecido te quitan las ganas de ayudar. Ni se tomo la molestia de cargar el código, aunque cuando lea este mensaje diga otra cosa.
Cuando escribes un código para otra persona ¿No esperas al menos que lo pruebe?
El usuario puede creer que necesita hacer un menú pero, estamos hablando de una nevera donde No hay que establecer dos valores de temperatura, basta con un valor solo y luego definir lo que sería la histéresis.
¿Es necesario hacer un menú y aprender a manejar una librería para ello? Sobre todo para alguien que manifiesta no entender el tema de los millis().
Habiendo solo dos datos que mostrar ni siquiera es necesario hacer un lcd.clear durante el programa.
Aquí va el código con solo un pulsador donde clic baja el valor, doble clic lo aumenta y manteniendo presionado lo graba en la memoria eeprom.
Incluye una animación en pantalla para cuando el motor se encuentra en marcha y un apagado del mismo por si falla el sensor de temperatura.
/*
* Arduino nano pinout:
* _______________
* | USB |
* |13 12|
* |3V3 11|
* |AREF 10| Relay
* |A0 9|
* |A1 8|
* Pulsador |A2 7|
* DS18B20 |A3 6|
*RTC LCD SDA |A4 5|
*RTC LCD SCL |A5 4|
* |A6 3|
* |A7 2|
* |5V GND|
* |RST RST|
* |GND 1/INT2/RX|
* |VIN 0/INT3/TX|
* |MISO SS|
* |SCK MOSI|
* |_______________|
*
*/
/* LIBRERIAS NECESARIAS PARA EL FUNCIONAMIENTO DEL CODIGO
*/
#include <DallasTemperature.h>
#include "OneButton.h"
OneButton button(A2, true);
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7);
#include <EEPROM.h>
OneWire oneWire(A3); //se estancia la libreria dallas
DallasTemperature sensors(&oneWire);
DeviceAddress outsideThermometer;
int TempVal; // Valor de temperatura establecido
float Frio; // Valor capturado por el sensor
int Relay = 10; // Pin salda para el Relay
byte RelayEstatus = 0;
byte cursor = 0;
int tmax = 5;
int tmin = -15;
int MargenTemp = 3; // Histéresis de temperatura
void setup() {
lcd.begin(16, 2);
lcd.setBacklightPin(3, POSITIVE);
lcd.setBacklight(HIGH);
pinMode(Relay, OUTPUT);
digitalWrite(Relay,HIGH);
button.attachClick(click);
button.attachDoubleClick(doubleclick);
button.attachLongPressStart(longPressStart);
if (EEPROM.read(50) == 255) EEPROM.put(0,-5); // Si es la primera vez que se graba en la eeprom
EEPROM.get(50 , TempVal); // Establece el valor de lo previamente guardado
sensors.requestTemperatures();
delay(1000);
lcd.setCursor(0,0);
lcd.print("T: ");
MideTemperatura();
lcd.setCursor(10,0);
lcd.print("E:");
lcd.setCursor(12,0);
lcd.print(TempVal);lcd.print("\337");
}
void loop() {
unsigned long currentMillis = millis();
button.tick();
if (currentMillis > 60000) { // Pasado el primer minuto de arranque del programa
if (currentMillis % 20000 < 3) { // Cada 20 segundos
MideTemperatura(); // Mide la temperatura
Termostato(); // Consulta el termostato
delay(3);
}
}
if(RelayEstatus == 1) { // Si el motor esta funcionando muestra en pantalla una animación
if (currentMillis % 1000 < 2) { // Por cada segundo transcurrido
lcd.setCursor(cursor,1);
lcd.print(" ");
cursor++;
if (cursor > 15) cursor = 0;
lcd.setCursor(cursor,1);
lcd.print("*");
delay(2);
}
}
}
void click() { // Baja la temperatura establecida y la muestra en pantalla
TempVal--;
if(TempVal < tmin) TempVal = tmin;
lcd.setCursor(12,0);
lcd.print(" ");
lcd.setCursor(12,0);
lcd.print(TempVal);lcd.print("\337");
}
void doubleclick() { // Sube la temperatura establecida y la muestra en pantalla
TempVal++;
if(TempVal > tmax) TempVal = tmax;
lcd.setCursor(12,0);
lcd.print(" ");
lcd.setCursor(12,0);
lcd.print(TempVal);lcd.print("\337");
}
void longPressStart() { // Graba en la eeprom ell valor establecido
EEPROM.put(50 , TempVal);
lcd.setCursor(cursor,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("** Guardado **");
delay(1500);
lcd.setCursor(3,1);
lcd.print(" ");
}
void MideTemperatura() {
if (sensors.getAddress(outsideThermometer, 0)) { // Si hay comunicación con el sensor DS18B20
sensors.requestTemperatures(); //Se envía el comando para leer la temperatura
Frio = sensors.getTempCByIndex(0); //Se obtiene la temperatura en ºC
lcd.setCursor(3,0);
lcd.print(" ");
lcd.setCursor(3,0);
lcd.print(Frio,1); // Imprime la temperatura con un decimal
lcd.print("\337"); // Imprime simbolo °
}
else { // Si no hay comunicación con el sensor porque se ha cortado el cable, etc.
lcd.clear();
lcd.setCursor(2,1);
lcd.print("Falla sensor"); // Falla el sensor.
digitalWrite(Relay,HIGH); // Apaga el motor.
while(1){ } // Detiene el programa.
}
}
void Termostato() {
if (Frio <= TempVal) {
digitalWrite(Relay,HIGH); RelayEstatus = 0; // Apaga el rele
lcd.setCursor(0,1); lcd.print(" ");
}
if (Frio > TempVal + MargenTemp) {
digitalWrite(Relay,LOW); RelayEstatus = 1; // Activa el rele
}
}
Saludos