Parpadeo en el led integrado del pin 13

Buenos días, tengo un problema con mi Arduino Mega 2560, y es que cuando le cargo el programa que voy a dejar puesto más abajo, se ejecuta el setup, y el código se bloquea y se pone a parpadear rápido el led integrado. He probado con otros códigos y no le sucede. No se a que se debe este fallo, necesito ayuda. Muchas gracias.
Este es el código:

#include <IRremote.h>
#include <IRremoteInt.h>
#include <DHT.h>
#include <DHT_U.h>
#include <RTClib.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#define Power 0xFFA25D //Apagar pantalla
#define Funcion 0xFFE21D //Encender pantalla
#define Vol+ 0xFF629D //Subir brillo
#define Vol- 0xFFA857 //Bajar brillo
#define Arriba 0xFF906F //Cambio de pantalla
#define Abajo 0xFFE01F //Cambio de pantalla
#define Adelante 0xFFC23D //Subir píxeles
#define Atras 0xFF22DD //Bajar píxeles
#define Play 0xFF02FD //Apagar alarma
const int RS = 13;
const int E = 12;
const int VO = 11;
const int Led = 10;
const int D4 = 9;
const int D5 = 8;
const int D6 = 7;
const int D7 = 6;
const int IR = 5;
const int avisador = 4;
const int Sensor = 3;
int alarma = 0;
int temp;
int humedad;
int modo = 1;
int brillo = 150;
int pixel = 70;
LiquidCrystal lcd (RS, E, D4, D5, D6, D7);
DHT dht (Sensor, DHT11);
RTC_DS3231 rtc;
IRrecv irrecv(IR);
decode_results codigo;

void setup() {
  pinMode(VO, OUTPUT);
  pinMode(Led, OUTPUT);
  analogWrite(VO, pixel);
  analogWrite(Led, brillo);
  Wire.begin();
  // rtc.adjust(DateTime(__DATE__,__TIME__));
  dht.begin();
  lcd.begin(16, 2);
  lcd.setCursor(4, 0);
  lcd.print("Iniciando");
  lcd.setCursor(5, 1);
  lcd.print("sistema");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0, 0);
  irrecv.enableIRIn();
}
void loop(){  
  analogWrite(VO, pixel);
  analogWrite(Led, brillo);
  DateTime fecha = rtc.now();
  humedad = dht.readHumidity();
  temp = dht.readTemperature();
  if (irrecv.decode(&codigo)) {
    switch (codigo.value){
      case 0xFFA25D:
      brillo = 0;
      pixel = 0;
      break;

      case 0xFFE21D:
      brillo = 200;
      pixel = 70;
      break;

      case 0xFF629D:
      brillo = brillo + 1;
      break;

      case 0xFFA857:
      brillo = brillo - 1;
      break;

      case 0xFF906F:
      modo = 1;
      break;

      case 0xFFE01F:
      modo = 0;
      break;

      case 0xFFC23D:
      pixel = pixel + 1;
      break;

      case 0xFF22DD:
      pixel = pixel - 1;
      break;

      case 0xFF02FD:
      alarma = 0;
      break;
    }
  }
  if (brillo >= 250){
    brillo = brillo - 1;
  }
  if (pixel >= 250){
    pixel = pixel - 1;
  }
  if (modo == 1){
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temp:");
    lcd.setCursor(10, 0);
    lcd.print(temp);
    lcd.print((char)223);
    lcd.print("C");
    lcd.setCursor(0, 1);
    lcd.print("Humedad:");
    lcd.setCursor(10, 1);
    lcd.print(humedad);
    lcd.print("%");
    delay(1000);
  }
  if (modo == 0){
    lcd.clear();
    lcd.setCursor(4, 0);
    lcd.print(fecha.hour(), DEC);
    lcd.print(":");
    lcd.print(fecha.minute(), DEC);
    lcd.print(":");
    lcd.print(fecha.second(), DEC);
    lcd.setCursor(3, 1);
    lcd.print(fecha.day(), DEC);
    lcd.print("/");
    lcd.print(fecha.month(), DEC);
    lcd.print("/");
    lcd.print(fecha.year(), DEC);
    delay(1000);
  }
}

El led parpadea porque internamente está conectado al pin 13 que usas para la señal RS del display.

Saludos

Buenas tardes:
He cambiado el código y he dejado de usar el pin 13, pero al código le sigue pasando lo mismo, se ejecuta el setup y se queda ahí, no hace nada más, se queda bloqueado. La variable constante que pone "LED", es el pin "A" de la pantalla, de la retroiluminación, que iba a usar pwm para que no esté el brillo al máximo. He de decir, que se ejecuta el setup, se enciende la retroiluminación, y se queda en la pantalla "Iniciando sistema", lo que pone en el setup, y la retroiluminación se apaga, pero sigue poniendo "Iniciando sistema", sin quitarse para dar paso al loop. No se porque le pasa esto, pero con otros codigos distintos no le sucede.
He aquí el código modificado:

