Automatización pajarera

Antes que nada un saludo a toda la gente del foro que tanto y tantas veces nos ayudáis.
Después de muchos rompederos de cabeza he conseguido montar un código para controlar la iluminación y activar un deshumidificador cuando sea necesario.
Mi problema es que no consigo que los leds se activen (utilizo un modulo mosfét d4184 conectado al pin PWM nº 6) y no consigo ver porque.
Después de dos semanas de búsquedas y comeduras de coco me he decidido a consultarlo con la esperanza de que vean lo que yo no consigo ver.
De antemano gracias por su tiempo.





/*
 * Arduino controlador pajarera con control de luz ( via Mosfet de potencia), monitorizacion de
 * Temperatura y Humedad (DHT22) y Calendario/reloj(RTC DS3231) con visualización en monitor TFT (ILI9341 2,8")
 * ©ramoncho28
 */
#include "SPI.h"
#include <Adafruit_GFX.h>     // incluir Adafruit graphics Libreria
#include <Adafruit_ILI9341.h>  // incluir Adafruit ILI9341 TFT Libreria
#include "RTClib.h"           // incluir Adafruit RTC Libreria
#include <DHT.h>

#define TFT_RST 8  // TFT RST pin a arduino pin 8
#define TFT_CS 9   // TFT CS  pin a arduino pin 9
#define TFT_DC 10  // TFT DC  pin a arduino pin 10
// initialize ILI9341 TFT Libreria
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
#define DHTPIN A2      // DHT22 data pin conectado a Arduino  pin A2
#define DHTTYPE DHT22  // DHT22 sensor
DHT dht22(DHTPIN, DHTTYPE);
// initialize RTC Libreria
RTC_DS3231 rtc;
DateTime now;

// botons definition
#define boton1 3   // boton B1 conectado a Arduino pin 7
#define boton2 2   // boton B2 conectado a Arduino pin 6
#define deshumi 4  //Rele deshumidificador pin 4
int ledStart = 21;
int ledStop = 23;
int minutos, horas;
int Led = 6;         // salida PWM mosfet pin 6
const int Ldr = A0;  //Ldr a pin analogico 0
int VLdr;
const byte pinPowerDHT22 = 7;   //reset DHT 22 pin 7


 void setup(void) {
  Serial.begin(9600);
  pinMode(boton1, INPUT_PULLUP);
  pinMode(boton2, INPUT_PULLUP);
  pinMode(Led, OUTPUT);
  pinMode(deshumi, OUTPUT);
  dht22.begin();
  digitalWrite(pinPowerDHT22, HIGH);
  rtc.begin();  // inicializar RTC chip

  tft.begin(); 
  tft.fillScreen(ILI9341_BLACK);                         // llenar pantalla color negro
  tft.drawFastHLine(0, 64, tft.width(), ILI9341_BLUE);   // pintar linea horizontal azul en posicion (0, 44)
  tft.drawFastHLine(0, 102, tft.width(), ILI9341_BLUE);  // pintar linea horizontal azul en posicion (0, 102)

  tft.setTextWrap(false);                        // desactivar ajuste de texto
  tft.setTextColor(ILI9341_GREEN, ILI9341_BLACK);  //  color texto verde y fondo negro
  tft.setTextSize(3);                            // texto tamaño = 3
  tft.setCursor(15, 80);                         // mover cursor texto posicion (15, 27) pixel
  tft.print("TEMPERATURA:");
  tft.setTextColor(ILI9341_YELLOW, ILI9341_BLACK);  //  color texto amarillo y fondo negro
  tft.setCursor(43, 80);                         // mover cursor texto posicion (15, 27) pixel
  tft.print("HUMEDAD:");
}

// funcion corta boton1 (B1) debounce
bool debounce() {
  byte count = 0;
  for (byte i = 0; i < 5; i++) {
    if (!digitalRead(boton1))
      count++;
    delay(10);
  }

  if (count > 2) return 1;
  else return 0;
}

void RTC_display() {
  char _buffer[11];
  char dow_matrix[7][10] = { "Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado" };
  byte x_pos[7] = { 29, 29, 23, 11, 17, 29, 17 };
  static byte previous_dow = 8;

  // print day of the week
  if (previous_dow != now.dayOfTheWeek()) {
    previous_dow = now.dayOfTheWeek();
    tft.fillRect(11, 55, 108, 14, ILI9341_BLACK);  
    tft.setCursor(x_pos[previous_dow], 55);
    tft.setTextColor(ILI9341_CYAN, ILI9341_BLACK);  //  color texto cyan y fondo negro
    tft.print(dow_matrix[now.dayOfTheWeek()]);
  }

  // print date
  sprintf(_buffer, "%02u-%02u-%04u", now.day(), now.month(), now.year());
  tft.setCursor(4, 79);
  tft.setTextColor(ILI9341_YELLOW, ILI9341_BLACK);  //  color texto amarillo y fondo negro
  tft.print(_buffer);
  // print time
  sprintf(_buffer, "%02u:%02u:%02u", now.hour(), now.minute(), now.second());
  tft.setCursor(16, 136);
  tft.setTextColor(ILI9341_GREEN, ILI9341_BLACK);  //  color texto verde y fondo negro
  tft.print(_buffer);
}

