ESP32 Mobil Thermal Printer

M_B

Aktif Üye
Katılım
16 Şubat 2023
Mesajlar
140
Merhabalar,
ESP32 Bluetoth ile Mobil Thermal yazıcıdan cıktı almaya çalışıyorum.
Thermal printer kutuphanesi olarak https://github.com/adafruit/Adafruit-Thermal-Printer-Library
kullanıyorum.
Kutuphaneyle bir turlü yazı yazdıramadım. İşin garip tarafı kutuphanedeki barkodları yazıyor.

Kod icerisinde karekter yazdırma fonksiyonları olan
printer.print(..... ) ve printer.println(...) kullanıyorum yazıyormuş gibi yapıyor ama boş cıktı veriyor.
Cihaz marka : BIXOLON
Model: SPP-R310
Kendi sitesinden
https://bixolon.com/_upload/manual/Manual_SPP-R310_Command_english_Rev_1_00.pdf indirip Adafruit-Thermal-Printer
kutuphanesindeki komutlarla karşılaştırdım bir fark yok.
Bu olayı nasıl aşabilirim nerde hata yapıyor veya nereyi gözden kacırıyor olabilirim.

Teşekkürler.

Kod:
BluetoothSerial SerialBT;
Adafruit_Thermal printer(&SerialBT);


  SerialBT.begin("ESP32-Master", true);        // master = true Bluetooth device name Bu cihazın kendi ismi.
  SerialBT.setPin(pin);
  Serial.println("Master Mode başliyoruz."); 
  connected = SerialBT.connect(address);
 
 
 
 
    printer.print(F("UPC-A:"));
    printer.printBarcode("123456789012", UPC_A);
    printer.feed(2);
/*---------------------------------------------------*/
        // EAN-13: 13 digits (same as JAN-13)
    printer.print(F("EAN-13:"));
    printer.printBarcode("1234567890123", EAN13);
    printer.feed(2);
/*---------------------------------------------------*/


    Serial.println("Set text justification (right, center, left) -- accepts 'L', 'C', 'R'");
    printer.justify('R');
    printer.println(F("Right justified"));
    printer.justify('C');
    printer.println(F("Center justified"));
    printer.justify('L');
    printer.println(F("Left justified"));
    
      // // Test more styles
    Serial.println("Test more styles");
    printer.boldOn();
    printer.println(F("Bold text"));
    printer.boldOff();
    
    printer.underlineOn();
    printer.println(F("Underlined text"));
    printer.underlineOff();
 
Barkodlarda rakam var mı yoksa direkt barkod çıktısı olarak mı veriyor?
 
1729080808049.png

Bu kütüphane 2 seri haberleşme pini gerektirir diyor. Bluetooth tarafında TX-RX pinleri kütüphaneye verilmeli. Problemin iki kütüphane arasında uygun bir kod bağlantısı olmaması.
 
SerialBT.setPin(pin);
Bu satır nedir? buraya eğil. pin değişkeni önceden tanımlanmış mı? nereden geliyor nereye gidiyor?
 
printeri esp32 yerine BT ile pc veya android cihazdan bağlanarak terminal komutları ile çalıştırmayı bir deneyin. önce komutlar netleşsin, ardından esp32 ile ilgili sorun varsa çözülür.
 
printeri esp32 yerine BT ile pc veya android cihazdan bağlanarak terminal komutları ile çalıştırmayı bir deneyin. önce komutlar netleşsin, ardından esp32 ile ilgili sorun varsa çözülür.
Hocam uygulamaya ilk başladığımda Serial Bluetooth Terminal programıyla deneme yapmış ve
sonuç alamamıştım. Her terminalden veri gönderdiğim zaman printer yazma işlemi yapıyor gibi işlem yapıyor ama boş basıyor.
Örnegin Terminalden Merhaba yazıp gönderdiğimde yazma sesi geliyor ve bir satır kağıdı kaydırıyor.
Yarın tekrar telefonla test edeceğim.

Not: PC deki testim ise
Sitesinden windows driver kurulumunu yaptım.
Word te Merhaba yazıp print ettiğimde ise kağıt boyutu sorunlu diyor ( Bu kısma değinmiyorum) Sonra printer edeceği zaman printerin kendi defaul ayarları ile mi yapayım diye msj geldikten sonra başka ekran acılıp ordan tamam dediğimde yazdırma işlemi gerçekleşiyor.
 
Zamaninda aliexpressden ben de bir tane bu tip yazici almistim. TTL serial calisiyordu. Sadece bir font tipi icin calistirabilmistim. Sen de tek tek dene.
 