#include <IRremote.h>
#include <IRremoteInt.h>
#include <DHT.h>
#include <DHT_U.h>
#include <RTClib.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#define Power 0xFFA25D //Apagar pantalla
#define Funcion 0xFFE21D //Encender pantalla
#define Vol+ 0xFF629D //Subir brillo
#define Vol- 0xFFA857 //Bajar brillo
#define Arriba 0xFF906F //Cambio de pantalla
#define Abajo 0xFFE01F //Cambio de pantalla
#define Adelante 0xFFC23D //Subir píxeles
#define Atras 0xFF22DD //Bajar píxeles
#define Play 0xFF02FD //Apagar alarma
const int RS = 12;
const int E = 11;
const int VO = 10;
const int Led = 9;
const int D4 = 8;
const int D5 = 7;
const int D6 = 6;
const int D7 = 5;
const int IR = 4;
const int avisador = 3;
const int Sensor = 2;
int alarma = 0;
int temp;
int humedad;
int modo = 1;
int brillo = 150;
int pixel = 70;
LiquidCrystal lcd (RS, E, D4, D5, D6, D7);
DHT dht (Sensor, DHT11);
RTC_DS3231 rtc;
IRrecv irrecv(IR);
decode_results codigo;

void setup() {
  pinMode(VO, OUTPUT);
  pinMode(Led, OUTPUT);
  analogWrite(VO, pixel);
  analogWrite(Led, brillo);
  Wire.begin();
  // rtc.adjust(DateTime(__DATE__,__TIME__));
  dht.begin();
  lcd.begin(16, 2);
  lcd.setCursor(4, 0);
  lcd.print("Iniciando");
  lcd.setCursor(5, 1);
  lcd.print("sistema");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0, 0);
  irrecv.enableIRIn();
}
void loop(){  
  analogWrite(VO, pixel);
  analogWrite(Led, brillo);
  DateTime fecha = rtc.now();
  humedad = dht.readHumidity();
  temp = dht.readTemperature();
  if (irrecv.decode(&codigo)) {
    switch (codigo.value){
      case 0xFFA25D:
      brillo = 0;
      pixel = 0;
      break;

      case 0xFFE21D:
      brillo = 200;
      pixel = 70;
      break;

      case 0xFF629D:
      brillo = brillo + 1;
      break;

      case 0xFFA857:
      brillo = brillo - 1;
      break;

      case 0xFF906F:
      modo = 1;
      break;

      case 0xFFE01F:
      modo = 0;
      break;

      case 0xFFC23D:
      pixel = pixel + 1;
      break;

      case 0xFF22DD:
      pixel = pixel - 1;
      break;

      case 0xFF02FD:
      alarma = 0;
      break;
    }
  }
  if (brillo >= 250){
    brillo = brillo - 1;
  }
  if (pixel >= 250){
    pixel = pixel - 1;
  }
  if (modo == 1){
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temp:");
    lcd.setCursor(10, 0);
    lcd.print(temp);
    lcd.print((char)223);
    lcd.print("C");
    lcd.setCursor(0, 1);
    lcd.print("Humedad:");
    lcd.setCursor(10, 1);
    lcd.print(humedad);
    lcd.print("%");
    delay(1000);
  }
  if (modo == 0){
    lcd.clear();
    lcd.setCursor(4, 0);
    lcd.print(fecha.hour(), DEC);
    lcd.print(":");
    lcd.print(fecha.minute(), DEC);
    lcd.print(":");
    lcd.print(fecha.second(), DEC);
    lcd.setCursor(3, 1);
    lcd.print(fecha.day(), DEC);
    lcd.print("/");
    lcd.print(fecha.month(), DEC);
    lcd.print("/");
    lcd.print(fecha.year(), DEC);
    delay(1000);
  }
}

Creo que el problema son los timers.

Hacé una prueba sin usar PWM, o sea sin analogWrite.

Vas a tener que comentar todos las líneas que contengan analogWrite().

Si no se "cuelga" el problema es de incompatibilidades entre IRremote y PWM.

Probá así

