Enviar datos al monitor serial con SD

Puede ser que el ahorro de energía esté causando algún desarreglo. Prueba a desactivarlo a ver si la impresión al menos se muestra más estable:
Cambia en el setup el parámetro de sleepAfter a cero:

  printer.sleepAfter(0);

En teoría esto la dejaría despierta, con lo que ya no sería necesaria la línea de despertar

printer.wake();

A ver cómo se comporta así.

EDITO: de paso, vamos a agregar en el case 6 de la demo una muestra de la ram que queda disponible. Mira a ver qué valores devuelve. Principalmente si es muy bajo, y sobre todo, si disminuye en cada ejecución.

#include <EEPROM.h>
#include <Adafruit_Thermal.h>
#include <Wire.h>
#include <SD.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd (0X27,2,1,0,4,5,6,7,3, POSITIVE);

File myFile;

const byte chipSelect = 10;
const byte Coin = 2; // pin siguiente registro
const byte Salir = 3; // tomaré este pin como el de salir a demo
unsigned long millis_inicio=0, millis_espera=0;
bool demo=true; // si estamos en modo demo (o mostrando registro)
byte sigFase=0; // siguiente fase de la demo a ejecutar
bool estadoAnteriorSalir = LOW;     // guardado del último estado de los botones...
bool estadoAnteriorMostrar = LOW;   // ...para saber si cambió el estado
char nom[20]; // buffer de almacenamiento temporal
char tel[20]; // buffer de almacenamiento temporal
unsigned long regActual;

 
Adafruit_Thermal printer(&Serial);    

void setup() {

  pinMode(7, OUTPUT);  digitalWrite(7, LOW);  
  pinMode (Salir, INPUT_PULLUP);
  pinMode(Coin, INPUT_PULLUP);

  lcd.begin(20, 4);
  Serial.begin (19200);
  printer.begin ();
  printer.setDefault();
  printer.sleepAfter(0);

  lcd.print (F("    COMPROBANDO"));
  delay(1000);
  lcd.setCursor (5, 1);
  lcd.print (F("HARDWARE..."));
  delay (4000);
  lcd.setCursor (6, 2);
  lcd.print (F("ESPERE"));
  delay (1000);
  lcd.setCursor(7, 3);
  lcd.print (F("POR FAVOR"));
  delay (5000);
  lcd.clear ();
  delay (1000);
 
  pinMode (chipSelect, OUTPUT);
  lcd.setCursor (0, 1);
  lcd.print (F("Inicializando SD..."));
  delay (1000);
  
  if (!SD.begin(chipSelect)) {
    lcd.setCursor (1, 2);
    lcd.print(F("ERROR al iniciar SD"));
    delay (1000);

    lcd.setCursor (0, 3);
    lcd.print (F(" ***Inserta la SD***"));
    delay (5000);
    lcd.clear ();
    delay (1000);
    return;

  }

  lcd.setCursor (0, 2);
  lcd.print(F(" ...BOOT exitoso"));
  delay (4000);
  lcd.clear ();
  
  myFile = SD.open ("Datos.txt"); //
  if (myFile) {
      
    EEPROM.get(0,regActual);
    if (regActual<myFile.size()){
      myFile.seek(regActual);
    }

  } else lcd.print (F("No se pudo abrir"));
}

void loop() {
      lcd.setCursor (0, 2);
      lcd.print (F("NOM:"));
      lcd.setCursor(0, 3);
      lcd.print (F("TEL:"));

  if (digitalRead(Coin) != estadoAnteriorMostrar) {  // Cambio estado pulsador
    estadoAnteriorMostrar = !estadoAnteriorMostrar; // cambiamos el último estado
    if (estadoAnteriorMostrar == LOW) { // si el cambio es de no pulsado a pulsado
      muestra_registro(); // muestra registro siguiente
      demo=false; // salimos de modo demo (quedará registro fijo en pantalla)
    }
  }
  else if (digitalRead(Salir) != estadoAnteriorSalir) { // Lo anterior con el pulsador de salida a demo
    estadoAnteriorSalir = !estadoAnteriorSalir;
    if (estadoAnteriorSalir == LOW) {
      millis_espera=0L; // establecemos espera a cero para que no espere para repintar
      demo=true;  // cambiamos a modo demo, con lo que en el siguiene paso continuaremos con nuestra demo.
    }
  }
  
  if (demo) {
    muestraDemo();  // si estamos en modo demo entramos en el control de la demo
  }
}


void muestraDemo(void) {
  if ( (millis() - millis_inicio) >= millis_espera ) { // si ha pasado millis_espera desde la última fase, entramos a fase nueva
      switch (sigFase){
      case 0:
        lcd.clear();
        lcd.setCursor (0, 0);
        lcd.print(F("   Bienvenidos a:"));
        lcd.setCursor(2, 1);
        lcd.print(F("Mi proyecto "));
        millis_espera = 7000;
        break;
      
      case 1: // Aprovechamos para poner todos los casos en los que hay lo mismo (borrado de pantalla y espera 1000)
      case 3:
      case 5:
        lcd.clear();
        millis_espera = 500;
      break;
    
      case 2:
        lcd.setCursor(0, 0 );
        lcd.print(F(" No esperes mas"));
        lcd.setCursor(0, 1 );
        lcd.print(F("Aprende"));
        millis_espera = 7000;
        break;
    
      case 4:
        lcd.setCursor(0, 0 );
        lcd.print(F("APROVECHA"));
        lcd.setCursor(2, 1 );
        lcd.print(F("<<<LOS CURSOS>>>"));
        millis_espera = 7000;
        break;
      // caso 5 igual que 1 y 3
      case 6:
        lcd.setCursor(0, 0 );
        lcd.print(F("Memoria: "));
        lcd.setCursor(2, 1 );
        lcd.print(freeRam);
        millis_espera = 7000;
        break;
    }
    millis_inicio=millis();
  sigFase++;  // siguiente fase
  if (sigFase > 7) sigFase=0; // si hemos pasado de la 7, rebobinamos
  }
}

// muestra el siguiente registro
void muestra_registro(void){

  if (myFile) {
    if (myFile.available()) {
      nom[myFile.readBytesUntil(',', nom, 20)] = '\0';
      tel[myFile.readBytesUntil('\n', tel, 20)-1] = '\0';
    
      lcd.clear();
      lcd.setCursor (0, 0);
      lcd.print (F(" !PRESIONA EL BOTON!"));
      lcd.setCursor (0, 1);
      lcd.print (F(" Y Borra Tus claves"));
      lcd.setCursor (0, 2);
      lcd.print (nom);
      lcd.setCursor (0, 3);
      lcd.print (tel);

      //printer.wake();
      printer.println(F(" "));
      printer.justify('C');
      printer.setSize('M');
      printer.println(nom);
      printer.println(tel);
      printer.println(F(" "));
      printer.println(F(" "));       
    } else {
      Serial.println (F("Final del Archivo"));
      myFile.seek (0L);
      lcd.clear ();
      lcd.print (F("<Final del Archivo>"));
      lcd.setCursor (0, 2);
      lcd.print (F("NOM:"));
      lcd.setCursor(0, 3);
      lcd.print (F("TEL:"));
    }

    EEPROM.put(0,myFile.position());
  
  } else {
    lcd.clear();
    lcd.print (F("ERROR: no hay SD"));
    lcd.setCursor (0, 1);
    lcd.print (F("o archivo no exs"));
  }
}

int freeRam () {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}