ayudaaa acumulación de mensajes en lcd

Hola a todos y muy buenas, tengo echo un sistema rfid para el control de acceso de una puerta y lo tengo echo con una lcd para que ponga el estado en el que se encuentra, el problema es que se acumula la pantalla los mensajes de uno a otro. ayudaaa por favor no se seguir graciass.

/* ARDUINO RFID-RC522 PUERTA DE SEGURIDAD
 * CONEXIONES: 
 * 
 * RELE = 4   
 *    RFID-RC522         ARDUINO UNO
 * ------------------------------------- 
 *      3.3V                 3.3V
 *      RST                 PIN 9
 *      GND                  GND
 *      RQ                   --
 *     MISO                 PIN 12
 *     MOSI                 PIN 11
 *     SCK                  PIN 13
 *     SDA                  PIN 10
 */


#include <LiquidCrystal.h>
#include <EEPROM.h> 
#include <SPI.h>      
#include <MFRC522.h>   

#define rele A1
#define pitido A2
boolean coincide = false;
boolean programMode = false; 

byte guardartarjeta[4];  
byte leertarjeta[4];           
byte tarjetaadmin[4] = {0xE0,0x8C,0xD7,0x1F}; // TARJETA ADMINISTRADOR

#define SS_PIN 2
#define RST_PIN 3
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup() {
  lcd.begin(16, 2);
  pinMode(rele, OUTPUT);
  pinMode(pitido, OUTPUT);
  digitalWrite(rele, HIGH);
  Serial.begin(9600);
  SPI.begin();           
  mfrc522.PCD_Init();    
}
void loop () {
  int okleer;  
  do {
    okleer = cojerid(); 
    if (programMode) {
      modoadmin(); 
    }
    else {
      modonormal(); 
    }
  }
  while (!okleer); 
  if (programMode) {
    programMode = false;  
    if ( esAdmin(leertarjeta) ) {  
      return;
    }
    else {	
      if ( buscarid(leertarjeta) ) { 
         borrarid(leertarjeta);   
      }
      else {                   
        guardarid(leertarjeta);  
      }
    }
  }
  else {
    if ( esAdmin(leertarjeta) ) {  
      programMode = true;
      int count = EEPROM.read(0);  
    }
    else {
      if ( buscarid(leertarjeta) ) {         
        abrirpuerta(9000);                
      }
      else {				
        fallo(); 
      }
    }
  }
}
int cojerid() {
  if ( ! mfrc522.PICC_IsNewCardPresent()) { 
    return 0;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) { 
    return 0;
  }
  Serial.println("");
   Serial.println("TARJETA N");
  for (byte i = 0; i < mfrc522.uid.size; i++) { 
    leertarjeta[i] = mfrc522.uid.uidByte[i];
   Serial.print(leertarjeta[i], HEX);
  }

  mfrc522.PICC_HaltA(); 
  return 1;
}
void modoadmin() {
  lcd.setCursor(6,0);
  lcd.print("MODO");
  lcd.setCursor(1,2);
  lcd.print("ADMINISTRADOR");
    
}
void modonormal () {
  lcd.setCursor(2,0);
  lcd.print("EN SERVICIO");
  lcd.setCursor(2,2);
  lcd.print("PASE TARJETA");

  
  
}
void leerid( int number ) {
  int start = (number * 4 ) - 3; 
  for ( int i = 0; i < 4; i++ ) { 
    guardartarjeta[i] = EEPROM.read(start+i); 
  }
}