byte edit(byte parameter) {
  static byte i = 0, y_pos,
              x_pos[5] = { 4, 40, 100, 16, 52 };
  char text[3];
  sprintf(text, "%02u", parameter);

  if (i < 3) {
    tft.setTextColor(ILI9341_YELLOW, ILI9341_BLACK);  //  color texto amarillo y fondo negro
    y_pos = 79;
  } else {
    tft.setTextColor(ILI9341_GREEN, ILI9341_BLACK);  //  color  texto erde y fondo negro
    y_pos = 136;
  }

  while (debounce()); 

  while (true) {
    while (!digitalRead(boton2)) { 
      parameter++;
      if (i == 0 && parameter > 31) 
        parameter = 1;
      if (i == 1 && parameter > 12)  
        parameter = 1;
      if (i == 2 && parameter > 99)  
        parameter = 0;
      if (i == 3 && parameter > 23)  
        parameter = 0;
      if (i == 4 && parameter > 59)  
        parameter = 0;

      sprintf(text, "%02u", parameter);
      tft.setCursor(x_pos[i], y_pos);
      tft.print(text);
      delay(200);  // wait 200ms
    }

    tft.fillRect(x_pos[i], y_pos, 22, 14, ILI9341_BLACK);
    unsigned long previous_m = millis();
    while ((millis() - previous_m < 250) && digitalRead(boton1) && digitalRead(boton2))
      ;
    tft.setCursor(x_pos[i], y_pos);
    tft.print(text);
    previous_m = millis();
    while ((millis() - previous_m < 250) && digitalRead(boton1) && digitalRead(boton2))
      ;

    if (!digitalRead(boton1)) { 
      i = (i + 1) % 5;           
      return parameter;         
    }
  }
}
char _buffer[7];

void loop() {
 
  VLdr = analogRead(Ldr);
  int Humi = dht22.readHumidity() * 10;
  int Temp = dht22.readTemperature() * 10;
  if (isnan(Humi) || isnan(Temp)) {
    digitalWrite(pinPowerDHT22, LOW);
    delay(100);  // demosle unos instantes para que todo se estabilice.
    digitalWrite(pinPowerDHT22, HIGH);
  }
  tft.setTextColor(ILI9341_RED, ILI9341_BLACK);  //  color texto rojo y fondo negro
  if (Temp < 0)                                
    sprintf(_buffer, "-%02u.%1u", (abs(Temp) / 10) % 100, abs(Temp) % 10);
  else  // temperature >= 0
    sprintf(_buffer, " %02u.%1u", (Temp / 10) % 100, Temp % 10);
  tft.setCursor(26, 71);
  tft.print(_buffer);
  tft.drawCircle(161, 77, 4, ILI9341_RED);  // print degree symbol ( ° )
  tft.drawCircle(161, 77, 5, ILI9341_RED);
  tft.setCursor(170, 71);
  tft.print("C");

  // print humidity (in %)
  tft.setTextColor(ILI9341_CYAN, ILI9341_BLACK);  //  color texto cyan y fondo negro
  sprintf(_buffer, "%02u.%1u %%", (Humi / 10) % 100, Humi % 10);
  tft.setCursor(50, 171);
  tft.print(_buffer);


  if (!digitalRead(boton1))  
    if (debounce())         
    {
      while (debounce());  

      byte day = edit(now.day());           
      byte month = edit(now.month());       
      byte year = edit(now.year() - 2000);  
      byte hour = edit(now.hour());         
      byte minute = edit(now.minute());     

     
      rtc.adjust(DateTime(2000 + year, month, day, hour, minute, 0));

      while (debounce());  
    }

  now = rtc.now();  

  RTC_display();  


  if (Humi > 60) {
    digitalWrite(deshumi, HIGH);
  }

  else if (Humi < 45) {
    digitalWrite(deshumi, LOW);
  }

  if (horas == ledStart) {
    if (minutos >= 0 && minutos <= 59) {
      LedStart();
    }

    if (VLdr > 550 && horas > ledStart && horas < ledStop - 1) {
      digitalWrite(Led, HIGH);
    }

    if (((VLdr < 450) && horas < ledStart) || horas > ledStop) {
      digitalWrite(Led, LOW);
    }

    if (horas == ledStop - 1) {
      if (minutos >= 0 && minutos <= 59) {
        LedStop();
      }
    }
  }
  delay(100);  
}
void LedStart() {
  int fade = map(minutos, 0, 59, 1, 255);
  analogWrite(Led, fade);
}

void LedStop() {
  int fade = map(minutos, 0, 59, 255, 0);
  analogWrite(Led, fade);
}
// Fin

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

