Problema parpadeo led con pantalla LCD

Buenas, tengo una pantalla lcd 16x2, y en esta le tengo metido un juego el cual funciona perfectamente.

Mi problema viene cuando le intento meter un led, el cual quiero que parpadee. Lo defino arriba, en el setup lo declaro como salida y en void loop lo pongo como high y como low con un delay intermedio para que se encienda y se apague, cargo el programa y el led parpadea bien pero una parte de la pantalla también empieza a parpadear (en concreto de la primera fila las tres primeras columnas y la fila de abajo entera).

Como hago para que parpadee solo el led pero que el juego del lcd funcione bien?

Adjunto el código.

/*  Atrapa los 7 Fugitivos 
 *  Juego con LCD 2x16 y Arduino
 *  Atrapa los fugitivos al poner tierra en el puerto analogico A5
 */
 
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);   //Pines de salida para el LCD
  
// Defino los caracteres o imagenes
byte letra1[8] = { B01110, B01110, B01110, B00100, B11111, B00100, B01010, B01010 }; //Fugitivo1
byte letra2[8] = { B01110, B01110, B01110, B10101, B01110, B00100, B01010, B10001 }; //Fugitivo2

byte letra3[8] = { B00100, B00100, B00100, B00100, B00100, B11111, B01110, B00100 }; //Flecha abajo

//byte letra3[8] = { B00100, B01110, B11111, B00100, B00100, B00100, B00100, B00100 }; //flecha arriba
//byte letra3[8] = { B00100, B01110, B11111, B00100, B00100, B11111, B01110, B00100 }; //flecha arriba y abajo

byte letra0[8] = { B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000 }; //Blanco
byte letra4[8] = { B01110, B01110, B01110, B11111, B10101, B01110, B01010, B11011 }; //Atrapado

int x=0; //Columnas
int y=1; //Filas
int retardo=200; //Retardo de la velocidad del personaje
int presos=0; //nº de presos atrapados, inicamos a 0.
int libres=7; //7 fugitivos libres, habrá 7
int fallas=0; //Empezamos con 0 fallos
int puntaje=0; //Nuestro puntaje será de 0 al principio.
#define ledR1 8


void setup() {
  lcd.begin(16, 2);               //Configura el LCD con 16 columnas y 2 filas
  lcd.createChar(1, letra1);      //Asigna los caracteres por numeros
  lcd.createChar(2, letra2);
  lcd.createChar(3, letra3);
  lcd.createChar(0, letra0);
  lcd.createChar(4, letra4);
    pinMode(ledR1, OUTPUT);
} 

void loop() { //Aquí está el programa que se va a repetir

  digitalWrite (ledR1, HIGH);
    delay(500);
  digitalWrite (ledR1, LOW);
    delay(500);
 
  lcd.setCursor(0, 0);   // Posicion del letrero en 0,0. Columna y fila, respectivamente. Aquí se irá viendo el nº de presos que capturemos.
  lcd.print(presos); 
  lcd.setCursor(2, 0);   // Posicion del letrero en 2,0.
  lcd.print("F"); 
  lcd.setCursor(3, 0);   // Posicion del letrero en 3,0. Aquí se irán viendo los fallos que tengamos, es decir, cuando bajemos la flecha y no capturemos al fugitivo.
  lcd.print(fallas); 
  lcd.setCursor(0, 1);   //Posicion del letrero en 0,1. Aquí veremos el nº de fugitivos que aún están libres, es decir, los que aún no han sido capturados. 
  lcd.print(libres); 

  lcd.setCursor(x,y);  //Imagen fugitivo 1 deslizandose con brazos cerrados.
  lcd.write(byte(1)); 
  delay(retardo);      
                      
  lcd.setCursor(x,y);  //Imagen fugitivo 2 deslizandose con brazos abiertos. 
  lcd.write(byte(2));
  delay(retardo); 

  lcd.clear();        //Borrar la pantalla para que aparezca en la siguiente posición.

  lcd.setCursor(14,0); //Flecha en la posicion columna 14 y en la fila 0.
  lcd.write(byte(3));
  
  lcd.setCursor(5, 0);   //Posicion del letrero, a partir de la columna 5, esta incluida. 
  lcd.print("CAPTURA"); 
  
  if (analogRead(A5)<= 10) {  // Si es oprimido el interruptor A5
    lcd.setCursor(14,0);       // Se borra la flecha
    lcd.write(byte(0));
    lcd.setCursor(14,1);      // Baja la flecha
    lcd.write(byte(3));
   
    if (x == 14) {            // Si coincide en la posicion 14 y es capturado
       lcd.setCursor(5, 0);
       lcd.print("Bien   ."); 
       lcd.setCursor(x,y);    // Coloca imagen de capturado
       lcd.write(byte(4));
       presos++;   
       libres--;  
    }
    else{                        // Cuando no es capturado
       lcd.setCursor(5, 0);
       lcd.print("Fallo  ."); 
       lcd.setCursor(x,y);       // donde quedo el corredor, Imagen de que sigue libre 
       lcd.write(byte(2));
       fallas++;
    }
  delay(3000);                     // Espera 3 segundos
  }
 
  x=x+1;                         // avanza el corredor
  
  if (x>=16) {
     x=0;                        // al pasar regresa al inicio
  }  
 
 // retardo = random(1,150);       // Escoge un retardo aleatorio

 if (fallas == 3) {                 // Si coincide en la posicion 14 y es capturado
       lcd.clear();                 // borrar Pantalla
       lcd.setCursor(3, 0);
       lcd.print("NO PUDO ..."); 
       puntaje=presos-fallas;
       lcd.setCursor(3, 1);
       lcd.print("Puntaje:"); 
       lcd.setCursor(12, 1);
       lcd.print(puntaje); 
       delay (7000);
       presos=0;
       libres=7;
       fallas=0;
       lcd.clear();        // borrar Pantalla
    }
 if (libres == 0) {             // Si coincide en la posicion 14 y es capturado
       lcd.clear();             // borrar Pantalla
       lcd.setCursor(3, 0);
       if (fallas == 0) {              // Si no hubo fallas
         lcd.print("EXCELENTE!!!!"); 
       }
       else{
         lcd.print("PUEDE MEJORAR");    // si termino pero con alguna falla
       }
       
       puntaje=presos-fallas;
       lcd.setCursor(3, 1);
       lcd.print("Puntaje:"); 
       lcd.setCursor(12, 1);
       lcd.print(puntaje);               // Puntaje final 
       delay (7000);
       presos=0;
       libres=7;
       fallas=0;
       lcd.clear();        // borrar Pantalla
    }   
}