void guardarid( byte a[] ) {
  if ( !buscarid( a ) ) { 
    int num = EEPROM.read(0); 
    int start = ( num * 4 ) + 1; 
    num++; 
    EEPROM.write( 0, num ); 
    for ( int j = 0; j < 4; j++ ) { 
      EEPROM.write( start+j, a[j] ); 
    }
    guardadook();
  }
  else {
    falloguardar();
  }
}
void borrarid( byte a[] ) {
  if ( !buscarid( a ) ) { 
    falloguardar(); 
  }
  else {
    int num = EEPROM.read(0);  
    int slot; 
    int start;
    int looping; 
    int j;
    int count = EEPROM.read(0);
    slot = buscarids( a ); 
    start = (slot * 4) - 3;
    looping = ((num - slot) * 4);
    num--; 
    EEPROM.write( 0, num ); 
    for ( j = 0; j < looping; j++ ) { 
      EEPROM.write( start+j, EEPROM.read(start+4+j)); 
    }
    for ( int k = 0; k < 4; k++ ) { 
      EEPROM.write( start+j+k, 0);
    }
    borradook();
  }
}
boolean comprobar ( byte a[], byte b[] ) {
  if ( a[0] != NULL ) 
    coincide = true; 
  for ( int k = 0; k < 4; k++ ) { // Loop 4 times
    if ( a[k] != b[k] ) 
      coincide = false;
  }
  if ( coincide ) { 
    return true; 
  }
  else  {
    return false; 
  }
}
int buscarids( byte find[] ) {
  int count = EEPROM.read(0); 
  for ( int i = 1; i <= count; i++ ) { 
    leerid(i); 
    if( comprobar( find, guardartarjeta ) ) { 
      
      return i; 
      break; 
    }
  }
}
boolean buscarid( byte find[] ) {
  int count = EEPROM.read(0); 
  for ( int i = 1; i <= count; i++ ) {  
    leerid(i); 
    if( comprobar( find, guardartarjeta ) ) {  
      return true;
      break; 
    }
    else {     
    }
  }
  return false;
}
void guardadook() {
  lcd.setCursor(0,0);
  lcd.print("TARJETA GUARDADA");
  lcd.setCursor(1,2);
  lcd.print("CORRECTAMENTE");
  delay(2000);
}
void falloguardar() {
   lcd.setCursor(2,0);
  lcd.print("ERROR AL GUARDAR");
  lcd.setCursor(2,2);
  lcd.print("EEPROM LLENA");
}
void borradook() {
  lcd.setCursor(0,0);
  lcd.print("TARJETA BORRADA");
  lcd.setCursor(1,2);
  lcd.print("CORRECTAMENTE");
  
}
boolean esAdmin( byte test[] ) {
  if ( comprobar( test, tarjetaadmin ) )
    return true;
  else
    return false;
}
void abrirpuerta( int setDelay ) {
  lcd.setCursor(0,0);
  lcd.print("ACCESO PERMITIDO");
  lcd.setCursor(1,2);
  lcd.print("PUEDE PASAR");
 digitalWrite(pitido, HIGH); 
  digitalWrite(rele, LOW); 
  delay(1000); // TIEMPO DE SALIDA 1S
  digitalWrite(rele, HIGH);
  digitalWrite(pitido, LOW);
  
}
void fallo() {
  lcd.setCursor(0,0);
  lcd.print("ERROR TARJETA");
  lcd.setCursor(1,2);
  lcd.print("NO ADMITIDA");
  delay(2000);
}

Saludosss

Por que no borras la pantalla antes de cada mensaje?

Exacto, un

lcd.clear();

Antes de cada

lcd.setCursor

Solucionaría el problema

Hola, eso ya lo hice y lo he vuelto a hacer y ahora los mensajes no se acumulan pero tiembla los dígitos mas bien como que parpadea muy rápido. Pero al regular el potencio metro de la lcd sube el contraste pero (parpada menos) pero se ve mal. Voy a probar con otra lcd haber que pasa.

Saludossss

Hola, he cambiado la lcd y va todo ok es la lcd shield china no se porque ace eso.

Solucionado

saludossss

Hola, vuelve a hacer lo de parpadea. Parpadea de abajo a arriba no se por que. ayuda otra vezzz

Saludos.
Lo del parpadeo es por el lcd.clear coloca un pequeño delay luego de cada mensaje. O limpiala solo en algunas ocasiones.

Has definido un lcd 16x2 de modo que lo mejor es que siempre que escribas en el LCD escribas los 16 caracteres
ejemplo
en lugar de

 lcd.print("MODO");
 lcd.setCursor(1,2);
 lcd.print("ADMINISTRADOR");

usa

          //1234567890123456
 lcd.print("MODO            ");
 lcd.setCursor(1,2);
 lcd.print("ADMINISTRADOR   ");

de modo que cada mensaje escrito en el LCD esta borrando el anterior.
Solución simple y eficaz, sin lcd.clear que genera parpadeo o demoras si usas delay(XXX)