Que envidia (sana) las cazáis al vuelo.
Menos mal que siempre estais ahi para desburrarnos.
He tenido que pelearme un poco con el spintf de la humedad para quitar en decimal que "baila" bastante, prefería mostrar en su lugar el símbolo de porcentaje y desconocía totalmente la librería.
Infinitas gracias por la atención y por vuestro tiempo.
Adjunto codigo completo por si le puede servir o ayudar a alguien y doy el tema por cerrado.
Gracias.
//Avicontrol V 2.1
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <LibPrintf.h>
//************************************//
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS3231 RTC;
Adafruit_BME280 bme;
bool bme_status;
//************Button*****************//
int P1 = 8; // Button SET MENU'
int P2 = 9; // Button +
int P3 = 10; // Button -
int P4 = 11; // Button exti
//************Variables**************//
int hora;
int minutos;
int anio;
int mes;
int day;
int menu = 0;
#define deshumi 2 //Rele deshumidificador pin 2
#define Led 6 // salida PWM mosfet pin 6
int inicio = 8;
int fin = 20;
int hob = 50; //Humedad objetivo en %
int his = 3; //Histeresis humedad
const int Ldr = A0; //Ldr a pin analogico 0
int VLdr;
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(2, 1);
lcd.print("AVICONTROL V 2.2");
lcd.setCursor(6, 2);
lcd.print("Iniciando");
delay(3000);
lcd.clear();
pinMode(deshumi, OUTPUT);
pinMode(P1, INPUT_PULLUP);
pinMode(P2, INPUT_PULLUP);
pinMode(P3, INPUT_PULLUP);
pinMode(P4, INPUT_PULLUP);
Serial.begin(9600);
Wire.begin();
RTC.begin();
bme_status = bme.begin(0x76);
if (!bme_status) {
Serial.println("Could not find a valid bme sensor, check wiring!");
}
//RTC.adjust(DateTime(__DATE__, __TIME__));
}
char _buffer[20];
void loop() {
VLdr = analogRead(Ldr);
int Humi = bme.readHumidity() * 10; // read humidity
int t = bme.readTemperature() * 10;
if (Humi > hob + his) {
digitalWrite(deshumi, LOW);
lcd.setCursor(18, 2);
lcd.print("ON");
}
else if (Humi < hob - his) {
digitalWrite(deshumi, HIGH);
lcd.setCursor(18, 2);
lcd.print("OF");
}
// check if you press the SET button and increase the menu index
if (digitalRead(P1) == LOW) {
menu = menu + 1;
}
if (digitalRead(P4) == LOW) {
StoreAgg();
delay(500);
menu = 0;
}
// in which subroutine should we go?
if (menu == 0) {
DisplayDateTime(); // void DisplayDateTime
}
if (menu == 1) {
DisplaySetHour();
}
if (menu == 2) {
DisplaySetMinute();
}
if (menu == 3) {
DisplaySetinicio();
}
if (menu == 4) {
DisplaySetfin();
}
if (menu == 5) {
DisplaySethob();
}
if (menu == 6) {
StoreAgg();
delay(500);
menu = 0;
}
if (hora > fin || hora < inicio) {
noche();
} else if (hora == fin) {
anochecer();
} else if (hora > inicio) {
dia();
} else if (hora == inicio)
amanecer();
}
void DisplayDateTime() {
DateTime now = RTC.now();
char buffer[20];
// lcd.setCursor(0, 2);
// lcd.print("Humedad:");
lcd.setCursor(0, 3);
lcd.print("Fase:");
lcd.setCursor(12, 2);
lcd.print("Dehum:");
lcd.setCursor(11, 3);
lcd.print("Leds:");
float Humi = bme.readHumidity(); // read humidity
float t = bme.readTemperature();
// t = -23.5;
sprintf(_buffer, "Temperatura:%02.1f%cC", t, char(223));
lcd.setCursor(0, 1);
lcd.print(_buffer);
// print humidity (in %)
sprintf(_buffer, "Humedad:%02.0f%%", Humi);
// lcd.setCursor(8, 2);
lcd.setCursor(0, 2);
lcd.print(_buffer);
hora = now.hour();
minutos = now.minute();
day = now.day();
mes = now.month();
anio = now.year();
delay(1000);
lcd.setCursor(0, 0);
sprintf(buffer, "%02d:%02d:%02d %02d/%02d/%2d", hora, minutos, now.second(), day, mes, anio);
lcd.print(buffer);
delay(1000);
}
void DisplaySetHour() {
// time setting
lcd.clear();
DateTime now = RTC.now();
if (digitalRead(P2) == LOW) {
if (hora == 23) {
hora = 0;
} else {
hora = hora + 1;
}
}
if (digitalRead(P3) == LOW) {
if (hora == 0) {
hora = 23;
} else {
hora = hora - 1;
}
}
lcd.setCursor(3, 0);
lcd.print("Ajustar hora:");
lcd.setCursor(9, 1);
//lcd.blink();
lcd.print(hora, DEC);
delay(200);
}
void DisplaySetMinute() {
// Setting the minutes
lcd.clear();
if (digitalRead(P2) == LOW) {
if (minutos == 59) {
minutos = 0;
} else {
minutos = minutos + 1;
}
}
if (digitalRead(P3) == LOW) {
if (minutos == 0) {
minutos = 59;
} else {
minutos = minutos - 1;
}
}
lcd.setCursor(2, 0);
lcd.print("Ajustar minutos:");
lcd.setCursor(9, 1);
lcd.print(minutos, DEC);
delay(200);
}
void DisplaySetinicio() {
// setting the year
lcd.clear();
if (digitalRead(P2) == LOW) {
inicio = inicio + 1;
}
if (digitalRead(P3) == LOW) {
inicio = inicio - 1;
}
lcd.setCursor(3, 0);
lcd.print("Hora Amanecer:");
lcd.setCursor(9, 1);
lcd.print(inicio);
delay(200);
}
void DisplaySetfin() {
lcd.clear();
if (digitalRead(P2) == LOW) {
if (fin == 23) {
fin = 0;
} else {
fin = fin + 1;
}
}
if (digitalRead(P3) == LOW) {
if (fin == 0) {
fin = 23;
} else {
fin = fin - 1;
}
}
lcd.setCursor(2, 0);
lcd.print("Hora Anochecer:");
lcd.setCursor(9, 1);
lcd.print(fin);
delay(200);
}
void DisplaySethob() {
lcd.clear();
if (digitalRead(P2) == LOW) {
hob = hob + 1;
}
if (digitalRead(P3) == LOW) {
hob = hob - 1;
}
lcd.setCursor(2, 0);
lcd.print("Humedad Objetivo:");
lcd.setCursor(8, 1);
lcd.print(hob);
lcd.setCursor(11, 1);
lcd.print("%");
delay(200);
}
void StoreAgg() {
lcd.clear();
lcd.setCursor(5, 1);
lcd.print("GUARDANDO");
RTC.adjust(DateTime(anio, mes, day, hora, minutos, 0));
delay(500);
}
void amanecer() {
int fade = map(minutos, 0, 59, 1, 255);
analogWrite(Led, fade);
lcd.setCursor(5, 3);
lcd.print("Alba ");
int leds = map(fade, 0, 255, 0, 100);
lcd.setCursor(16, 3);
lcd.print(leds);
lcd.println("\% ");
}
void dia() {
if (VLdr > 520) {
analogWrite(Led, 0);
lcd.setCursor(16, 3);
lcd.print("OF");
} else if (VLdr < 500) {
lcd.setCursor(16, 3);
lcd.print("100%");
analogWrite(Led, 255);
}
lcd.setCursor(5, 3);
lcd.print(" Dia ");
}
void anochecer() {
char buffer[5];
int fade = map(minutos, 0, 59, 255, 0);
analogWrite(Led, fade);
lcd.setCursor(5, 3);
lcd.print("Ocaso");
int leds = map(fade, 255, 0, 100, 0);
lcd.setCursor(16, 3);
sprintf(buffer,"%3d%%", leds);
lcd.print(buffer);
}
void noche() {
char buffer[5];
analogWrite(Led, 0);
lcd.setCursor(5, 3);
lcd.print("Noche");
lcd.setCursor(16, 3);
sprintf(buffer,"%3d%%", 0);
lcd.print(buffer);
}