//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.1");
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.1f", 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(9, 1);
lcd.print(hob);
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);
}