Şimdi, bunu bir açıkla, kütüphanedeki barkodlar dediğin kısım nedir? Senin kodla arasındaki farklar neler? example klasöründeki kodlar mıdır?
Burda demek istediğim kutuphane icindeki barkod fonksiyonları görevini yapıyor.

Kod:
 printer.print(F("EAN-13:"));
 printer.printBarcode("1234567890123", EAN13);
kutuphane icindeki bu fonksiyon 1234567890123 şeklinde barkod oluşturup kağıda yazdırıyor.
Kod:
void Adafruit_Thermal::printBarcode(const char *text, uint8_t type) {
  feed(1); // Recent firmware can't print barcode w/o feed first???
  if (firmware >= 264)
    type += 65;
  writeBytes(ASCII_GS, 'H', 2);    // Print label below barcode
  writeBytes(ASCII_GS, 'w', 3);    // Barcode width 3 (0.375/1.0mm thin/thick)
  writeBytes(ASCII_GS, 'k', type); // Barcode type (listed in .h file)
  if (firmware >= 264) {
    int len = strlen(text);
    if (len > 255)
      len = 255;
    writeBytes(len); // Write length byte
    for (uint8_t i = 0; i < len; i++)
      writeBytes(text[i]); // Write string sans NUL
  } else {
    uint8_t c, i = 0;
    do { // Copy string + NUL terminator
      writeBytes(c = text[i++]);
    } while (c);
  }
  timeoutSet((barcodeHeight + 40) * dotPrintTime);
  prevByte = '\n';
}
fonksiyon iceriği ise yukardaki gibi.
 
bu printer için birileri mutlaka hazır bir app yazmıştır onu dene. donanımsal bir arıza olabilir, yazma kafası arızalıdır, elindeki kağıt sorunludur vs. boşuna olmadık yerlerde vaktini harcama.
 
bu printer için birileri mutlaka hazır bir app yazmıştır onu dene. donanımsal bir arıza olabilir, yazma kafası arızalıdır, elindeki kağıt sorunludur vs. boşuna olmadık yerlerde vaktini harcama.
Hocam nette o yazılan app ye şu ana kadar denk gelemedim. İnşaallah geleçeğim yada kendim birşeyler yapacağım.
Printerın arızalı olma ihtimali yok cunku aynı printer dan elimde 2 tane var hatta bir tanesinin kutusunu yeni actım. Self test olarak ve PC de Windows ortamında cıktı da veriyor.
 
Bu yazıcının arduino için bir protokolü yok. Dolayısıyla adafruit kütüphanesi değişiklik yapmadan çalıştırman zor. Var olan kütüphanelerde değişiklik yapman gerekli. BT bağlantısında bitrate nedir, gerçekten serial BT modu mu var, hepsi soru işareti.

En yakın yol, javascript ile boğuşmak.

Web yazdırma desteğim var demiş,
1729141626850.png

incele diyerek başladım,
Buton, printReciept js fonksiyonuna bağlanmış

1729141920581.png

konsoldan fonksiyonu çağırıyorum, çıkmaz sokağa çıkıyor. Fonksiyon sadece veri topluyor. Butona tıklayıp hata aldırarak neler var diye bakıyorum. Web servis üzerinden bir karşılık bekleyen koda çıkıyor. Yazıcı, JAVA da yazılmış bir sunucuyu işletim sisteminde çalıştırıyor, bu sunucudan web servis üzerinden yazdırmaya başlatıyor.
Kolay yol tükendi, JAVA kodlarını açıp bağlantı, yazdırma protokollerini kontrol ederek ESP için kod hazırlama kısmı başlıyor.

sayfasında arduino dışında diğer sistemler için SDK dosyaları var. Bunları çözümlemek gerekli.

Halen hangi kütüphane ile çıktı almayı başardığının cevabı gelmedi. Çıktı alamadım da demiyorsun. Ne diyorsun?
 
Kod:
Halen hangi kütüphane ile çıktı almayı başardığının cevabı gelmedi. Çıktı alamadım da demiyorsun. Ne diyorsun?
Hocam bu kısmı yukar da acıklamıştım. Gözden kaçmış olabilir mi ?
https://github.com/adafruit/Adafruit-Thermal-Printer-Library linkindeki.
Adafruit_Thermal.h
Adafruit_Thermal.cpp kutuphanesinin icindeki Barkod yazdırma fonksiyonları yazma işlemi yaptırıyor.

Kutuphanedeki void Adafruit_Thermal::.printBarcode(const char *text, uint8_t type)
 
Programın tamamı aşağıdaki gibidir.

printer.printBarcode("123456789012", UPC_A);
printer.feed(2);
Yalnızca bu iki fonksiyon kağıda cıktı verdiriyor. Diğer fonksiyonlar ise yazıyor gibi yapıp boş cıktı veriyor.