Hola, me parece que tu problema es de conexion y alimentacion del proyecto. Busca ver que pasa si alimentas la pantalla con una fuente de 5v independiente (estoy asumiendo que la estas alimentando, al igual que el led con los pines del arduino). Saludos.

hypernovat:
Hola, me parece que tu problema es de conexion y alimentacion del proyecto. Busca ver que pasa si alimentas la pantalla con una fuente de 5v independiente (estoy asumiendo que la estas alimentando, al igual que el led con los pines del arduino). Saludos.

Hola, no es problema de conexión porque si por ejemplo pongo el led sin parpadeo, es decir, solo encendido

digitalWrite (led, HIGH);

No me parpadea el lcd, me parpadea en el momento en que pongo:

digitalWrite (led, LOW);

Tu problema es el uso de la Función Delay , para hacer parpadear el led. Debes modificar tu programa usando millis(). No puedes tomar dos programas con Delay y unirlos.
saludos

Como dice PeterKanTropus tu problema es el delay()

Solo por citar uno de ellos tienes en el primer código esto

delay(3000);                     // Espera 3 segundos

3 segundos que el programa llega ahí y no hace nada.
Dime como esperas que algo parpadee?

Solución: Ve a Documentación => Indice de temas tutoriales => millis()
tienes muchos tutoriales.

@PeterKantTropus @surbyte

Os dejo un vídeo para que veáis lo que sucede exactamente. El delay ese de 3 segundos está ahí porque cuando captura al muñeco espera 3 segundos para volver a seguir jugando.

Creéis que con milis se soluciona esto ?

https://www.youtube.com/watch?v=d2JG5fKSgsQ

https://www.youtube.com/watch?v=LWv2k0wTksM

Me autocontesto. He probado añadiendo esto de aquí a mi código https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay y ahora si que parpadea y funciona el juego bien pero tengo otro problema, a ver como podría solucionarlo.

Tengo añadido al código 3 botones, y cuando pulsamos uno u otro cambia la velocidad con la que se mueve el muñeco. Si pulso algún botón de estos también me cambia la velocidad con la que el led parpadea...

Alguna manera de hacer que funcione el led y el programa de forma independiente o como hago para que cuando pulse el botón no afecte al parpadeo del led?

Debes entender que no es la cuestión de eliminar una parte del programa que tengas delay(). Debes reestructurar todo el programa para no utilizarlo.

PeterKantTropus:
Debes entender que no es la cuestión de eliminar una parte del programa que tengas delay(). Debes reestructurar todo el programa para no utilizarlo.

No hay ninguna otra solución? cambiar el código entero para los varios delay que tengo me supone un engorro.

He probado a poner un buzzer y me pasa igual, al poner delay para variar el tono falla el lcd igual. :frowning:

tienes un delay de 500 lo cual hace que se detenga todo después de prender el led después que se apague el led y esperar medio segundo mas para que continué todo lo demás acumulado un segundo lo cuan hace que parezca un falla pero no, todo esta bien. quita el primer delay de 500 después pon al final de todo el código antes de la ultima llave pon que se pague el led con un delay de unos 40 o 50.

Amigo. la solución esta bien explicada en Seccion Documentación => Indice de temas tutoriales => millis() y también lee máquina de estados.

Si es o no un engorro se debe a que aprendiste a programar mal usando delay().
Si usas delay() siempre te ocurrirá eso.
Si no te gusta usarlo y quieres programar bien, entonces ve al sitio que te indiqué y aprende como modificarlo.