Hola gente,  en este post vamos a ver como podemos enviar texto desde una app para android hecha a medida, e imprimirlo en una impresora térmica por medio de wifi.

 

Para esto vamos a utilizar un nodemcu ESP8266, programado desde la ide de arduino, vamos a ver como crear un servidor UDP, el cual va a escuchar las conexiones entrantes desde un puerto especifico. 

Del otro lado de la conexión tendremos un dispositivo android, provisto de una aplicación hecha en app inventor, que se conectara a nuestro esp8266 como cliente UDP, desde la cual podremos enviar texto para ser impreso. 

Ademas la app para android tendrá opciones básicas para formatear el texto, como por ejemplo: la alineación del texto, impresión con colo invertido, negrita, texto subrayado y 3 tamaños de fuentes (pequeño, mediano y grande). 

Para conectar la impresora a nuestro nodemcu, vamos a utilizar un pin de salida que sera configurado como puerto serie (TX), por medio de la librería ESPSoftwareSerial.

Hay que tener en cuenta que esta librería no es la misma que para arduino. 

 

Para el control de la impresora haremos uso de la librería para arduino adafruit thermal Printer,   esta librería nos evita de tener que programar la configuración completa de la impresora ya que esta lo hace automáticamente. 

Ademas nos provee de funciones para el control de las diferentes características de impresión como , el formateo de texto, impresión de códigos de barra e impresión de mapas de bitmaps. 

La conexión de la impresora al nodemcu es muy fácil, solo tenemos que conectar el pin gnd de la impresora al pin GND de ESP8266, y el pin RX de la impresora al pin TX de nuestro nodemcu, en mi caso yo opte por usar la salida D6 del nodemcu como TX. 

Como no estoy seguro de que los pines de ESP8266 sean tolerantes a 5v, yo puse una resistencia de 1kohm entre el nodemcu y el pin RX de la impresora, mas vale ser precavidos. 

Pasamos a la parte del Codigo que deberemos cargar en nuestro ESP8266: 

/*************************************************
Este sketch fue creado para poder hacer impresion 
por medio de un celular android, a una impresora termica
conectada por wifi a travez de un nodemcu ESP8266

Hace uso de un servidor UDP (ESP8266) que espera paquetes
entrantes desde una app para android (cliente UDP). 
Imprime los datos por puerto serie a una impresora termica.

TEXOLAB.NET
****************************************************/
#include <Adafruit_Thermal.h> //libreria impresora termica
#include <SoftwareSerial.h> 
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <string.h>

//Valores de configuracion de nuestra red WIFI
const char* ssid = "WiFi";
const char* password = "password";

// crea un puerto serial por Software para la impresora
// yo solo uso el pin de transmision 14 o D6
SoftwareSerial serialprint(14,12);
Adafruit_Thermal printer(&serialprint);
// creamos un servidor udp
WiFiUDP Udp;
unsigned int localUdpPort = 4210;  // puerto en el que escuchamos
char incomingPacket[255];  // buffer para los paquetes entrantes
char textoprint[255];
char  replyPacekt[] = " impreso :)";  // Mensaje de respuesta


void setup()
{
  // configuramos el puerto serie con el que nos conecraremos al monitor serie de arduino ide
  Serial.begin(115200);
  
  serialprint.begin(9600);
  // configuramos el puerto serie de la impresora
  
  printer.begin(); // iniciamos la impresora
  

  // conectamos al wifi
  Serial.printf("Conectando a: %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" Conectado");

  
  //iniciamos el servidor UDP
  Udp.begin(localUdpPort);
  Serial.printf("Escuchando en la IP %s, en el Puerto UDP %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
  //mostramos en el monitor serie de arduino que direccion de ip y perto es al que deben conectarse los clientes
}


void loop()
{
  int packetSize = Udp.parsePacket(); 
  if (packetSize)
  {
    // Recibe los paquetes UDP entrantes
    Serial.printf("Recibidos %d bytes desde %s, puerto %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
    
    int len = Udp.read(incomingPacket, 255);
    if (len > 0)
    {
      incomingPacket[len] = 0;
    }

    // comprobamos que el paquete tenga caracteres de configuracion 
    // si es asi ejecuta la funcion correspondiente (alineacion del texto
    // tamaño del texto, color invertido etc.
    if(incomingPacket[0] == 'i' && incomingPacket[1] == '1'){printer.inverseOn();Serial.printf("Negrita Activado\n");}
    if(incomingPacket[0] == 'i' && incomingPacket[1] == '0'){printer.inverseOff();}
    if(incomingPacket[0] == 'c'){printer.justify('C');}
    if(incomingPacket[0] == 'd'){printer.justify('R');}
    if(incomingPacket[0] == 'i'&& incomingPacket[1] == 'z'){printer.justify('L');}
    if(incomingPacket[0] == 's'&& incomingPacket[1] == '1'){printer.underlineOn();}
    if(incomingPacket[0] == 's'&& incomingPacket[1] == '0'){printer.underlineOff();}
    if(incomingPacket[0] == 'n'&& incomingPacket[1] == '1'){ printer.boldOn();}
    if(incomingPacket[0] == 'n'&& incomingPacket[1] == '0'){ printer.boldOff();}
    if(incomingPacket[0] == 's'){ printer.setSize('S');}
    if(incomingPacket[0] == 'm'){ printer.setSize('M');}
    if(incomingPacket[0] == 'l'){ printer.setSize('L');}

   // mostramos el contenido del paquete en el monior serie
    Serial.printf("Contenido del paquete: %s\n", incomingPacket);
    // comprobamos que la cadena enviada comienze con "P," si es asi 
    // cortamos los dos primeros caracteres e imprimimos el resto 
   if(incomingPacket[0] == 'P' && incomingPacket[1] == ','){
    int tam = strlen(incomingPacket);
    strncpy (textoprint, incomingPacket + 2, tam);
     printer.println(textoprint);}
     

    // Envia una respuesta al ip y puerto desde donde llego el paquete
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(replyPacekt);
    Udp.endPacket();
  }
}

Compilamos y cargamos en nuestro nodemcu o ESP8266, ahora tenemos que instalar la app en nuestro smartphone android: 

Link de descarga de la app: ESPPRIINT.APK

Link descarga “código fuente” o bloques para app inventor espprint.aia

 

Puedes crearte una cuenta en appinventor e importar el proyecto espprint.aia para poder modificar la app a tu gusto o simplemente revisar el código. 

Como se puede observar la interfaz de la app es muy simple y fácil de usar simplemente tenemos que conectar nuestro nodemcu al monitor serie de arduino y nos dará la dirección ip y el puerto 4210, estos datos deberemos ingresarlos en nuestra app en los campos IP y PORT. 

Luego solo seleccionamos como queremos que se imprima el texto y ya podemos empezar a escribir. Al presionar la tecla imprimir se envían los datos a el nodemcu que se encarga de enviar los comando correspondientes a la impresora. 

Por ultimo les dejo un video de la impresora y la app en funcionamiento. 

Cualquier duda no duden en dejar un comentario.

Hasta la próxima. 

 

 

Deja una respuesta