#include <IRremote.h>
#include <IRremoteInt.h>
#include <DHT.h>
#include <DHT_U.h>
#include <RTClib.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#define Power 0xFFA25D //Apagar pantalla
#define Funcion 0xFFE21D //Encender pantalla
#define Vol+ 0xFF629D //Subir brillo
#define Vol- 0xFFA857 //Bajar brillo
#define Arriba 0xFF906F //Cambio de pantalla
#define Abajo 0xFFE01F //Cambio de pantalla
#define Adelante 0xFFC23D //Subir píxeles
#define Atras 0xFF22DD //Bajar píxeles
#define Play 0xFF02FD //Apagar alarma
const int RS = 12;
const int E = 11;
const int VO = 10;
const int Led = 9;
const int D4 = 8;
const int D5 = 7;
const int D6 = 6;
const int D7 = 5;
const int IR = 4;
const int avisador = 3;
const int Sensor = 2;
int alarma = 0;
int temp;
int humedad;
int modo = 1;

int brillo = 1; // 150;
int pixel = 1;  // 70;

LiquidCrystal lcd (RS, E, D4, D5, D6, D7);
DHT dht (Sensor, DHT11);
RTC_DS3231 rtc;
IRrecv irrecv(IR);
decode_results codigo;

void setup() {
  pinMode(VO, OUTPUT);
  pinMode(Led, OUTPUT);

//  analogWrite(VO, pixel);
//  analogWrite(Led, brillo);
  digitalWrite(VO, pixel);
  digitalWrite(Led, brillo);

  Wire.begin();
  // rtc.adjust(DateTime(__DATE__,__TIME__));
  dht.begin();
  lcd.begin(16, 2);
  lcd.setCursor(4, 0);
  lcd.print("Iniciando");
  lcd.setCursor(5, 1);
  lcd.print("sistema");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0, 0);
  irrecv.enableIRIn();
}
void loop(){  
//  analogWrite(VO, pixel);
//  analogWrite(Led, brillo);
  digitalWrite(VO, pixel);
  digitalWrite(Led, brillo);

  DateTime fecha = rtc.now();
  humedad = dht.readHumidity();
  temp = dht.readTemperature();
  if (irrecv.decode(&codigo)) {
    switch (codigo.value){
      case 0xFFA25D:
      brillo = 0;
      pixel = 0;
      break;

      case 0xFFE21D:
      brillo = 1;  // 200;
      pixel = 1;  // 70;
      break;
/*
      case 0xFF629D:
      brillo = brillo + 1;
      break;

      case 0xFFA857:
      brillo = brillo - 1;
      break;
*/
      case 0xFF906F:
      modo = 1;
      break;

      case 0xFFE01F:
      modo = 0;
      break;
/*
      case 0xFFC23D:
      pixel = pixel + 1;
      break;

      case 0xFF22DD:
      pixel = pixel - 1;
      break;
*/
      case 0xFF02FD:
      alarma = 0;
      break;
    }
  }
/* lo comento pero en realidad en esta prueba no se ejecutaría de todos modos
  if (brillo >= 250){
    brillo = brillo - 1;
  }
  if (pixel >= 250){
    pixel = pixel - 1;
  }
*/
  if (modo == 1){
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temp:");
    lcd.setCursor(10, 0);
    lcd.print(temp);
    lcd.print((char)223);
    lcd.print("C");
    lcd.setCursor(0, 1);
    lcd.print("Humedad:");
    lcd.setCursor(10, 1);
    lcd.print(humedad);
    lcd.print("%");
    delay(1000);
  }
  if (modo == 0){
    lcd.clear();
    lcd.setCursor(4, 0);
    lcd.print(fecha.hour(), DEC);
    lcd.print(":");
    lcd.print(fecha.minute(), DEC);
    lcd.print(":");
    lcd.print(fecha.second(), DEC);
    lcd.setCursor(3, 1);
    lcd.print(fecha.day(), DEC);
    lcd.print("/");
    lcd.print(fecha.month(), DEC);
    lcd.print("/");
    lcd.print(fecha.year(), DEC);
    delay(1000);
  }
}

Obviamente solo podras encender y apagar la retroiluminación, no vas a poder graduarla, el resto debería funcionar.

En resumen, si así funciona el problema es de incompatibilidades, como te dije antes.

Revisá la documentación de IRremote que, si no entiendo mal, hay formas de hacer que funcionen ambas cosas.

Saludos

PD: Lamentablemente no lo puedo probar porque no tengo un Mega y encima mi display es I2C. :man_facepalming:t2:

Buenas noches:
He probado el código que me mandaste, cambiando el pin "vo" poniéndolo con un potenciómetro porque si no no se ven las letras. El programa enciende, se inicia el setup, se ejecuta, se limpia la pantalla (el final del setup), y vuelve a parpadear el led y sigue sin responder el programa.
Un saludo. He de decir que el parpadeo que hace es rápido, no como por ejemplo, en el programa blink.
Dejo aquí un video:
Nuevo proyecto.zip (3,0 MB)