Kod:
#include "BluetoothSerial.h"
#include "Adafruit_Thermal.h"

BluetoothSerial SerialBT;
Adafruit_Thermal printer(&SerialBT);

uint8_t address[6]  = {0x74,0xF0,0x7D,0xEB,0x7B,0x6D};   // Bağlanılacak Cihaz MAC adresi Printer MAC 0x74,0xF0,0x7D,0xEB,0x7B,0x36
String name = "SPP-R310";                               //  Baglanılacak cihaz ismi.Printerin ismi.
const char *pin ="0000";
bool connected;

/*----------------------------------------------------
        Fonksiyon Prototip
-----------------------------------------------------*/
void print_Barcode(const char *text, uint8_t type);

/*----------------------------------------------------
        Setup
-----------------------------------------------------*/
void setup(){
  Serial.begin(115200);
  SerialBT.begin("ESP32-Master", true);        // master = true Bluetooth device name Bu cihazın kendi ismi.
  SerialBT.setPin(pin);                       // Printer bağlanmak icin pin kodu: 0000
  Serial.println("System başliyor."); 
  connected = SerialBT.connect(address);

  Serial.print("connected : ");
  Serial.println(connected);

  if(connected){
      Serial.println("Connected Succesfully!");
      Serial.println("Test printer begin");
      printer.begin(); 
/*---------------------------------------------------*/
      printer.print(F("UPC-A:"));
      printer.printBarcode("123456789012", UPC_A);
      printer.feed(2);  // Kagıdı 2 satır kaydırıyor.
/*---------------------------------------------------*/
      printer.print(F("EAN-13:"));
      printer.printBarcode("1234567890123", EAN13);
      printer.feed(2);
/*---------------------------------------------------*/
      printer.print(F("EAN-8:"));
      printer.printBarcode("12345678", EAN8);
      delay(1000);
      Serial.println("Looping...");
      printer.println(F("Looping..."));
      printer.feed(2);
      delay(1000);
      printer.feed(2);
 /*---------------------------------------------------*/
      Serial.println("Test printer Stop");
      printer.setFont('B');
      printer.println("FontB");
      printer.println("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
      printer.setFont('A');
      printer.println("FontA (default)");
      printer.println("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
  } else {
           while(!SerialBT.connected(1000)){
              Serial.println("Failed to connect. Make sure remote device is available and in range, then restart app.");
           }
        } 
}
/*----------------------------------------------------
        Loop
-----------------------------------------------------*/
void loop()
{
    delay(2000);
}
 
Senin durumunda sadece bu fonksiyon işe yarıyor, diğer font bilgileri yok.
C++:
void Adafruit_Thermal::writeBytes(uint8_t a) {
  timeoutWait();
  stream->write(a);
  timeoutSet(BYTE_TIME);
}

C++:
void Adafruit_Thermal::begin(uint16_t version) {

  firmware = version;

şeklinde bir başlatma kodu var, çalıştır, versiyon kısmında 264 üzeri verince davranışı nasıl test et, 260 ver test et.
264, 268 sürümleri için içerde epey ayrım var.

Kütüphanede, print, println fonksiyonları tanımlı değil. Kütüphanede :: print araması yapınca resim ve barkod kodları çıkıyor. println fonksiyonu yönetilmemiş. Bu durumda font oluşturman gerekecek, fontları resim içinde saklayıp yazdıracaksın.
 
Son düzenleme:
C++:
// ASCII codes used by some of the printer config commands:
#define ASCII_TAB '\t' //!< Horizontal tab
#define ASCII_LF '\n'  //!< Line feed
#define ASCII_FF '\f'  //!< Form feed
#define ASCII_CR '\r'  //!< Carriage return
#define ASCII_DC2 18   //!< Device control 2
#define ASCII_ESC 27   //!< Escape
#define ASCII_FS 28    //!< Field separator
#define ASCII_GS 29    //!< Group separator

Adafruit kütüphanesinde sadece bunlar tanımlanmış.
1729146191685.png

Buradaki kontrol kodlarını define içine alıp writeBytes ile yollayacaksın.
writeBytes(0x0a) yollayınca düz yazı yazma moduna geçiyor mu test et.
Örnekler içinde
1729146392639.png

Bu Example bölümleri içindeki hex değerleri writeBytes ile yollarayarak test et. Hangi kodda text yollanıyorsa kendi print, println fonksiyonlarını oluştur.
 

Forum istatistikleri

Konular
6,734
Mesajlar
114,835
Üyeler
2,756
Son üye
Sagankam

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Back
Top