Gracias y perdón por las molestias.

Ayudaría que subas el esquema de conexiones (puedes hacerlo a mano y subir una foto)

Agrego:

horas y minutos siempre contienen 0, nunca cambias su valor inicial.

Independientemente de eso

if (minutos >= 0 && minutos <= 59) {

¿puede minutos tener un valor que no esté en el rango 0 - 59?

1 Like

Problema #1:

Estas variables siempre valen cero, como ya comentó @MaximoEsfuerzo


Problema #2:

Cuando estas instrucciones se ejecutan, "horas" siempre es igual a ledStart, de modo que los if nunca se cumplen. ¿Puedes ver por qué? (tip: la respuesta está en tu programa original, no aquí)


Problema #3:

Una vez corregido el problema #2, verás que los términos segundo y tercero de la expresión lógica de este if nunca se van a cumplir, así que el if no se ejecuta. ¿Puedes ver por qué?


Problema #4:
En su forma actual, el led debería encenderse de las 21:00 a las 21:59 y quedarse prendido por hasta el día siguiente a las 21:00. Si el led no enciende debes tener un problema de hardware. Para poder ayudarte necesitamos ver tu diagrama de conexiones (ya @MaximoEsfuerzo te lo pidió), sobre todo la parte que corresponde a lo que tienes conectado al pin 6.

1 Like

Gracias por contestar y perdón por tardar yo en hacerlo, pero en estas fechas el curro no da tregua .


Adjunto el esquema (espero que lo haya hecho correctamente) y he probado el modulo Mosfet con el Ejemplo ¨fade¨ del IDE y funciona correctamente.

Sobre esto veo que efectivamente esta línea no tiene demasiado sentido , creo que toca eliminar.
mancera1979
Accidentalmente (cuando buscas no encuentras) he topado con un post en el foro sobre la iluminación para un acuario https://forum.arduino.cc/t/efecto-dia-y-noche-en-acuario/625033/20
y a partir de esto voy a intentar durante el fin de semana buscarle los pies al gato.
Gracias por dedicarnos un trocito de vuestras vidas

He cambiado el DHT22 a un pin digital ya que parece que falla menos y sobre el esquema el pin GROUND de DHT no enlaza con el PWM del D4184, solo se me quedo ahí la línea :grimacing:

has visto con el Serial.print los valores que muestra para la hora, minuto y segundos.
Yo he corrido una simulación y no da valores coherentes.
En la pantalla los lees bien? Si es asi, entonces es un error en mi simulador.

1 Like

Si, en la pantalla tanto el reloj como los datos del DHT.
Este fin de semana he intentado hacer unas ¿mejoras? basándome en la publicación que indico en el post #6 (quizás te suene) y al menos a falta de mas pruebas para comprobar que haga bien el ciclo, al menos he conseguido que los Leds se enciendan.
Adjunto el nuevo código:
paxaros_v4.0.ino (10,1 KB)
Si alguien puede darme su opinión, será bienvenida.

Moderador
Sube los archivos de código con etiquetas, no generes la necesidad que un moderador (yo en este caso) tenga que revisar si eso que has puesto es o no un .ino.
Te vas a sorprender pero se usan un enlace para muchas cosas.
De hecho reviso todo, y aunque algo diga .ino puede ser otra cosa escondida.
Entonces, en otro post, sube el código usando etiquetas como lo dice el punto 7 de las normas.

2 Likes
[pajarera_v4.0.ino|attachment](upload://zpO0S0QVOFCaIaOFb7GvDO38yj8.ino) (8,1 KB)

``` Perdón pero estos días estoy de un torpe que no es ni medio normal.

Pues nada se ve que el turno de noche no ayuda.





/*
 * Arduino controlador pajarera con control de luz ( via Mosfet de potencia), monitorizacion de
 * Temperatura y Humedad (DHT22) y Calendario/reloj(RTC DS3231) con visualización en monitor TFT (ILI9341 2,8")
 * ©ramoncho28
 */
#include "SPI.h"
#include <Adafruit_GFX.h>     // incluir Adafruit graphics Libreria
#include <Adafruit_ILI9341.h>  // incluir Adafruit ILI9341 TFT Libreria
#include "RTClib.h"           // incluir Adafruit RTC Libreria
#include <DHT.h>

#define TFT_RST 8  // TFT RST pin a arduino pin 8
#define TFT_CS 9   // TFT CS  pin a arduino pin 9
#define TFT_DC 10  // TFT DC  pin a arduino pin 10
// initialize ILI9341 TFT Libreria
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
#define DHTPIN A2      // DHT22 data pin conectado a Arduino  pin A2
#define DHTTYPE DHT22  // DHT22 sensor
DHT dht22(DHTPIN, DHTTYPE);
// initializar Libreria RTC
RTC_DS3231 rtc;
DateTime now;


#define boton1 3   // boton B1 conectado a Arduino pin 7
#define boton2 2   // boton B2 conectado a Arduino pin 6
#define deshumi 4  //Rele deshumidificador pin 4
#define  STEP_AMANECER 14000
#define  STEP_ANOCHECER 14000
#define Led  6  // salida PWM mosfet pin 6
bool evento_amanecer = true;  // variable de control para inicio de evento con valor true
bool evento_dia = true;  // variable de control para inicio de evento con valor true
bool evento_luz = true;  // variable de control para inicio de evento con valor true
bool evento_anochecer = true;   // variable de control para inicio de evento con valor true
bool evento_noche = true;   // variable de control para finalizacion de evento con valor true
int BRILLO;       // variable para almacenar valores PWM
unsigned long tbrillo;
const int Ldr = A0;  //Ldr a pin analogico 0
int VLdr;
const byte pinPowerDHT22 = 7;   //reset DHT 22 pin 7
int minuto;

 void setup(void) {
  Serial.begin(9600);
  pinMode(boton1, INPUT_PULLUP);
  pinMode(boton2, INPUT_PULLUP);
  pinMode(Led, OUTPUT);
  pinMode(deshumi, OUTPUT);
  dht22.begin();
  digitalWrite(pinPowerDHT22, HIGH);
  rtc.begin();  // inicializar RTC chip

  tft.begin(); 
  tft.fillScreen(ILI9341_BLACK);                         // llenar pantalla color negro
  tft.drawFastHLine(0, 64, tft.width(), ILI9341_BLUE);   // pintar linea horizontal azul en posicion (0, 44)
  tft.drawFastHLine(0, 102, tft.width(), ILI9341_BLUE);  // pintar linea horizontal azul en posicion (0, 102)

  tft.setTextWrap(false);                        // desactivar ajuste de texto
  tft.setTextColor(ILI9341_GREEN, ILI9341_BLACK);  //  color texto verde y fondo negro
  tft.setTextSize(3);                            // texto tamaño = 3
  tft.setCursor(15, 80);                         // mover cursor texto posicion (15, 27) pixel
  tft.print("TEMPERATURA:");
  tft.setTextColor(ILI9341_YELLOW, ILI9341_BLACK);  //  color texto amarillo y fondo negro
  tft.setCursor(43, 80);                         // mover cursor texto posicion (15, 27) pixel
  tft.print("HUMEDAD:");
}

// funcion corta boton1 (B1) debounce
bool debounce() {
  byte count = 0;
  for (byte i = 0; i < 5; i++) {
    if (!digitalRead(boton1))
      count++;
    delay(10);
  }

  if (count > 2) return 1;
  else return 0;
}

void RTC_display() {
  char _buffer[11];
  char dow_matrix[7][10] = { "Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado" };
  byte x_pos[7] = { 29, 29, 23, 11, 17, 29, 17 };
  static byte previous_dow = 8;

  // print day of the week
  if (previous_dow != now.dayOfTheWeek()) {
    previous_dow = now.dayOfTheWeek();
    tft.fillRect(11, 55, 108, 14, ILI9341_BLACK);  
    tft.setCursor(x_pos[previous_dow], 55);
    tft.setTextColor(ILI9341_CYAN, ILI9341_BLACK);  //  color texto cyan y fondo negro
    tft.print(dow_matrix[now.dayOfTheWeek()]);
  }

  // print date
  sprintf(_buffer, "%02u-%02u-%04u", now.day(), now.month(), now.year());
  tft.setCursor(4, 79);
  tft.setTextColor(ILI9341_YELLOW, ILI9341_BLACK);  //  color texto amarillo y fondo negro
  tft.print(_buffer);
  // print time
  sprintf(_buffer, "%02u:%02u:%02u", now.hour(), now.minute(), now.second());
  tft.setCursor(16, 136);
  tft.setTextColor(ILI9341_GREEN, ILI9341_BLACK);  //  color texto verde y fondo negro
  tft.print(_buffer);
}

byte edit(byte parameter) {
  static byte i = 0, y_pos,
              x_pos[5] = { 4, 40, 100, 16, 52 };
  char text[3];
  sprintf(text, "%02u", parameter);

  if (i < 3) {
    tft.setTextColor(ILI9341_YELLOW, ILI9341_BLACK);  //  color texto amarillo y fondo negro
    y_pos = 79;
  } else {
    tft.setTextColor(ILI9341_GREEN, ILI9341_BLACK);  //  color  texto erde y fondo negro
    y_pos = 136;
  }

  while (debounce()); 

  while (true) {
    while (!digitalRead(boton2)) { 
      parameter++;
      if (i == 0 && parameter > 31) 
        parameter = 1;
      if (i == 1 && parameter > 12)  
        parameter = 1;
      if (i == 2 && parameter > 99)  
        parameter = 0;
      if (i == 3 && parameter > 23)  
        parameter = 0;
      if (i == 4 && parameter > 59)  
        parameter = 0;

      sprintf(text, "%02u", parameter);
      tft.setCursor(x_pos[i], y_pos);
      tft.print(text);
      delay(200);  // wait 200ms
    }

    tft.fillRect(x_pos[i], y_pos, 22, 14, ILI9341_BLACK);
    unsigned long previous_m = millis();
    while ((millis() - previous_m < 250) && digitalRead(boton1) && digitalRead(boton2))
      ;
    tft.setCursor(x_pos[i], y_pos);
    tft.print(text);
    previous_m = millis();
    while ((millis() - previous_m < 250) && digitalRead(boton1) && digitalRead(boton2))
      ;

    if (!digitalRead(boton1)) { 
      i = (i + 1) % 5;           
      return parameter;         
    }
  }
}
char _buffer[7];

void loop() {
 DateTime fecha = rtc.now();        // funcion que devuelve fecha y horario en formato
int hora = fecha.hour();
int minuto = fecha.minute();
  VLdr = analogRead(Ldr);
  int Humi = dht22.readHumidity() * 10;
  int Temp = dht22.readTemperature() * 10;
  if (isnan(Humi) || isnan(Temp)) {
    digitalWrite(pinPowerDHT22, LOW);
    delay(100);  // demosle unos instantes para que todo se estabilice.
    digitalWrite(pinPowerDHT22, HIGH);
  }
  tft.setTextColor(ILI9341_RED, ILI9341_BLACK);  //  color texto rojo y fondo negro
  if (Temp < 0)                                
    sprintf(_buffer, "-%02u.%1u", (abs(Temp) / 10) % 100, abs(Temp) % 10);
  else  // temperature >= 0
    sprintf(_buffer, " %02u.%1u", (Temp / 10) % 100, Temp % 10);
  tft.setCursor(26, 71);
  tft.print(_buffer);
  tft.drawCircle(161, 77, 4, ILI9341_RED);  // print degree symbol ( ° )
  tft.drawCircle(161, 77, 5, ILI9341_RED);
  tft.setCursor(170, 71);
  tft.print("C");

  // print humidity (in %)
  tft.setTextColor(ILI9341_CYAN, ILI9341_BLACK);  //  color texto cyan y fondo negro
  sprintf(_buffer, "%02u.%1u %%", (Humi / 10) % 100, Humi % 10);
  tft.setCursor(50, 171);
  tft.print(_buffer);


  if (!digitalRead(boton1))  
    if (debounce())         
    {
      while (debounce());  

      byte day = edit(now.day());           
      byte month = edit(now.month());       
      byte year = edit(now.year() - 2000);  
      byte hour = edit(now.hour());         
      byte minute = edit(now.minute());     

     
      rtc.adjust(DateTime(2000 + year, month, day, hour, minute, 0));

      while (debounce());  
    }

  now = rtc.now();  

  RTC_display();  


  if (Humi > 60) {
    digitalWrite(deshumi, HIGH);
  }

  else if (Humi < 45) {
    digitalWrite(deshumi, LOW);
  }

if ( hora == 7 && minuto >= 0 ) { // si hora = __ y minutos = __
evento_amanecer = true;
}
if (evento_amanecer)
amanecer();
evento_noche = false;
 evento_dia = false;   
evento_anochecer = false;


if ( hora >= 8 && minuto >= 00 ) { // si hora = __ y minutos = __
evento_dia = true;
}
if (evento_dia)
dia();
evento_amanecer = false;
evento_anochecer = false;
evento_noche = false;


if ( hora == 21 && minuto >= 00 ) { // si hora = __ y minutos = __
evento_anochecer = true;
}
if (evento_anochecer)
anochecer();
evento_dia = false;
evento_noche = false;
evento_amanecer = false;

if ( hora >= 22 && minuto >= 00 ) { // si hora = __ y minutos = __
evento_noche = true;
}
if (evento_noche)
noche();
evento_anochecer = false;
evento_amanecer = false;
evento_dia = false;


}
void amanecer() {
  int fade = map(minuto, 0, 59, 1, 255);
  analogWrite(Led, fade);
}

void dia() {
 
  analogWrite(Led, 255);
}

void anochecer() {
  int fade = map(minuto, 0, 59, 255, 0);
  analogWrite(Led, fade);
}

  void noche() {
 
  analogWrite(Led, 0);
}
// Fin

He quitado unas partes que tenia puestas para hacer pruebas y me ha quedado de esta manera:





/*
 * Arduino controlador pajarera con control de luz ( via Mosfet de potencia), monitorizacion de
 * Temperatura y Humedad (DHT22) y Calendario/reloj(RTC DS3231) con visualización en monitor TFT (ILI9341 2,8")
 * ©ramoncho28
 */
#include "SPI.h"
#include <Adafruit_GFX.h>     // incluir Adafruit graphics Libreria
#include <Adafruit_ILI9341.h>  // incluir Adafruit ILI9341 TFT Libreria
#include "RTClib.h"           // incluir Adafruit RTC Libreria
#include <DHT.h>

#define TFT_RST 8  // TFT RST pin a arduino pin 8
#define TFT_CS 9   // TFT CS  pin a arduino pin 9
#define TFT_DC 10  // TFT DC  pin a arduino pin 10
// initialize ILI9341 TFT Libreria
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
#define DHTPIN A2      // DHT22 data pin conectado a Arduino  pin A2
#define DHTTYPE DHT22  // DHT22 sensor
DHT dht22(DHTPIN, DHTTYPE);
// initializar Libreria RTC
RTC_DS3231 rtc;
DateTime now;


#define boton1 3   // boton B1 conectado a Arduino pin 7
#define boton2 2   // boton B2 conectado a Arduino pin 6
#define deshumi 4  //Rele deshumidificador pin 4
#define  STEP_AMANECER 14000
#define  STEP_ANOCHECER 14000
#define Led  6  // salida PWM mosfet pin 6
bool evento_amanecer = true;  // variable de control para inicio de evento con valor true
bool evento_dia = true;  // variable de control para inicio de evento con valor true
bool evento_anochecer = true;   // variable de control para inicio de evento con valor true
bool evento_noche = true;   // variable de control para finalizacion de evento con valor true
const int Ldr = A0;  //Ldr a pin analogico 0
int VLdr;
const byte pinPowerDHT22 = 7;   //reset DHT 22 pin 7
int minuto;

 void setup(void) {
  Serial.begin(9600);
  pinMode(boton1, INPUT_PULLUP);
  pinMode(boton2, INPUT_PULLUP);
  pinMode(Led, OUTPUT);
  pinMode(deshumi, OUTPUT);
  dht22.begin();
  digitalWrite(pinPowerDHT22, HIGH);
  rtc.begin();  // inicializar RTC chip

  tft.begin(); 
  tft.fillScreen(ILI9341_BLACK);                         // llenar pantalla color negro
  tft.drawFastHLine(0, 64, tft.width(), ILI9341_BLUE);   // pintar linea horizontal azul en posicion (0, 44)
  tft.drawFastHLine(0, 102, tft.width(), ILI9341_BLUE);  // pintar linea horizontal azul en posicion (0, 102)

  tft.setTextWrap(false);                        // desactivar ajuste de texto
  tft.setTextColor(ILI9341_GREEN, ILI9341_BLACK);  //  color texto verde y fondo negro
  tft.setTextSize(3);                            // texto tamaño = 3
  tft.setCursor(15, 80);                         // mover cursor texto posicion (15, 27) pixel
  tft.print("TEMPERATURA:");
  tft.setTextColor(ILI9341_YELLOW, ILI9341_BLACK);  //  color texto amarillo y fondo negro
  tft.setCursor(43, 80);                         // mover cursor texto posicion (15, 27) pixel
  tft.print("HUMEDAD:");
}

// funcion corta boton1 (B1) debounce
bool debounce() {
  byte count = 0;
  for (byte i = 0; i < 5; i++) {
    if (!digitalRead(boton1))
      count++;
    delay(10);
  }

  if (count > 2) return 1;
  else return 0;
}

void RTC_display() {
  char _buffer[11];
  char dow_matrix[7][10] = { "Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado" };
  byte x_pos[7] = { 29, 29, 23, 11, 17, 29, 17 };
  static byte previous_dow = 8;

  // print day of the week
  if (previous_dow != now.dayOfTheWeek()) {
    previous_dow = now.dayOfTheWeek();
    tft.fillRect(11, 55, 108, 14, ILI9341_BLACK);  
    tft.setCursor(x_pos[previous_dow], 55);
    tft.setTextColor(ILI9341_CYAN, ILI9341_BLACK);  //  color texto cyan y fondo negro
    tft.print(dow_matrix[now.dayOfTheWeek()]);
    Serial.print(dow_matrix[now.dayOfTheWeek()]);
  }

  // print date
  sprintf(_buffer, "%02u-%02u-%04u", now.day(), now.month(), now.year());
  tft.setCursor(4, 79);
  tft.setTextColor(ILI9341_YELLOW, ILI9341_BLACK);  //  color texto amarillo y fondo negro
  tft.print(_buffer);
  // print time
  sprintf(_buffer, "%02u:%02u:%02u", now.hour(), now.minute(), now.second());
  tft.setCursor(16, 136);
  tft.setTextColor(ILI9341_GREEN, ILI9341_BLACK);  //  color texto verde y fondo negro
  tft.print(_buffer);
  Serial.print(_buffer);
}

byte edit(byte parameter) {
  static byte i = 0, y_pos,
              x_pos[5] = { 4, 40, 100, 16, 52 };
  char text[3];
  sprintf(text, "%02u", parameter);

  if (i < 3) {
    tft.setTextColor(ILI9341_YELLOW, ILI9341_BLACK);  //  color texto amarillo y fondo negro
    y_pos = 79;
  } else {
    tft.setTextColor(ILI9341_GREEN, ILI9341_BLACK);  //  color  texto erde y fondo negro
    y_pos = 136;
  }

  while (debounce()); 

  while (true) {
    while (!digitalRead(boton2)) { 
      parameter++;
      if (i == 0 && parameter > 31) 
        parameter = 1;
      if (i == 1 && parameter > 12)  
        parameter = 1;
      if (i == 2 && parameter > 99)  
        parameter = 0;
      if (i == 3 && parameter > 23)  
        parameter = 0;
      if (i == 4 && parameter > 59)  
        parameter = 0;

      sprintf(text, "%02u", parameter);
      tft.setCursor(x_pos[i], y_pos);
      tft.print(text);
      delay(200);  // wait 200ms
    }

    tft.fillRect(x_pos[i], y_pos, 22, 14, ILI9341_BLACK);
    unsigned long previous_m = millis();
    while ((millis() - previous_m < 250) && digitalRead(boton1) && digitalRead(boton2))
      ;
    tft.setCursor(x_pos[i], y_pos);
    tft.print(text);
    previous_m = millis();
    while ((millis() - previous_m < 250) && digitalRead(boton1) && digitalRead(boton2))
      ;

    if (!digitalRead(boton1)) { 
      i = (i + 1) % 5;           
      return parameter;         
    }
  }
}
char _buffer[7];

void loop() {
 DateTime fecha = rtc.now();        // funcion que devuelve fecha y horario en formato
int hora = fecha.hour();
int minuto = fecha.minute();
  VLdr = analogRead(Ldr);
  int Humi = dht22.readHumidity() * 10;
  int Temp = dht22.readTemperature() * 10;
  if (isnan(Humi) || isnan(Temp)) {
    digitalWrite(pinPowerDHT22, LOW);
    delay(100);  // demosle unos instantes para que todo se estabilice.
    digitalWrite(pinPowerDHT22, HIGH);
  }
  tft.setTextColor(ILI9341_RED, ILI9341_BLACK);  //  color texto rojo y fondo negro
  if (Temp < 0)                                
    sprintf(_buffer, "-%02u.%1u", (abs(Temp) / 10) % 100, abs(Temp) % 10);
  else  // temperature >= 0
    sprintf(_buffer, " %02u.%1u", (Temp / 10) % 100, Temp % 10);
  tft.setCursor(26, 71);
  tft.print(_buffer);
  tft.drawCircle(161, 77, 4, ILI9341_RED);  // print degree symbol ( ° )
  tft.drawCircle(161, 77, 5, ILI9341_RED);
  tft.setCursor(170, 71);
  tft.print("C");

  // print humidity (in %)
  tft.setTextColor(ILI9341_CYAN, ILI9341_BLACK);  //  color texto cyan y fondo negro
  sprintf(_buffer, "%02u.%1u %%", (Humi / 10) % 100, Humi % 10);
  tft.setCursor(50, 171);
  tft.print(_buffer);


  if (!digitalRead(boton1))  
    if (debounce())         
    {
      while (debounce());  

      byte day = edit(now.day());           
      byte month = edit(now.month());       
      byte year = edit(now.year() - 2000);  
      byte hour = edit(now.hour());         
      byte minute = edit(now.minute());     

     
      rtc.adjust(DateTime(2000 + year, month, day, hour, minute, 0));

      while (debounce());  
    }

  now = rtc.now();  

  RTC_display();  


  if (Humi > 60) {
    digitalWrite(deshumi, HIGH);
  }

  else if (Humi < 45) {
    digitalWrite(deshumi, LOW);
  }

if ( hora == 7 && minuto >= 0 ) { // si hora = __ y minutos = __
evento_amanecer = true;
}
if (evento_amanecer)
amanecer();
if (evento_amanecer = true){ 
evento_noche = false;
 evento_dia = false;   
evento_anochecer = false;
}

if ( hora >= 8 && minuto >= 00 ) { // si hora = __ y minutos = __
evento_dia = true;
}
if (evento_dia)
dia();
if (evento_dia = true) {
evento_amanecer = false;
evento_anochecer = false;
evento_noche = false;
}

if ( hora == 21 && minuto >= 00 ) { // si hora = __ y minutos = __
evento_anochecer = true;
}
if (evento_anochecer)
anochecer(); 
if (evento_anochecer = true ) { 
evento_dia = false;
evento_noche = false;
evento_amanecer = false;
}

if ( hora >= 22 && minuto >= 00 ) { // si hora = __ y minutos = __
evento_noche = true;
}
if (evento_noche)
noche();
if (evento_noche = true ) {
evento_anochecer = false;
evento_amanecer = false;
evento_dia = false;
}

}
void amanecer() {
  int fade = map(minuto, 0, 59, 1, 255);
  analogWrite(Led, fade);
}

void dia() {
 
  analogWrite(Led, 255);
}

void anochecer() {
  int fade = map(minuto, 0, 59, 255, 0);
  analogWrite(Led, fade);
}

  void noche() {
 
  analogWrite(Led, 0);
}
// Fin

Lo he activado por la tarde y como era de esperar los leds se han encendido a la máxima potencia pero cuando ha llegado la hora de "anochecer" han estado toda la hora a máxima intensidad y al llegar a "noche" se han quedado parpadeando a media intensidad.
¿ Alguna idea?

Acá hay un problema

int minuto = fecha.minute();

es una variable local dentro de loop() y no es la misma que

int minuto;

que es global y es la que usan amanecer() y anochecer()

En loop(), para referir a la global debería ser

minuto = fecha.minute();

Agrego:

Otro error

if (evento_noche = true ) {

debería ser

if (evento_noche == true ) {

o simplemente

if (evento_noche) {

¿Es mucho trabajo usar la opción Autoformato o Formatear Documento antes de copiar?

Enfatizo este comentario de @MaximoEsfuerzo
Por favor, usen el autoformato.

Y las luces parpadean porque están mal planteados los condicionales.

if ( hora >= 8 && minuto >= 00 ) {

"choca" con

if ( hora == 21 && minuto >= 00 ) {

a partir de las 21Hs y con

if ( hora >= 22 && minuto >= 00 ) {

a partir de las 22Hs porque, obviamente, 8 es menor que 21 y 22.
Entonces a partir de las 8:00:00 y hasta las 23:59:59 se ejecuta dia() continuamente, como resultado: parpadeo.

Deberías usar else if() que es muy útil en estos casos y verificar los condicionales de mayor a menor para que no haya "colisiones".

[quote="ramoncho8, post:20, topic:1199423"]
Gracias por las respuestas y perdón por las meteduras de pata, mis conocimientos (así como mis neuronas) son bastante limitados.
¿Te refieres a algo así?

if (hora == 7 && minuto >= 0) {  // si hora = __ y minutos = __
    evento_amanecer = true;
  }
  if (evento_amanecer)
    amanecer();
  if (evento_amanecer) {
    evento_noche = false;
    evento_dia = false;
    evento_anochecer = false;
  }

  if (hora >= 8 && minuto >= 00) {  // si hora = __ y minutos = __
    evento_dia = true;
  }
  if (evento_dia)
    dia();
  if (evento_dia) {
    evento_amanecer = false;
    evento_anochecer = false;
    evento_noche = false;
  }

  else if (hora == 21 && minuto >= 00) {  // si hora = __ y minutos = __
    evento_anochecer = true;
  }
  if (evento_anochecer)
    anochecer();
  if (evento_anochecer) {
    evento_dia = false;
    evento_noche = false;
    evento_amanecer = false;
  }

  else if (hora >= 22 && hora <= 7) {  // si hora = __ y minutos = __
    evento_noche = true;
  }
  if (evento_noche)
    noche();
  if (evento_noche) {
    evento_anochecer = false;
    evento_amanecer = false;
    evento_dia = false;
  }

Aquí conviene que hagas una descripción verbal de lo que quieres que tu sistema haga dependiendo de la hora del día. Esto es un paso hacia lograr tu objetivo.

Y muy importante: para que el código sea más fácil de leer, utiliza con frecuencia el comando Herramientas>Auto Formato en el IDE de Arduino


En este momento solamente quiero comentarte que esto

puede simplificarse así:

if (hora == 7 ) { 
    amanecer();
  }
  1. "minuto>=0" es redundante, ya que minuto nunca va a ser negativo
  2. Al menos en esta versión del código, las variables lógicas que has declarado no se utilizan

No.

Me refiero a algo como

if (hora >= 22) {
 noche();
}
else if (hora == 21) {
  anochecer();
}
else if (hora >= 8) {
  dia();
}
else if (hora == 7)
  amanecer();
}

y olvídate de las variables evento_xxx que ahora son innecesarias

Y buena acotación de @mancera1979 , los minutos no se necesitan en los condicionales (en este caso).

Agrego:

Tal como hice las comparaciones, te preguntarás ¿Qué pasa entre las 0:00:00 y las 6:59:59 ya que esos horarios no están comprendidos en ningún condicional?
Pues nada, lo último que se ejecuta a las 23:59:59 es noche() que mantiene apagados los LED y así quedan (apagados) hasta las 7:00:00

Esta es la versión simple:

El programa debe encender gradualmente las luces a las 7am y dejarlas encendidas el resto del día hasta las 9pm, en que debe disminuirlas gradualmente hasta dejarlas apagadas el resto de la noche.

if (hora == 7) {
  amanecer(); // empieza apagando la luz (minuto 00), termina con la luz al máximo (minuto 59)
}
else if (hora == 21) {
  anochecer(); // a la inversa
}

Todo empieza con una descripción de lo que debe hacer el programa...