Hola, soy nuevo en esto pero con ayuda de otros colegas pude realizar este código de control de humedad, temperatura, intervalo tiempo-marcha/parada de una heladera, calentar y enfriar (es un proyecto de secadero para salame).
El programa se compone de dos fases o ciclos; el primero son dos días con temperatura y humedad máxima, el segundo ciclo continúa del primero unos 15 días más, con temperaturas y humedades máximas diferentes.
Tengo algunos inconvenientes con el modulo DS3231, no se si tengo un problema en el código o el modulo, pero se atrasa más de diez minutos al día, y también aparecen 2 o 3 cifras en los segundos (por lo que yo entiendo serían mili segundos, se detalla en la imagen) . Mas tarde intentaré cambiar el modulo. Tampoco me cuenta la cantidad de días, seguramente hay un error en el código.
Pero lo más importante que quiero hacer es el MENÚ:
Quiero hacer el menú y no logro resolverlo, busqué varias librerías y códigos en internet; pero muchos tienen sus errores, o hay conflictos con las bibliotecas, o no son tan detallados en su explicación, y no logro entenderlos.
Necesito hacer un menú con 3 o 4 botones y poder cambiar la temperatura max, temperatura min, humedad max, humedad min; también cambiar la cantidad de días de cada una de las fases.
Sé que que es mucho pedir, pero cualquier ayuda será bienvenida...
#include <Wire.h>
#include <RTClib.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 8 //sensor pin
#define DHTTYPE DHT22
#include <pt.h> //protothreads
struct pt hilo1; //protothreads
unsigned long marchavapor = 3000; //protothreads
unsigned long paradavapor = 3000; //protothreads
struct pt hilo2; //protothreads
unsigned long marchacalentar = 3000; //protothreads
unsigned long paradacalentar = 3000; //protothreads
struct pt hilo3; //protothreads
unsigned long marchaenfriar = 3000; //protothreads
unsigned long paradaenfriar = 3000; //protothreads
struct pt hilo4; //protothreads
unsigned long marchahela = 3000; //protothreads 300000
unsigned long paradahela = 1200; //protothreads 1200000
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS3231 rtc;
DHT dht(DHTPIN, DHTTYPE);
int btn_inicio = 2;
int enfriar = 12;
int vapor = 10;
int calentar = 11;
int hela = 9; //heladera
long tiempo = 0;
long tiempoUltimaLectura = 0;
long fechayhora = 0;
float hum = 0, tem = 0;
int dia_inicio = 0;
int hora_inicio = 0;
int dia_actual = 0;
int hora_actual = 0;
int temperatura_min = 0;
int temperatura_max = 0;
int humedad_min = 0;
int humedad_max = 0;
int dia_mem = 0;
void setup () {
Wire.begin();
Serial.begin(9600);
rtc.begin();
dht.begin();
lcd.init ();
lcd.backlight();
lcd.clear();
PT_INIT(&hilo1); //protothreads vapor
PT_INIT(&hilo2); //protothreads calentador
PT_INIT(&hilo3); //protothreads enfriador
PT_INIT(&hilo4); //protothreads intervalo heladera
//pinMode(btn_inicio, INPUT_PULLUP);
pinMode(calentar, OUTPUT);
pinMode(vapor, OUTPUT);
pinMode(heladera, OUTPUT);
//Solo una vez para establecer la hora
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
//temperatura_min = 17;
// temperatura_max = 19;
//humedad_min = 90;
// humedad_max = 95;
lcd.setCursor(5, 0);
lcd.print("CAL=");
lcd.setCursor(13, 0);
lcd.print("ENF=");
lcd.setCursor(5, 1);
lcd.print("VAP=");
lcd.setCursor(13, 1);
lcd.setCursor(0, 0);
lcd.print("F=");
lcd.setCursor(0, 1);
lcd.print("D=");
lcd.setCursor(13, 1);
lcd.print("HEL=");
}
void loop () {
//if ( digitalRead ( btn_inicio ) == 0 ){
DateTime now = rtc.now();
//if ( digitalRead ( btn_inicio ) == 0 ){
if (millis() - tiempo > 1000) {
dia_inicio = now.day() + now.month() + now.year();
hora_inicio = now.hour() + now.minute() + now.second();
//delay(10);
tiempo = millis();
}
dia_actual = now.day() + now.month() + now.year();
hora_actual = now.hour() + now.minute() + now.second();
lcd.setCursor(11, 2);
lcd.print(" ");
lcd.print(now.hour(), DEC);
lcd.print(":");
lcd.print(now.minute(), DEC);
lcd.print(":");
lcd.print(now.second(), DEC);
lcd.setCursor(0, 2);
lcd.print(now.day(), DEC);
lcd.print("/");
lcd.print(now.month(), DEC);
lcd.print("/");
lcd.print(now.year(), DEC);
if (millis() - tiempoUltimaLectura > 2000)
{
hum = dht.readHumidity();
tem = dht.readTemperature();
lcd.setCursor(0, 3); //COLOCAR EN POSICION
lcd.print("T=" + String(tem, 1) + "C ");
lcd.setCursor(8, 3); //COLOCAR EN POSICION
lcd.print("H=" + String(hum, 1) + "% ");
tiempoUltimaLectura = millis();
}
int dias_transcurridos = dia_actual - dia_inicio;
temperatura_min = 21;
temperatura_max = 23;
humedad_min = 90;
humedad_max = 95;
if (dias_transcurridos >= 0) { //cantidad de dias que van pasando
lcd.setCursor(2, 1);
lcd.print(dias_transcurridos);
}
if (dias_transcurridos <= 2) { // fase 1
lcd.setCursor(2, 0);
lcd.print("1");
}
if (dias_transcurridos > 2) { // fase 2
lcd.setCursor(2, 0);
lcd.print("2");
}
//cantidad de días fase 2
if (dias_transcurridos > 2 && dias_transcurridos <= 15) {
temperatura_min = 17;
temperatura_max = 19;
humedad_min = 75;
humedad_max = 80;
}
if (tem < temperatura_min) {
calentador(&hilo2); //protothreads
//digitalWrite(calentar, HIGH);
lcd.setCursor(9, 0);
lcd.print("ON");
}
else {
lcd.setCursor(9, 0);
lcd.print("OFF");
digitalWrite(calentar, LOW);
}
if (tem > temperatura_max) {
enfriador(&hilo3);
//digitalWrite(enfriar, LOW);
lcd.setCursor(17, 0);
lcd.print("ON ");
}
else {
lcd.setCursor(17, 0);
lcd.print("OFF");
}
if (hum < humedad_min) {
vaporizador(&hilo1); //protothreads
//digitalWrite(vapor, HIGH);
lcd.setCursor(9, 1);
lcd.print("ON ");
}
else {
lcd.setCursor(9, 1);
lcd.print("OFF");
digitalWrite(vapor, LOW);
}
heladera(&hilo4);
}
//}
void vaporizador(struct pt *pt) { //protothreads
PT_BEGIN(pt); //protothreads
//void setup(){
static long t = 0; //protothreads
pinMode(vapor, OUTPUT); //protothreads
do { //protothreads
digitalWrite(vapor, HIGH); //protothreads
t = millis(); //protothreads
PT_WAIT_WHILE(pt, (millis() - t) < marchavapor); //protothreads
digitalWrite(vapor, LOW); //protothreads
t = millis(); //protothreads
PT_WAIT_UNTIL(pt, (millis() - t) >= paradavapor); //protothreads
} while (true); //protothreads
PT_END(pt); //protothreads
} //protothreads
void calentador(struct pt *pt) { //protothreads
PT_BEGIN(pt); //protothreads
//void setup(){
static long t = 0; //protothreads
pinMode(calentar, OUTPUT); //protothreads
do { //protothreads
digitalWrite(calentar, HIGH); //protothreads
t = millis(); //protothreads
PT_WAIT_WHILE(pt, (millis() - t) < marchacalentar); //protothreads
digitalWrite(calentar, LOW); //protothreads
t = millis(); //protothreads
PT_WAIT_UNTIL(pt, (millis() - t) >= paradacalentar); //protothreads
} while (true); //protothreads
PT_END(pt);
}
void enfriador(struct pt *pt) { //protothreads
PT_BEGIN(pt); //protothreads
//void setup(){
static long t = 0; //protothreads
pinMode(enfriar, OUTPUT); //protothreads
do { //protothreads
digitalWrite(enfriar, HIGH); //protothreads
t = millis(); //protothreads
PT_WAIT_WHILE(pt, (millis() - t) < marchaenfriar); //protothreads
digitalWrite(enfriar, LOW); //protothreads
t = millis(); //protothreads
PT_WAIT_UNTIL(pt, (millis() - t) >= paradaenfriar); //protothreads
} while (true); //protothreads
PT_END(pt); //protothreads
} //protothreads
void heladera(struct pt *pt) { //protothreads
PT_BEGIN(pt); //protothreads
//void setup(){
static long t = 0; //protothreads
pinMode(hela, OUTPUT); //protothreads
do { //protothreads
digitalWrite(hela, HIGH); //protothreads
t = millis(); //protothreads
PT_WAIT_WHILE(pt, (millis() - t) < marchahela); //protothreads
lcd.setCursor(17, 1);
lcd.print("OFF");
digitalWrite(hela, LOW); //protothreads
t = millis(); //protothreads
PT_WAIT_UNTIL(pt, (millis() - t) >= paradahela); //protothreads
lcd.setCursor(17, 1);
lcd.print("ON ");
} while (true); //protothreads
PT_END(pt); //protothreads
} //protothreads