Se me esta ocurriendo una cosa:
¿Puede ser porque esté usando más corriente de la que puede dar la placa? Son la pantalla, el dht11, el ds3231, y el sensor ir.

No. Por estos elementos no deberías tener problemas
Porque no haces algo.
Porque no pruebas las cosas individualmente.
Comienza con la pantalla sola, y asegúrate que funcione bien. Quita todo lo demás.
Luego introduce el DHT11
Sigue con el RTC DS3231.
Finalmente el mando IR.
Pero cuando digo sin nada mas, hablo de las librerías y todo lo demas no debe estar en el código de prueba.
Empieza con cosas limpias y ve avanzando hasta encontrar quien te genera el problema.

No me daba cuenta qué era lo que manejaba VO, claro, es el contraste!

Lo ideal es hacer lo que dice @Surbyte , probar cada cosa por separado pero para abreviar probaría sin la parte del control remoto.
O sea, tu primer código eliminando todo lo que tenga que ver con el C/R, si así te muestra la hora y demás, entonces ya tenemos al culpable del problema.

Este mismo proyecto lo tengo hecho sin el sensor ir, a cambio de unos botones en la protoboard, y en cambio, ese si me funcionaba bien.

#include <DHT.h>
#include <DHT_U.h>
#include <RTClib.h>
#include <Wire.h>
#include <LiquidCrystal.h>

const int RS = 7;
const int E = 8;
const int D4 = 9;
const int D5 = 10;
const int D6 = 11;
const int D7 = 12;
const int pulsador3 = 49;
const int SENSOR = 50;
const int pulsador1 = 51;
const int pulsador2 = 52;
const int avisador = 53;

int alarma = 0;
int temp;
int humedad;
int modo = 1;

LiquidCrystal lcd (RS, E, D4, D5, D6, D7);

DHT dht (SENSOR, DHT11);

RTC_DS3231 rtc;

void setup() {
  Wire.begin();
  pinMode(pulsador1, INPUT);
  pinMode(pulsador2, INPUT);
  pinMode(avisador, OUTPUT);
  // rtc.adjust(DateTime(__DATE__,__TIME__));
  dht.begin();
  lcd.begin(16, 2);
  lcd.setCursor(4, 0);
  lcd.print("Iniciando");
  lcd.setCursor(5, 1);
  lcd.print("sistema");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0, 0);
}
void loop(){
  DateTime fecha = rtc.now();
  humedad = dht.readHumidity();
  temp = dht.readTemperature();
  if (digitalRead(pulsador1) == HIGH){
    modo = 1;
  }
  if (digitalRead(pulsador2) == HIGH){
    modo = 0;
  }
  if (modo == 1){
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temp:");
    lcd.setCursor(10, 0);
    lcd.print(temp);
    lcd.print((char)223);
    lcd.print("C");
    lcd.setCursor(0, 1);
    lcd.print("Humedad:");
    lcd.setCursor(10, 1);
    lcd.print(humedad);
    lcd.print("%");
    delay(1000);
  }
  if (modo == 0){
    lcd.clear();
    lcd.setCursor(4, 0);
    lcd.print(fecha.hour(), DEC);
    lcd.print(":");
    lcd.print(fecha.minute(), DEC);
    lcd.print(":");
    lcd.print(fecha.second(), DEC);
    lcd.setCursor(3, 1);
    lcd.print(fecha.day(), DEC);
    lcd.print("/");
    lcd.print(fecha.month(), DEC);
    lcd.print("/");
    lcd.print(fecha.year(), DEC);
    delay(1000);
  }
  if (digitalRead(pulsador3) == HIGH){
    alarma = 1;
    digitalWrite(avisador, LOW);
  }
}

Pero en éste no usas IR pero tampoco PWM que justamente son las cosas que entran en conflicto.

Buscá en Google "irremote pwm" y vas a encontrar posibles soluciones, como te dije al principio hay conflicto con el uso de los timers.

Agrego: Leyendo muy por arriba, parece que también puede haber conflictos entre IRremote y Wire.

Te va tocar leer un rato largo... Así es esto. :man_facepalming:t2:

Saludos

Buenas tardes, gracias por la ayuda. Dándole vueltas, me he dado cuenta de que al compilar los programas, tanto el mío original, como el que me puso @anon90500195 , aaunque se compila bien y se sube, salen ciertos errores mientras se compila. Adjunto fotos.
Un saludo.


Moderador:
Por favor, lee las Normas del foro y edita tus capturas del post#11 mostrando los errores con etiquetas como corresponde.

Lo que ves son Warnings o Advertencias, no son errores.

¿Entonces que es lo que puedo hacer para solucionar el problema?

Ya te lo dije, lee la documentación de las librerías.

Saludos

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.