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);
}