Термопринтер

Термопринтер - позволяет печатать текст (включая русский), штрих-коды и изображения на чековых лентах из термальной бумаги стандартной ширины 57 мм и диаметром рулона до 36 мм.

Видео:

редактируется

Общие сведения:

Термопринтер использует прямую термическую печать для формирования изображений на чувствительном к теплу материале. Для печати текста можно выбрать различные кодировки, в т.ч. и кириллические. Можно выбрать начертание текста, менять его размеры и инвертировать цвет текст/фон. Штрих-коды печатаются в различных форматах. Графика выводится прямой печатью растровых изображений.

Светодиод на корпусе термопринтера информирует о его состоянии: не горит - выключен, редко мигает - активен, постоянно горит - спящий режим. Нажатие на кнопку принтера приведёт к прокрутке кассовой ленты приблизительно на 3 стандартные строки. Если удерживать кнопку принтера при подаче питания, он распечатает тестовую страницу, как при вызове функции testPage().

Спецификация:

  • Напряжение питания: 5-9 В (постоянного тока)
  • Потребляемый ток: до 1,5 А (в режиме печати)
  • Потребляемый ток: до 10 мА (в режиме ожидания)
  • Интерфейс: TTL UART скорость 9600 бит/сек
  • Метод печати: прямая термическая печать
  • Режимы печати: печать текста, печать штрих-кодов, прямая печать растровых изображений
  • Тип бумаги: термальная
  • Ширина бумаги: 57 мм
  • Диаметр рулона: 36 мм
  • Скорость печати: до 80 мм/с
  • Ширина печати: 48 мм
  • Размер пикселя: 1/8 мм
  • Разрешение печати: 203DPI (8 точек на мм = 384 точек на линию)
  • Таблицы символов: ASCII, набор GB2312-80.
  • Набор GB2312-80 включает следующие таблицы: CP437, KATAKANA, CP850, CP860, CP863, CP865, WCP1251, CP866, MIK, CP755, IRAN, CP862, WCP1252, WCP1253, CP852, CP858, IRAN2, LATVIAN, CP864, ISO_8859_1, CP737, WCP1257, THAI, CP720, CP855, CP857, WCP1250, CP775, WCP1254, WCP1255, WCP1256, WCP1258, ISO_8859-..., ISO_8859-5, THAI2, CP856, CP874. Подчёркнуты таблицы с поддержкой кириллицы.
  • Форматы штрих-кодов: UPC_A, UPC_E, EAN13, EAN8, CODE39, CODE93, ITF, CODABAR и CODE128
  • Рабочая температура: +5...+45 °С
  • Температура хранения: -20...+60 °С
  • Габариты:111x65x59 мм

Подключение:

Термопринтер подключается к шине UART, можно использовать как аппаратную так и программную шины Arduino.

  • синий провод RX UART (вход данных в принтер от Arduino) - подключается к выводу TX Arduino, либо аппаратному UATR (указанному), либо программному UART (назначаемому).
  • зелёный провод TX UART (выход данных из принтера в Arduino) - подключается к выводу RX Arduino, либо аппаратному UART (указанному), либо программному UART (назначаемому).
  • черный провод GND - подключается в выводу GND Arduino и «-» источника питания.
  • красный провод Vin - подключается к «+» источника питания.
  • желтый провод DTR UART (готовность) - не используется. О подключении этого провода написано в разделе «Дополнительно», в конце настоящей статьи.

Для работы скетчей, представленных в примерах ниже, принтер подключается к программной шине UART, как показано на картинке:

Подключение термопринтера к Arduino UNO

Питание:

Не подключайте вывод Vcc Arduino к красному проводу принтера! Для питания принтера лучше использовать отдельный источник питания.

Входное напряжение питания 5-9 В постоянного тока подаётся на красный (+) и чёрный (GND) провод принтера. Обратите внимание на то что черный провод подключается и к минусу источника питания и к GND Arduino.

Работа с принтером:

Для работы с термопринтером предлагаем воспользоваться библиотекой Adafruit_Thermal, которая позволяет печатать текст, графику и штрих-коды. Функции библиотеки описаны ниже. Перед началом работы установите кассовую ленту и закройте крышку принтера. Принтер не будет печатать без кассовой ленты. Открытие крышки отсека чековой ленты осуществляется путём поднятия рычага рядом с крышкой.

Ниже представлены несколько скетчей раскрывающих основные возможности термопринтера.

Примеры:

В качестве примера распечатаем текст используя различные начертания, распечатаем русский текст (к нему так же можно применить различные начертания), распечатаем несколько штрих-кодов, картинку и т.д. Предлагаем Вам сначала подключить термопринтер, загрузить скетч, а за тем смотреть на распечатанный лист и на комментарии к строкам скетча. Так будет нагляднее и легче разобраться в назначении используемых функций. Все скетчи, описанные ниже, доступны в примерах библиотеки Adafruit_Thermal.

Вывод текста с изменением его размера, начертания и других параметров:
#include         <SoftwareSerial.h>                   //  Подключаем библиотеку для работы по программной шине UART
#include         <Adafruit_Thermal.h>                 //  Подключаем библиотеку для работы с принтером
SoftwareSerial   mySerial(5, 6);                      //  Объявляем объект библиотеки SoftwareSerial, указывая задействованные выводы Arduino (RX=5-зелёный, TX=6-синий). Можно назначить другие выводы Arduino
Adafruit_Thermal printer(&mySerial);                  //  Объявляем объект библиотеки Adafruit_Thermal, указывая ссылку на созданный ранее объект mySerial библиотеки SoftwareSerial
                                                      //
void setup(){                                         //  Код функции setup выполняется только 1 раз, при старте скетча
    mySerial.begin(9600);                             //  Инициируем передачу данных по программной шине UART на скорости 9600. Функцию begin объекта mySerial нужно вызвать до вызова функции begin объекта printer!
    printer.begin();                                  //  Инициируем работу с термопринтером. В качестве параметра можно указать время нагрева пикселей от 3 (0,03 мс) до 255 (2,55 мс), чем выше тем темнее пикселы. Значение по умолчанию = 120 (1,20 мс)
                                                      //
    printer.setSize('L');                             //  Устанавливаем крупный размер шрифта 'L' (Large)
    printer.println("Large");                         //  Выводим текст
    printer.setSize('M');                             //  Устанавливаем средний размер шрифта 'M' (Medium)
    printer.println("Medium");                        //  Выводим текст
    printer.setSize('S');                             //  Устанавливаем маленький размер шрифта 'S' (Small) - используется по умолчанию
    printer.println("Small");                         //  Выводим текст
                                                      //
    printer.justify('R');                             //  Устанавливаем выравнивание текста по правому краю 'R' (Right)
    printer.println("Right");                         //  Выводим текст
    printer.justify('C');                             //  Устанавливаем выравнивание текста по центру 'C' (Center)
    printer.println("Center");                        //  Выводим текст
    printer.justify('L');                             //  Устанавливаем выравнивание текста по левому краю 'L' (Left) - используется по умолчанию
    printer.println("Left");                          //  Выводим текст
                                                      //
    printer.inverseOn();                              //  Устанавливаем инверсию цвета текста.
    printer.println("Inverse");                       //  Выводим текст
    printer.inverseOff();                             //  Отменяем инверсию цвета текста.
                                                      //
    printer.doubleHeightOn();                         //  Устанавливаем удвоенную высоту текста.
    printer.println("Double Height");                 //  Выводим текст
    printer.doubleHeightOff();                        //  Отменяем удвоенную высоту текста.
                                                      //
    printer.doubleWidthOn();                          //  Устанавливаем удвоенную ширину текста.
    printer.println("Double Width");                  //  Выводим текст
    printer.doubleWidthOff();                         //  Отменяем удвоенную ширину текста.
                                                      //
    printer.boldOn();                                 //  Устанавливаем полужирное начертание текста.
    printer.println("Bold");                          //  Выводим текст
    printer.boldOff();                                //  Отменяем полужирное начертание текста.
                                                      //
    printer.underlineOn();                            //  Устанавливаем подчёркивание текста линией в 1 пиксель. Равнозначно вызову функции с параметром 1: printer.underlineOn(1);
    printer.println("Underline 1px");                 //  Выводим текст
    printer.underlineOn(2);                           //  Устанавливаем подчёркивание текста линией в 2 пикселя.
    printer.println("Underline 2px");                 //  Выводим текст
    printer.underlineOff();                           //  Отменяем подчёркивание текста.
                                                      //
    printer.setLineHeight(25);                        //  Устанавливаем межстрочный интервал в 2,5 мм. В качестве параметра можно указать интервал от 24 (2,4 мм) до 32767. Значение по умолчанию = 30 (3,0 мм)
    printer.println("1\r\n2\r\n3");                   //  Выводим 3 строки текста
    printer.setLineHeight(60);                        //  Устанавливаем межстрочный интервал в 6,0 мм.
    printer.println("4\r\n5\r\n6");                   //  Выводим 3 строки текста
    printer.setLineHeight();                          //  Устанавливаем межстрочный в значение по умолчанию (3,0 мм)
                                                      //
    printer.setCharSpacing(10);                       //  Устанавливаем дополнительный межсимвольный интервал в 10 пикселов. В качестве параметра можно указать интервал от 0 до 32767 пикселей. Значение по умолчанию = 0
    printer.println("CharSpacing");                   //  Выводим текст
    printer.setCharSpacing();                         //  Отменяем дополнительный межсимвольный интервал. Равнозначно вызову функции с параметром 0: printer.setCharSpacing(0);
                                                      //
    printer.tab();                                    //  Устанавливаем отступ (табуляцию).
    printer.println("<- Tabulation");                 //  Выводим текст
                                                      //
    printer.feedRows(10);                             //  Прокручиваем кассовую ленту на 10 пикселей. В качестве параметра можно указать от 0 до 255 пикселей.
                                                      //
    if(printer.hasPaper()){                           //  Если кассовая лента установлена (есть бумага), то ...
        printer.println("Paper OK");                  //  Выводим текст
    }else{                                            //  Если кассовая лента отсутствует (нет бумаги), то ...
                                                      //  Тут можно, например, включить внешний светодиод или звуковой сигнал сигнализирующий об окончании кассовой ленты
    }                                                 //
                                                      //
    printer.setDefault();                             //  Устанавливаем настройки принтера по умолчанию. Функцию удобно использовать если Вы желаете вывести текст, но хотите быть уверены что на него не повлияют ранее установленные размеры или начертания.
    printer.feed(3);                                  //  Прокручиваем ленту на 3 строки
}                                                     //
                                                      //
void loop(){}                                         //
Вывод текста на русском языке:
#include         <SoftwareSerial.h>                   //  Подключаем библиотеку для работы по программной шине UART
#include         <Adafruit_Thermal.h>                 //  Подключаем библиотеку для работы с принтером
SoftwareSerial   mySerial(5, 6);                      //  Объявляем объект библиотеки SoftwareSerial, указывая задействованные выводы Arduino (RX=5-зелёный, TX=6-синий). Можно назначить другие выводы Arduino
Adafruit_Thermal printer(&mySerial);                  //  Объявляем объект библиотеки Adafruit_Thermal, указывая ссылку на созданный ранее объект mySerial библиотеки SoftwareSerial
char*            RUS(char*);                          //  Объявляем функцию перевода русских символов из кодировки UTF-8 в кодировку CP866
                                                      //
void setup(){                                         //  Код функции setup выполняется только 1 раз, при старте скетча
    mySerial.begin(9600);                             //  Инициируем передачу данных по программной шине UART на скорости 9600. Функцию begin объекта mySerial нужно вызвать до вызова функции begin объекта printer!
    printer.begin();                                  //  Инициируем работу с термопринтером. В качестве параметра можно указать время нагрева пикселей от 3 (0,03 мс) до 255 (2,55 мс), чем выше тем темнее пикселы. Значение по умолчанию = 120 (1,20 мс)
    printer.setCodePage(CODEPAGE_CP866);              //  Устанавливаем кодовую таблицу CP866 с поддержкой русского языка
//  Прямой вывод:                                     //
    printer.println(RUS("Hello World - Привет Мир")); //  Выводим текст на принтер. Функция RUS преобразует русские символы, а остальные вернёт как есть, без преобразований
//  Вывод из переменной text1:                        //
    char text1[]="Текст в переменной text1";          //  Определяем переменную text1
    RUS(text1);                                       //  Функция RUS преобразует русские символы переменной text1 и сохранит их в той же переменной
    printer.println(text1);                           //  Выводим преобразованный текст на принтер
//  Вывод из переменной text2:                        //
    char text2[]="Текст в переменной text2";          //  Определяем переменную text2
    printer.println(RUS(text2));                      //  Функция RUS преобразует русские символы переменной text2
                                                      //
    printer.feed(3);                                  //  Прокручиваем ленту на 3 строки
}                                                     //
                                                      //  Вы можете применять различные стили начертания и размеры шрифта при выводе его на термопринтер.
void loop(){}                                         //
                                                      //
char* RUS(char* str){                                                                                                                      // Определяем функцию которая преобразует код русских символов из кодировки UTF-8 в кодировку CP866
    uint8_t i=0, j=0;                                                                                                                      // Определяем переменные: i - счетчик входящих символов, j - счетчик исходящих символов
    while(str[i]){                                                                                                                         // Проходим по всем символам строки str, пока не встретим символ конца строки (код 0)
        if(uint8_t(str[i]) == 0xD0 && uint8_t(str[i+1]) >= 0x90 && uint8_t(str[i+1]) <= 0xBF ){str[j] = (uint8_t) str[i+1]-0x10; i++;}else // Символы «А-Я а-п» (код UTF-8: D090-D0AF D0B0-D0BF) сохраняем в кодировке CP866: код 80-9F A0-AF (символ занимал 2 байта, а стал занимать 1 байт)
        if(uint8_t(str[i]) == 0xD1 && uint8_t(str[i+1]) >= 0x80 && uint8_t(str[i+1]) <= 0x8F ){str[j] = (uint8_t) str[i+1]+0x60; i++;}else // Символы «р-я»     (код UTF-8: D180-D18F)           сохраняем в кодировке CP866: код E0-EF       (символ занимал 2 байта, а стал занимать 1 байт)
        if(uint8_t(str[i]) == 0xD0 && uint8_t(str[i+1]) == 0x81                              ){str[j] = 0xF0;                    i++;}else // Символ «Ё»        (код UTF-8: D081)                сохраняем в кодировке CP866: код F0          (символ занимал 2 байта, а стал занимать 1 байт)
        if(uint8_t(str[i]) == 0xD1 && uint8_t(str[i+1]) == 0x91                              ){str[j] = 0xF1;                    i++;}else // Символ «ё»        (код UTF-8: D191)                сохраняем в кодировке CP866: код F1          (символ занимал 2 байта, а стал занимать 1 байт)
                                                                                              {str[j] = (uint8_t) str[i];}  j++; i++;      // Остальные символы оставляем как есть, без преобразования, но их место в строке могло сдвинуться, если до них были встречены русские символы
    }   while(j<i){str[j]=0; j++;} return str;                                                                                             // Так как место занимаемое символами в строке могло уменьшиться, заполняем оставщиеся байты символами конца строки (код 0)
}
Вывод штрихкодов:
#include         <SoftwareSerial.h>                   //  Подключаем библиотеку для работы по программной шине UART
#include         <Adafruit_Thermal.h>                 //  Подключаем библиотеку для работы с принтером
SoftwareSerial   mySerial(5, 6);                      //  Объявляем объект библиотеки SoftwareSerial, указывая задействованные выводы Arduino (RX=5-зелёный, TX=6-синий). Можно назначить другие выводы Arduino
Adafruit_Thermal printer(&mySerial);                  //  Объявляем объект библиотеки Adafruit_Thermal, указывая ссылку на созданный ранее объект mySerial библиотеки SoftwareSerial
                                                      //
void setup(){                                         //  Код функции setup выполняется только 1 раз, при старте скетча
    mySerial.begin(9600);                             //  Инициируем передачу данных по программной шине UART на скорости 9600. Функцию begin объекта mySerial нужно вызвать до вызова функции begin объекта printer!
    printer.begin();                                  //  Инициируем работу с термопринтером. В качестве параметра можно указать время нагрева пикселей от 3 (0,03 мс) до 255 (2,55 мс), чем выше тем темнее пикселы. Значение по умолчанию = 120 (1,20 мс)
                                                      //
    printer.print(F("UPC-A:"));                       //  Выводим текст с названием формата штрих-кода
    printer.printBarcode("123456789012", UPC_A);      //  Выводим штрих-код в формате UPC_A.                                В данном формате используются 12 цифр
                                                      //
    printer.print(F("EAN-13:"));                      //  Выводим текст с названием формата штрих-кода
    printer.printBarcode("1234567890123", EAN13);     //  Выводим штрих-код в формате EAN-13, аналогичен формату JAN-13.    В данном формате используются 13 цифр
                                                      //
    printer.print(F("EAN-8:"));                       //  Выводим текст с названием формата штрих-кода
    printer.printBarcode("12345678", EAN8);           //  Выводим штрих-код в формате EAN-8, аналогичен формату JAN-8.      В данном формате используются 8 цифр
                                                      //
    printer.print(F("CODE 39:"));                     //  Выводим текст с названием формата штрих-кода
    printer.printBarcode("IARDUINO", CODE39);         //  Выводим штрих-код в формате CODE 39                               В данном формате можно использовать от 2 до 255 цифр и заглавных латинских букв
                                                      //
    printer.print(F("CODE 93:"));                     //  Выводим текст с названием формата штрих-кода
    printer.printBarcode("IARDUINO.RU", CODE93);      //  Выводим штрих-код в формате CODE 93                               В данном формате можно использовать от 2 до 255 цифр, заглавных латинских букв, пробелы, и знаки *.:$%/+-
                                                      //
    printer.print(F("ITF:"));                         //  Выводим текст с названием формата штрих-кода
    printer.printBarcode("1234567890", ITF);          //  Выводим штрих-код в формате ITF                                   В данном формате можно использовать от 2 до 255 цифр
                                                      //
    printer.print(F("CODABAR:"));                     //  Выводим текст с названием формата штрих-кода
    printer.printBarcode("1234567890", CODABAR);      //  Выводим штрих-код в формате CODABAR                               В данном формате можно использовать от 2 до 255 цифр, заглавных латинских букв, и знаки .:%/+-
                                                      //
    printer.print(F("CODE128:"));                     //  Выводим текст с названием формата штрих-кода
    printer.printBarcode("iArduino", CODE128);        //  Выводим штрих-код в формате CODE 128                              В данном формате можно использовать от 2 до 255 символов коды которых лежат в диапазоне от 0 до 127 таблицы символов ASCII
                                                      //
    printer.feed(3);                                  //  Прокручиваем ленту на 3 строки
}                                                     //
                                                      //
void loop(){}                                         //
Вывод графики:

Для создания массивов данных из изображений предлагаем воспользоваться программой LCDAssistant из папки extras библиотеки Adafruit_Thermal. Описание работы с данной программой приведено ниже.

#include         <SoftwareSerial.h>                   //  Подключаем библиотеку для работы по программной шине UART
#include         <Adafruit_Thermal.h>                 //  Подключаем библиотеку для работы с принтером
SoftwareSerial   mySerial(5, 6);                      //  Объявляем объект библиотеки SoftwareSerial, указывая задействованные выводы Arduino (RX=5-зелёный, TX=6-синий). Можно назначить другие выводы Arduino
Adafruit_Thermal printer(&mySerial);                  //  Объявляем объект библиотеки Adafruit_Thermal, указывая ссылку на созданный ранее объект mySerial библиотеки SoftwareSerial
static const uint8_t PROGMEM logo[]={                 //  Определяем массив хранящий данные выводимого изображения
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,          //  Высота изображения может быть любой, а количество пикселей по ширине должно быть кратно 8
    0xFF,0xF8,0x1F,0xFF,0xFF,0xFB,0xDF,0xFF,          //  Каждый бит каждого байта массива это очередной пиксель изображения (0-белый, 1-чёрный)
    0xFF,0xFB,0xDF,0xFF,0xE0,0x03,0xC0,0x07,          //  В данном случае мы будем выводить небольшое изображение размером 32x20 пикселей (32 по ширине, 20 по высоте). Это логотип iarduino.
    0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x07,          //  Количество пикселей в данном изображении = 32 * 20 = 640. Каждый пиксель это бит, в одном байте 8 бит, значит в массиве должно быть 80 байт ( 640 / 8 ).
    0xE0,0x00,0x00,0x07,0x00,0x00,0x00,0x00,          //  Изображение формируется построчно слева направо, сверху вниз
    0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x07,          //  Пиксели выводятся в строку начиная со старшего бита первого байта настоящего массива
    0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x07,          //  После того как в одну строку будет веведено количество бит (пикселей) равное ширине изображения (в данном случае 32), то принтер перейдёт к выводу следующей строки изображения
    0xE1,0xE0,0x07,0x87,0xFD,0xEE,0x77,0xBF,          //  Изображение будет выводиться пока количество выведенных строк не достигнет значения высоты изображения (в данном случае 20)
    0xFD,0xEE,0x77,0xBF,0xFC,0x0E,0x70,0x3F,          //  Определение массивов для больших изображений снижает удобочитаемость скетча, по этому их можно вынести в отдельный подключаемый файл
    0xFF,0xFE,0x7F,0xFF,0xFF,0xFE,0x7F,0xFF};         //  Попробуйте сохранить определение данного массива в файл «iarduino_logo.h», файл должен находиться в той же папке что и скетч, а в скетч, вместо определения массива, вставьте строку: #include "logo_iarduino.h" без точки с запятой в конце строки
                                                      //
void setup(){                                         //  Код функции setup выполняется только 1 раз, при старте скетча
    mySerial.begin(9600);                             //  Инициируем передачу данных по программной шине UART на скорости 9600. Функцию begin объекта mySerial нужно вызвать до вызова функции begin объекта printer!
    printer.begin();                                  //  Инициируем работу с термопринтером. В качестве параметра можно указать время нагрева пикселей от 3 (0,03 мс) до 255 (2,55 мс), чем выше тем темнее пикселы. Значение по умолчанию = 120 (1,20 мс)
    printer.printBitmap(32, 20, logo);                //  Печать изображения (логотипа iarduino) размером 32x20 пикселей из массива logo
    printer.feed(3);                                  //  Прокручиваем ленту на 3 строки
}                                                     //
                                                      //  Если напечатанные изображения слишком светлые, то перед функцией printer.printBitmap(...) вызовите функцию printer.begin(255) - греть пикселы 2.55 мс
void loop(){}                                         //  А после функции printer.printBitmap(...) опять вызовите printer.begin() но уже без параметра - греть пикселы по умолчанию.
Вывод информационного листа:

В этом примере подключается файл «logo_iarduino.h» хранящий массив с изображением логотипа iarduino размером 320x68. Этот файл и файл скетча можно найти в папке examples/Preview библиотеки Adafruit_Thermal.

#include <SoftwareSerial.h>                                                                                                                //  Подключаем библиотеку для работы по программной шине UART
#include <Adafruit_Thermal.h>                                                                                                              //  Подключаем библиотеку для работы с принтером
SoftwareSerial  mySerial(5, 6);                                                                                                            //  Объявляем объект библиотеки SoftwareSerial, указывая задействованные выводы Arduino (RX=5-зелёный, TX=6-синий)
Adafruit_Thermal printer(&mySerial);                                                                                                       //  Объявляем объект библиотеки Adafruit_Thermal, указывая ссылку на созданный ранее объект библиотеки SoftwareSerial
#include "logo_iarduino.h"                                                                                                                 //  Подключаем файл с массивом для печати логотипа
//  Функция преобразования русских символов из формата UTF-8 в формат CP866                                                                //
char* RUS(char* str){                                                                                                                      //  Определяем функцию которая преобразует код русских символов из кодировки UTF-8 в кодировку CP866
    uint8_t i=0, j=0;                                                                                                                      //  Определяем переменные: i - счетчик входящих символов, j - счетчик исходящих символов
    while(str[i]){                                                                                                                         //  Проходим по всем символам строки str, пока не встретим символ конца строки (код 0)
        if(uint8_t(str[i]) == 0xD0 && uint8_t(str[i+1]) >= 0x90 && uint8_t(str[i+1]) <= 0xBF ){str[j] = (uint8_t) str[i+1]-0x10; i++;}else //  Символы «А-Я а-п» (код UTF-8: D090-D0AF D0B0-D0BF) сохраняем в кодировке CP866: код 80-9F A0-AF (символ занимал 2 байта, а стал занимать 1 байт)
        if(uint8_t(str[i]) == 0xD1 && uint8_t(str[i+1]) >= 0x80 && uint8_t(str[i+1]) <= 0x8F ){str[j] = (uint8_t) str[i+1]+0x60; i++;}else //  Символы «р-я»     (код UTF-8: D180-D18F)           сохраняем в кодировке CP866: код E0-EF       (символ занимал 2 байта, а стал занимать 1 байт)
        if(uint8_t(str[i]) == 0xD0 && uint8_t(str[i+1]) == 0x81                              ){str[j] = 0xF0;                    i++;}else //  Символ «Ё»        (код UTF-8: D081)                сохраняем в кодировке CP866: код F0          (символ занимал 2 байта, а стал занимать 1 байт)
        if(uint8_t(str[i]) == 0xD1 && uint8_t(str[i+1]) == 0x91                              ){str[j] = 0xF1;                    i++;}else //  Символ «ё»        (код UTF-8: D191)                сохраняем в кодировке CP866: код F1          (символ занимал 2 байта, а стал занимать 1 байт)
                                                                                              {str[j] = (uint8_t) str[i];}  j++; i++;      //  Остальные символы оставляем как есть, без преобразования, но их место в строке могло сдвинуться, если до них были встречены русские символы
    }   while(j<i){str[j]=0; j++;} return str;                                                                                             //  Так как место занимаемое символами в строке могло уменьшиться, заполняем оставщиеся байты символами конца строки (код 0)
}                                                                                                                                          //
                                                                                                                                           //
void setup(){                                                                                                                              //
    mySerial.begin(9600);                                                                                                                  //  Инициируем передачу данных по программной шине UART на скорости 9600. Функцию begin объекта mySerial нужно вызвать до вызова функции begin объекта printer!
    printer.begin();                                                                                                                       //  Инициируем работу с термопринтером. В качестве параметра можно указать время нагрева пикселей от 3 (0,03 мс) до 255 (2,55 мс), чем выше тем темнее пикселы. Значение по умолчанию = 120 (1,20 мс)
    printer.setCodePage(CODEPAGE_CP866);                                   printer.println(    "________________________________" );       //  Печатаем строку из нижних подчёркиваний, предварительно установив кодовую страницу CP866 с поддержкой кириллицы.
    printer.boldOn();  printer.setSize('L'); printer.justify('C');         printer.println(RUS("Термопринтер"                    ));       //  Печатаем текст установив полужирное начертание, крупный размер шрифта с выравниванием по центру
    printer.boldOff(); printer.setSize('S'); printer.justify('L');         printer.println(RUS("технология прямой термопечати на"));       //  Печатаем текст отключив полужирное начертнание и установив маленький размер шрифт с выравниванием по левому краю
                                                                           printer.println(RUS("чек. лентах из термальной бумаги"));       //  Печатаем текст, предыдущие настройки (нормальное начертание, маленький размер и выравнивание по левому краю) сохраняется
    printer.setCodePage(CODEPAGE_KATAKANA);                                printer.println(RUS("ББББББББББББББББББББББББББББББББ"));       //  Печатаем строку из символов «Б», но так как мы предварительно установили кодовую страницу KATAKANA, то вместо символа «Б» напечатается символ напоминающий жирное подчёркивание
    printer.setCodePage(CODEPAGE_CP866);                                   printer.println(RUS("Напряжение питания: 5-9В до 1,5А"));       //  Печатаем текст предварительно установив кодовую страницу CP866 с поддержкой кириллицы.
                                                                           printer.println(RUS("Интерфейс: TTL UART 9600 бит/сек"));       //  Печатаем текст
                                                                           printer.println(RUS("Скорость печати: до 80 мм/с"     ));       //  Печатаем текст
                                                                           printer.println(RUS("Размер пикселя: 1/8 мм"          ));       //  Печатаем текст
                                                                           printer.println(RUS("Разрешение: 203DPI (384 т/лин)"  ));       //  Печатаем текст
                                                                           printer.println(RUS("Ширина чековой ленты: 57 мм"     ));       //  Печатаем текст
                                                                           printer.println(RUS("Печать: текст, штрих-коды, растр"));       //  Печатаем текст
                                                                           printer.println(RUS("Таблицы: ASCII, набор GB2312-80" ));       //  Печатаем текст
                                                                           printer.println(RUS("Штрих-коды: 11 форматов"         ));       //  Печатаем текст
                                                                           printer.println(RUS("Растр: прямая печать изображений"));       //  Печатаем текст
    printer.setCodePage(CODEPAGE_KATAKANA);                                printer.println(RUS("ББББББББББББББББББББББББББББББББ"));       //  Печатаем строку из символов «Б», но так как мы предварительно установили кодовую страницу KATAKANA, то вместо символа «Б» напечатается символ напоминающий жирное подчёркивание
    printer.setCodePage(CODEPAGE_CP866);                                   printer.println(RUS("Таблица символов CODEPAGE_CP866:"));       //  Печатаем текст предварительно установив кодовую страницу CP866 с поддержкой кириллицы.
    printer.feed(); printer.tab(); printer.underlineOn(2);                 printer.println(RUS("    01234567 89ABCDEF"           ));       //  Печатаем текст предварительно прокрутив ленту на одну строку, установив табуляцию (отступ от левого края) и начертание текста с подчёриванием
    for(uint8_t i=0x2; i<=0xF; i++){printer.tab(); printer.underlineOff(); printer.print  (i,HEX); printer.print(" - ");                   //  Выполняем цикл от 2 до 15 включительно (для вывода строк с символами из установленной таблицы символов CP866)
    for(uint8_t j=0x0; j<=0xF; j++){printer.write(i*16+j); if(j==0x7){     printer.print  (" ");}} printer.feed();}  printer.feed();       //  Выполняем цикл от 0 до 15 включительно (для вывода самих символов в очередной строке)
    printer.setCodePage(CODEPAGE_KATAKANA);                                printer.println(RUS("ББББББББББББББББББББББББББББББББ"));       //  Печатаем строку из символов «Б», но так как мы предварительно установили кодовую страницу KATAKANA, то вместо символа «Б» напечатается символ напоминающий жирное подчёркивание
    printer.feed(); printer.begin(255);                                    printer.printBitmap(320,68, logo_print); printer.begin();       //  Печатаем изображение (логотипа iarduino) размером 32x20 пикселей из массива logo_print предварительно изменив время нагрева пикселей до 2,55 мс, а потом установив его обратно в значение по умолчанию
    printer.setCodePage(CODEPAGE_CP866);                                   printer.feed();                                                 //  Устанавливаем кодовую страницу CP866 с поддержкой кириллицы (так как она сбросилась после вызова функций begin) и прокручиваем чек на 1 строку
    printer.justify('C'); printer.doubleHeightOn();                        printer.println(RUS("СПАСИБО ЗА ПОКУПКУ!"             ));       //  Печатаем текст предварительно установив выравнивание по центру и двойную высоту шрифта
    printer.setDefault(); printer.feed(3);                                                                                                 //  Устанавливаем настройки принтера по умолчанию и прокручиваем ленту на 3 строки
}                                                                                                                                          //
                                                                                                                                           //
void loop(){}                                                                                                                              //
Вывод таблицы из символов:

В этом скетче, символы из которых состоит таблица, выводятся функцией printer.write( КОД_СИМВОЛА ) которая принимает код в качестве аргумента. Коды символов можно посмотреть на информационном листе, который можно распечатать используя предыдущий скетч.

#include         <SoftwareSerial.h>                   //  Подключаем библиотеку для работы по программной шине UART
#include         <Adafruit_Thermal.h>                 //  Подключаем библиотеку для работы с принтером
SoftwareSerial   mySerial(5, 6);                      //  Объявляем объект библиотеки SoftwareSerial, указывая задействованные выводы Arduino (RX=5-зелёный, TX=6-синий). Можно назначить другие выводы Arduino
Adafruit_Thermal printer(&mySerial);                  //  Объявляем объект библиотеки Adafruit_Thermal, указывая ссылку на созданный ранее объект mySerial библиотеки SoftwareSerial
char*            RUS(char*);                          //  Объявляем функцию перевода русских символов из кодировки UTF-8 в кодировку CP866
                                                      //
void setup(){                                         //  Код функции setup выполняется только 1 раз, при старте скетча
    mySerial.begin(9600);                             //  Инициируем передачу данных по программной шине UART на скорости 9600. Функцию begin объекта mySerial нужно вызвать до вызова функции begin объекта printer!
    printer.begin();                                  //  Инициируем работу с термопринтером. В качестве параметра можно указать время нагрева пикселей от 3 (0,03 мс) до 255 (2,55 мс), чем выше тем темнее пикселы. Значение по умолчанию = 120 (1,20 мс)
    printer.setCodePage(CODEPAGE_CP866);              //  Устанавливаем кодовую таблицу CP866 с поддержкой русского языка
    printer.setLineHeight(24);                        //  Устанавливаем межстрочный интервал в 2,4 мм (равен высоте текста), чтоб вертикальные линии таблицы не имели промежутков
    printer.write(0xC9);                              //  Выводим символ ╔
    for(int i=0; i<29; i++){printer.write(0xCD);}     //  Выводим символ ═ в цикле (29 символов в одной строке). Ширина таблицы 31 символ, а не 32 (максимальное число символов в строке), для того что бы ячейки таблицы были одинаковой ширины
    printer.write(0xBB);                              //  Выводим символ ╗
    printer.feed();                                   //  Прокручиваем ленту на 1 строку, для перехода на новую строку. В этом месте можно было бы написать printer.println("") или printer.print("\r\n"), но printer.feed() действует быстрее
    printer.write(0xBA);                              //  Выводим символ ║
    for(int i=0; i<9; i++){printer.write(0x20);}      //  Выводим пробел в цикле (9 пробелов в одной строке)
    printer.print(RUS("IARDUINO.RU"));                //  Выводим текст без перехода на новую строку
    for(int i=0; i<9; i++){printer.write(0x20);}      //  Выводим пробел в цикле (9 пробелов в одной строке)
    printer.write(0xBA);                              //  Выводим символ ║
    printer.feed();                                   //  Прокручиваем ленту на 1 строку, для перехода на новую строку. В этом месте можно было бы написать printer.println("") или printer.print("\r\n"), но printer.feed() действует быстрее
    printer.write(0xCC);                              //  Выводим символ ╠
    for(int i=0; i<14; i++){printer.write(0xCD);}     //  Выводим символ ═ в цикле (14 символов в одной строке)
    printer.write(0xD1);                              //  Выводим символ ╤
    for(int i=0; i<14; i++){printer.write(0xCD);}     //  Выводим символ ═ в цикле (14 символов в одной строке)
    printer.write(0xB9);                              //  Выводим символ ╣
    printer.feed();                                   //  Прокручиваем ленту на 1 строку, для перехода на новую строку. В этом месте можно было бы написать printer.println("") или printer.print("\r\n"), но printer.feed() действует быстрее
    printer.write(0xBA);                              //  Выводим символ ║
    for(int i=0; i<5; i++){printer.write(0x20);}      //  Выводим пробел в цикле (5 пробелов в одной строке)
    printer.print(RUS("ВСЁ"));                        //  Выводим текст без перехода на новую строку
    for(int i=0; i<6; i++){printer.write(0x20);}      //  Выводим пробел в цикле (6 пробелов в одной строке)
    printer.write(0xB3);                              //  Выводим символ │
    for(int i=0; i<5; i++){printer.write(0x20);}      //  Выводим пробел в цикле (5 пробелов в одной строке)
    printer.print(RUS("ДЛЯ"));                        //  Выводим текст без перехода на новую строку
    for(int i=0; i<6; i++){printer.write(0x20);}      //  Выводим пробел в цикле (6 пробелов в одной строке)
    printer.write(0xBA);                              //  Выводим символ ║
    printer.feed();                                   //  Прокручиваем ленту на 1 строку, для перехода на новую строку. В этом месте можно было бы написать printer.println("") или printer.print("\r\n"), но printer.feed() действует быстрее
    printer.write(0xC7);                              //  Выводим символ ╟
    for(int i=0; i<14; i++){printer.write(0xC4);}     //  Выводим символ ─ в цикле (14 символов в одной строке)
    printer.write(0xC5);                              //  Выводим символ ┼
    for(int i=0; i<14; i++){printer.write(0xC4);}     //  Выводим символ ─ в цикле (14 символов в одной строке)
    printer.write(0xB6);                              //  Выводим символ ╢
    printer.feed();                                   //  Прокручиваем ленту на 1 строку, для перехода на новую строку. В этом месте можно было бы написать printer.println("") или printer.print("\r\n"), но printer.feed() действует быстрее
    printer.write(0xBA);                              //  Выводим символ ║
    for(int i=0; i<4; i++){printer.write(0x20);}      //  Выводим пробел в цикле (4 пробела в одной строке)
    printer.print(RUS("РАДИО"));                      //  Выводим текст без перехода на новую строку
    for(int i=0; i<5; i++){printer.write(0x20);}      //  Выводим пробел в цикле (5 пробелов в одной строке)
    printer.write(0xB3);                              //  Выводим символ │
    for(int i=0; i<2; i++){printer.write(0x20);}      //  Выводим пробел в цикле (2 пробела в одной строке)
    printer.print(RUS("ЛЮБИТЕЛЕЙ"));                  //  Выводим текст без перехода на новую строку
    for(int i=0; i<3; i++){printer.write(0x20);}      //  Выводим пробел в цикле (3 пробела в одной строке)
    printer.write(0xBA);                              //  Выводим символ ║
    printer.feed();                                   //  Прокручиваем ленту на 1 строку, для перехода на новую строку. В этом месте можно было бы написать printer.println("") или printer.print("\r\n"), но printer.feed() действует быстрее
    printer.write(0xC8);                              //  Выводим символ ╚
    for(int i=0; i<14; i++){printer.write(0xCD);}     //  Выводим символ ═ в цикле (14 символов в одной строке)
    printer.write(0xCF);                              //  Выводим символ ╧
    for(int i=0; i<14; i++){printer.write(0xCD);}     //  Выводим символ ═ в цикле (14 символов в одной строке)
    printer.write(0xBC);                              //  Выводим символ ╝
    printer.feed(4);                                  //  Прокручиваем ленту на 4 строки
    printer.setDefault();                             //  Устанавливаем настройки принтера по умолчанию.
                                                      //
}                                                     //
                                                      //
void loop(){}                                         //
                                                      //
char* RUS(char* str){                                                                                                                      // Определяем функцию которая преобразует код русских символов из кодировки UTF-8 в кодировку CP866
    uint8_t i=0, j=0;                                                                                                                      // Определяем переменные: i - счетчик входящих символов, j - счетчик исходящих символов
    while(str[i]){                                                                                                                         // Проходим по всем символам строки str, пока не встретим символ конца строки (код 0)
        if(uint8_t(str[i]) == 0xD0 && uint8_t(str[i+1]) >= 0x90 && uint8_t(str[i+1]) <= 0xBF ){str[j] = (uint8_t) str[i+1]-0x10; i++;}else // Символы «А-Я а-п» (код UTF-8: D090-D0AF D0B0-D0BF) сохраняем в кодировке CP866: код 80-9F A0-AF (символ занимал 2 байта, а стал занимать 1 байт)
        if(uint8_t(str[i]) == 0xD1 && uint8_t(str[i+1]) >= 0x80 && uint8_t(str[i+1]) <= 0x8F ){str[j] = (uint8_t) str[i+1]+0x60; i++;}else // Символы «р-я»     (код UTF-8: D180-D18F)           сохраняем в кодировке CP866: код E0-EF       (символ занимал 2 байта, а стал занимать 1 байт)
        if(uint8_t(str[i]) == 0xD0 && uint8_t(str[i+1]) == 0x81                              ){str[j] = 0xF0;                    i++;}else // Символ «Ё»        (код UTF-8: D081)                сохраняем в кодировке CP866: код F0          (символ занимал 2 байта, а стал занимать 1 байт)
        if(uint8_t(str[i]) == 0xD1 && uint8_t(str[i+1]) == 0x91                              ){str[j] = 0xF1;                    i++;}else // Символ «ё»        (код UTF-8: D191)                сохраняем в кодировке CP866: код F1          (символ занимал 2 байта, а стал занимать 1 байт)
                                                                                              {str[j] = (uint8_t) str[i];}  j++; i++;      // Остальные символы оставляем как есть, без преобразования, но их место в строке могло сдвинуться, если до них были встречены русские символы
    }   while(j<i){str[j]=0; j++;} return str;                                                                                             // Так как место занимаемое символами в строке могло уменьшиться, заполняем оставшиеся байты символами конца строки (код 0)
}
Работа с программой LCDAssistant:

Для создания массивов данных из изображений предлагаем воспользоваться программой LCDAssistant из папки extras библиотеки Adafruit_Thermal. Сначала создайте (например, в программе Paint) двухцветное изображение нужного размера и сохраните его в формате «монохромный рисунок *.bmp». Помните, что количество пикселей по ширине изображения должно быть кратно 8. Далее запустите программу LCDAssistant и откройте сохранённое ранее изображение используя пункт меню File > Load Image. В области «Picture preview» Вы увидите Ваше изображение. Поля «Width» и «Height» области «Size» автоматически заполнятся, отображая реальную ширину и высоту загруженного рисунка в пикселях (именно эти значения нужно указать в скетче в качестве первого и второго аргумента функции printBitmap). Выберите пункт «Horizontal» в области «Byte orientation» и измените текст в поле «Table name» на название массива (на придуманное Вами имя переменной). Осталось сохранить массив в файл используя пункт меню File > Save output.

В указанном Вами месте появится текстовый файл с данными массива, который начинается с определения типа массива:
«const unsigned char», замените его на «static const uint8_t PROGMEM».

Теперь можно скопировать массив в скетч или сохранить имеющийся файл в папку со скетчем, указав ему расширение имя_файла.h, не забудьте подключить этот файл, написав в скетче строку: #include "logo_iarduino.h" // без точки с запятой в конце строки. Вывод изображения осуществляется вызовом функции: ОБЪЕКТ.printBitmap( ШИРИНА , ВЫСОТА , ИМЯ_МАССИВА );

Описание функций библиотеки:

Подключение библиотеки с использованием аппаратной шины UART:
#include <Adafruit_Thermal.h>         //  Подключаем библиотеку для работы с термопринтером
Adafruit_Thermal printer(&Serial1);   //  Объявляем объект printer библиотеки Adafruit_Thermal, указывая ссылку на класс Serial, или Serial1, или Serial2 ...
                                      //  Вы можете придумать любое имя объекту, вместо printer
                                      //  От указанного класса для работы с шиной UART будет зависеть к каким аппаратным выводам UART подключать термопринтер
                                      //  В arduino UNO, Nano, ProMini можно использовать только класс Serial, по этому лучше использовать программную шину UART
Подключение библиотеки с использованием программной шины UART:
#include <SoftwareSerial.h>           //  Подключаем библиотеку для работы c программной шиной UART
#include <Adafruit_Thermal.h>         //  Подключаем библиотеку для работы с термопринтером
SoftwareSerial  mySerial(5, 6);       //  Объявляем объект mySerial библиотеки SoftwareSerial, указывая задействованные выводы Arduino (RX=5-зелёный, TX=6-синий)
                                      //  Вы можете придумать любое имя объекту, вместо mySerial
                                      //  Вы можете назначить любые выводы Arduino UNO, Nano или ProMini вместо 5 и 6
Adafruit_Thermal printer(&mySerial);  //  Объявляем объект printer библиотеки Adafruit_Thermal, указывая ссылку на созданный ранее объект mySerial библиотеки SoftwareSerial
                                      //  Вы можете придумать любое имя объекту, вместо printer
Функция begin():
  • Назначение: инициализация термопринтера.
  • Синтаксис: begin( [ВРЕМЯ] );
  • Параметры:
    • ВРЕМЯ - значение от 3 до 255 = время нагрева пикселей * 10-5 сек.
      Значение по умолчанию 120 => время нагрева пикселей = 120*10-5 = 1,2 мс.
  • Возвращаемые значения: Нет.
  • Примечание:
    • Функцию достаточно вызвать 1 раз в коде setup.
    • Чем больше время нагрева пикселей, тем темнее формируемое изображение, но дольше печать.
    • Перед вызовом данной функции нужно инициировать работу с шиной UART на скорости 9600 бит/сек.
  • Пример:
mySerial.begin(9600);                //  Инициируем работу с программной шиной UART на скорости 9600 бит/сек
                                     //  Если используется аппаратная шина UART то вместо объекта mySerial указывается класс Serial, или Serial1, или Serial2 ...
printer.begin();                     //  Инициируем работу с термопринтером, время нагрева пикселей равно значению по умолчанию (1,2 мс)
printer.begin(200);                  //  Инициируем работу с термопринтером, время нагрева пикселей равно 2 мс
Функции print(), println(), write():
  • Назначение: печать строк, чисел и символов.
  • Синтаксис: аналогичен одноимённым функциям класса Serial.
  • Параметры: аналогичны одноимённым функциям класса Serial.
  • Возвращаемые значения: Нет.
  • Пример:
printer.println("iArduino.ru");      //  Печать текста c переводом «каретки» на новую строку
printer.print("iArduino.ru");        //  То же самое, но без перевода «каретки»
printer.println(123);                //  Печать числа 123
printer.println(123,HEX);            //  Печать числа 123 в шестнадцатиричной системе счисления
printer.write(65);                   //  Печать символа с кодом 65 используемой таблицы символов
Функция setCharset():
  • Назначение: замена символов кодовой страницы в диапазоне 0x23-0x7E (первая часть кодовой страницы).
  • Синтаксис: setCharset( КОДИРОВКА );
  • Параметры:
    • КОДИРОВКА - название кодовой страницы символы которой будут загружены в используемую кодовую страницу.
      Возможные значения: CHARSET_USA (по умолчанию), CHARSET_FRANCE, CHARSET_GERMANY, CHARSET_UK, CHARSET_DENMARK1, CHARSET_SWEDEN, CHARSET_ITALY, CHARSET_SPAIN1, CHARSET_JAPAN, CHARSET_NORWAY, CHARSET_DENMARK2, CHARSET_SPAIN2, CHARSET_LATINAMERICA, CHARSET_KOREA, CHARSET_SLOVENIA, CHARSET_CROATIA, CHARSET_CHINA.
  • Возвращаемые значения: Нет.
  • Примечание:
    • Кодовая страница состоит из 255 символов с кодами от 0x01 до 0xFF.
    • Данная функция загружает символы с кодами в диапазоне от 0x23 до 0x7E.
    • Для стандартной кодовой страницы ASCII это символы:
      # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
    • Символы кириллицы загружаются во вторую часть кодовой страницы см. функцию setCodePage().
  • Пример:
printer.setCharset(CHARSET_USA);      //  Загрузить стандартные символы в первую часть кодовой страницы
printer.write(0x24);                  //  Печать символа с кодом 0x24 (напечатается символ '$')
printer.setCharset(CHARSET_CHINA);    //  Загрузить символы кодовой страницы CHARSET_CHINA
printer.write(0x24);                  //  Печать символа с кодом 0x24 (напечатается символ '¥')
Функция setCodePage():
  • Назначение: загрузка кодовой страницы (замена символов в диапазоне 0x80-0xFF - вторая часть кодовой страницы).
  • Синтаксис: setCodePage( КОДИРОВКА );
  • Параметры:
    • КОДИРОВКА - название кодовой страницы символы которой будут загружены в используемую кодовую страницу.
      Возможные значения: CODEPAGE_CP437 (по умолчанию), CODEPAGE_KATAKANA, CODEPAGE_CP850, CODEPAGE_CP860, CODEPAGE_CP863, CODEPAGE_CP865, CODEPAGE_WCP1251, CODEPAGE_CP866, CODEPAGE_MIK, CODEPAGE_CP755, CODEPAGE_IRAN, CODEPAGE_CP862, CODEPAGE_WCP1252, CODEPAGE_WCP1253, CODEPAGE_CP852, CODEPAGE_CP858, CODEPAGE_IRAN2, CODEPAGE_LATVIAN, CODEPAGE_CP864, CODEPAGE_ISO_8859_1, CODEPAGE_CP737, CODEPAGE_WCP1257, CODEPAGE_THAI, CODEPAGE_CP720, CODEPAGE_CP855, CODEPAGE_CP857, CODEPAGE_WCP1250, CODEPAGE_CP775, CODEPAGE_WCP1254, CODEPAGE_WCP1255, CODEPAGE_WCP1256, CODEPAGE_WCP1258, CODEPAGE_ISO_8859_2, CODEPAGE_ISO_8859_3, CODEPAGE_ISO_8859_4, CODEPAGE_ISO_8859_5, CODEPAGE_ISO_8859_6, CODEPAGE_ISO_8859_7, CODEPAGE_ISO_8859_8, CODEPAGE_ISO_8859_9, CODEPAGE_ISO_8859_15, CODEPAGE_THAI2, CODEPAGE_CP856, CODEPAGE_CP874.
  • Возвращаемые значения: Нет.
  • Примечание:
    • Кодовая страница состоит из 255 символов с кодами от 0x01 до 0xFF.
    • Данная функция загружает символы с кодами в диапазоне от 0x80 до 0xFF.
    • Для кодовой страницы CODEPAGE_CP866 это символы: А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ж з и й к л м н о п ░ ▒ ▓ │ ┤ ╡ ╢ ╖ ╕ ╣ ║ ╗ ╝ ╜ ╛ ┐ └ ┴ ┬ ├ ─ ┼ ╞ ╟ ╚ ╔ ╩ ╦ ╠ ═ ╬ ╧ ╨ ╤ ╥ ╙ ╘ ╒ ╓ ╫ ╪ ┘ ┌ █ ▄ ▌ ▐ ▀ р с т у ф х ц ч ш щ ъ ы ь э ю я Ё ё Є є Ї ї Ў ў ° ∙ · √ № ¤ ■
    • Символы кириллицы загружаются со страниц: CODEPAGE_WCP1251, CODEPAGE_CP866, CODEPAGE_MIK, CODEPAGE_CP755, CODEPAGE_LATVIAN, CODEPAGE_ISO_8859_5 и CODEPAGE_CP856, но коды символов в разных таблицах разные, предлагаем использовать таблицу CODEPAGE_CP866.
  • Пример:
printer.setCodePage(CODEPAGE_CP866);  //  Загружаем кодовую страницу CODEPAGE_CP866
printer.write(143);                   //  Выводим символ с кодом 143 (в загруженной странице это символ 'П')
printer.write(224);                   //  Выводим символ с кодом 224 (в загруженной странице это символ 'р')
printer.write(168);                   //  Выводим символ с кодом 168 (в загруженной странице это символ 'и')
printer.write(162);                   //  Выводим символ с кодом 162 (в загруженной странице это символ 'в')
printer.write(165);                   //  Выводим символ с кодом 165 (в загруженной странице это символ 'е')
printer.write(226);                   //  Выводим символ с кодом 226 (в загруженной странице это символ 'т')
printer.print("\r\n");                //  Выводим символы окончания '\r' и начала '\n' строки (перевод «каретки»)
Функция setSize():
  • Назначение: установка размера шрифта.
  • Синтаксис: setSize( 'X' );
  • Параметры:
    • 'X' - символ 'S', 'M', или 'L' определяющий размер шрифта.
      'S' - (Small) маленький размер шрифта (установлен по умолчанию);
      'M' - (Medium) средний размер шрифта;
      'L' - (Large) крупный размер шрифта.
  • Возвращаемые значения: Нет.
  • Примечание: Установленный размер будет действовать для всех текстовых строк выводимых после данной функции.
  • Пример:
printer.setSize('L');                //  Установить крупный размер шрифта
printer.println("iarduino.ru");      //  Этот текст напечатается крупным шрифтом
Функция justify():
  • Назначение: установка выравнивания текста по ширине.
  • Синтаксис: justify( 'X' );
  • Параметры:
    • 'X' - символ 'L', 'C', или 'R' определяющий выравнивание текста по ширине.
      'L' - (Left) выравнивание по левому краю;
      'C' - (Center) выравнивание по середине;
      'R' - (Right) выравнивание по правому краю.
  • Возвращаемые значения: Нет.
  • Примечание: Установленное выравнивание будет действовать для всех текстовых строк выводимых после данной функции.
  • Пример:
printer.justify('C');                //  Установить выравнивание по центру
printer.println("iarduino.ru");      //  Этот текст напечатается по центру кассовой ленты
Функция inverseOn():
  • Назначение: включает инверсию цвета текста.
  • Синтаксис: inverseOn();
  • Параметры: Нет.
  • Возвращаемые значения: Нет.
  • Примечание: Инверсия будет действовать для всех текстовых строк выводимых после данной функции.
  • Пример:
printer.inverseOn();                 //  Включить инверсию цвета текста
printer.println("iarduino.ru");      //  Этот текст напечатается белыми символами на тёмном фоне
Функция inverseOff():
  • Назначение: отключает инверсию цвета текста.
  • Синтаксис: inverseOff();
  • Параметры: Нет.
  • Возвращаемые значения: Нет.
  • Пример:
printer.inverseOff();                //  Отключить инверсию цвета текста
Функция doubleHeightOn():
  • Назначение: включает удвоенную высоту текста.
  • Синтаксис: doubleHeightOn();
  • Параметры: Нет.
  • Возвращаемые значения: Нет.
  • Примечание:
    • Функция действует только для шрифта c размером «S» - Small (маленький), см. функцию setSize().
    • С удвоенной высотой будут печататься все текстовые строки выводимые после данной функции.
  • Пример:
printer.doubleHeightOn();            //  Включить удвоенную высоту текста
printer.println("iarduino.ru");      //  Этот текст напечатается в два раза выше чем текст по умолчанию
Функция doubleHeightOff():
  • Назначение: отключает удвоенную высоту текста.
  • Синтаксис: doubleHeightOff();
  • Параметры: Нет.
  • Возвращаемые значения: Нет.
  • Пример:
printer.doubleHeightOff();           //  Отключить удвоенную высоту текста
Функция doubleWidthOn():
  • Назначение: включает удвоенную ширину текста.
  • Синтаксис: doubleWidthOn();
  • Параметры: Нет.
  • Возвращаемые значения: Нет.
  • Примечание:
    • Функция действует только для шрифта c размером «S» - Small (маленький), см. функцию setSize().
    • С удвоенной шириной будут печататься все текстовые строки выводимые после данной функции.
  • Пример:
printer.doubleWidthOn();             //  Включить удвоенную ширину текста
printer.println("iarduino.ru");      //  Этот текст напечатается в два раза шире чем текст по умолчанию
Функция doubleWidthOff():
  • Назначение: отключает удвоенную ширину текста.
  • Синтаксис: doubleWidthOff();
  • Параметры: Нет.
  • Возвращаемые значения: Нет.
  • Пример:
printer.doubleWidthOff();            //  Отключить удвоенную ширину текста
Функция boldOn():
  • Назначение: включает полужирное начертание текста.
  • Синтаксис: boldOn();
  • Параметры: Нет.
  • Возвращаемые значения: Нет.
  • Примечание:
    • Для вывода шрифта размером 'M' - (Medium) средний, или 'L' - (Large) крупный, нужно сначала вызвать функцию boldOn(), а потом указать размер шрифта функцией setSize().
    • С полужирным начертанием будут печататься все текстовые строки выводимые после данной функции.
  • Пример:
printer.boldOn();                    //  Включить полужирное начертание текста
printer.println("iarduino.ru");      //  Этот текст напечатается жирнее чем текст по умолчанию
Функция boldOff():
  • Назначение: отключает полужирное начертание текста.
  • Синтаксис: boldOff();
  • Параметры: Нет.
  • Возвращаемые значения: Нет.
  • Пример:
printer.boldOff();                   //  Отключить полужирное начертание текста
Функция underlineOn():
  • Назначение: включает подчёркивание текста.
  • Синтаксис: underlineOn( [ТОЛЩИНА] );
  • Параметры:
    • ТОЛЩИНА - число от 0 до 2 определяющее толщину линии подчёркивания в пикселях.
      Значение по умолчанию 1 пиксель.
  • Возвращаемые значения: Нет.
  • Примечание: С подчёркиванием будут печататься все текстовые строки выводимые после данной функции.
  • Пример:
printer.underlineOn();               //  Включить подчёркивание текста (размер линии подчёркивания равен значению по умолчанию - 1 пиксель)
printer.println("iarduino.ru");      //  Этот текст напечатается с подчёркиванием
Функция underlineOff():
  • Назначение: отключает подчёркивание текста.
  • Синтаксис: underlineOff();
  • Параметры: Нет.
  • Возвращаемые значения: Нет.
  • Пример:
printer.underlineOff();              //  Отключить подчёркивание текста
Функция setLineHeight():
  • Назначение: установка межстрочного интервала.
  • Синтаксис: setLineHeight( [ВЫСОТА] );
  • Параметры:
    • ВЫСОТА - значение от 24 до 32767 = высота строки (не шрифта) * 10-1 мм.
      Значение по умолчанию 30 => высота строки = 30*10-1 = 3 мм.
  • Возвращаемые значения: Нет.
  • Примечание:
    • Установленная высота это интервал от нижней части последней выведенной строки до нижней части выводимой строки.
    • Установленный интервал будет действовать для всех текстовых строк выводимых после данной функции.
    • Реальная высота строки (на чековой ленте) может незначительно отличаться от установленной.
  • Пример:
printer.setLineHeight(50);           //  Установить межстрочный интервал в 5 мм
printer.println("iarduino.ru");      //  Интервал установлен от от нижней части последней выведенной строки, до нижней части этой строки
Функция setCharSpacing():
  • Назначение: установка дополнительного межсимвольного интервала.
  • Синтаксис: setCharSpacing( [ИНТЕРВАЛ] );
  • Параметры:
    • ИНТЕРВАЛ - значение от 0 до 32767 пикселов добавляемых между соседними символами на одной строке.
      Значение по умолчанию 0 пикселов.
  • Возвращаемые значения: Нет.
  • Примечание:
    • Установленный интервал является дополнительным и складывается и интервалом по умолчанию.
    • Установленный интервал будет действовать для всех текстовых строк выводимых после данной функции.
  • Пример:
printer.setCharSpacing(5);           //  Установить межсимвольный интервал в 5 пикселов
printer.println("iarduino.ru");      //  Этот текст напечатается с дополнительным интервалом между символами.
Функция tab():
  • Назначение: установка отступа (табуляции).
  • Синтаксис: tab();
  • Параметры: Нет
  • Возвращаемые значения: Нет.
  • Пример:
printer.tab();                       //  Установить отступ (табуляцию)
printer.println("iarduino.ru");      //  Этот текст напечатается с красной строки (новый абзац).
printer.println("iarduino.ru");      //  Этот текст напечатается как обычно с начала строки
Функция feed():
  • Назначение: прокрутка кассовой ленты на указанное количество строк.
  • Синтаксис: feed( [КОЛИЧЕСТВО] );
  • Параметры:
    • КОЛИЧЕСТВО - строк от 0 до 255 на которое требуется прокрутить кассовую ленту.
      Значение по умолчанию 1 строка.
  • Возвращаемые значения: Нет.
  • Примечание:
    • Функцию можно использовать для прокрутки ленты, после напечатанного текста, до «линии отрыва».
    • Функцию с параметром по умолчанию можно использовать для быстрого переноса строки:
      print("abcd"); feed(); print("efgh"); feed(); распечатается быстрее чем: println("abcd"); println("efgh");
  • Пример:
printer.println("iarduino.ru");      //  Как только напечатается эта строка, её еще не будет видно, т.к. она будет под крышкой принтера.
printer.feed(2);                     //  Сдвигаем ленту на 2 строки. Теперь напечатанная ранее строка будет видна.
Функция feedRows():
  • Назначение: прокрутка кассовой ленты на указанное количество пикселей.
  • Синтаксис: feedRows( КОЛИЧЕСТВО );
  • Параметры:
    • КОЛИЧЕСТВО - пикселей от 0 до 255 на которое требуется прокрутить кассовую ленту.
  • Возвращаемые значения: Нет.
  • Примечание: Функцию можно использовать для задания точных интервалов между картинками, штрих-кодами, или строками.
  • Пример:
printer.println("iarduino.ru");      //  Как только напечатается эта строка, её еще не будет видно, т.к. она будет под крышкой принтера.
printer.feedRows(50);                //  Сдвигаем ленту на 50 пикселей. Теперь напечатанная ранее строка будет видна.
Функция hasPaper():
  • Назначение: проверка наличия кассовой ленты.
  • Синтаксис: hasPaper();
  • Параметры: Нет.
  • Возвращаемые значения: true или false.
  • Примечание: Функцию можно использовать для вывода сообщений о необходимости установить новую ленту.
  • Пример:
if(printer.hasPaper()){              //  Если в термопринтере есть кассовая лента, то ...
  printer.println("iarduino.ru");    //  Печатаем текст
}else{                               //  Если в термопринтере нет кассовой ленты, то ...
  Serial.println("Замените ленту");  //  Выводим сообщение в монитор последовательного порта
}                                    //
Функция: printBarcode();
  • Назначение: печать штрих-кода.
  • Синтаксис: printBarcode( "ТЕКСТ" , ФОРМАТ );
  • Параметры:
    • "ТЕКСТ" - набор символов для печати в выбранном формате штрих-кода.
    • ФОРМАТ - один из поддерживаемых форматов штрих-кода: UPC_A, UPC_E, EAN13, EAN8, CODE39, CODE93, ITF, CODABAR, CODE128.
  • Возвращаемые значения: Нет.
  • Пример:
printer.printBarcode("123456789012", UPC_A);    //  Печать штрих-кода в формате UPC_A
printer.printBarcode("IARDUINO.RU",  CODE93);   //  Печать штрих-кода в формате CODE93
Функция setBarcodeHeight();
  • Назначение: установка высоты штрих-кода.
  • Синтаксис: setBarcodeHeight( [ВЫСОТА] );
  • Параметры:
    • ВЫСОТА - значение от 1 до 255 = высота штрих-кода (без символов) * 10-1 мм.
      Значение по умолчанию 50 => высота штрих-кода = 50*10-1 = 5 мм.
  • Возвращаемые значения: Нет.
  • Примечание:
    • Установленная высота будет действовать на все штрих-коды выводимые после данной функции.
    • Реальная высота штрих-кода (на чековой ленте) может незначительно отличаться от установленной.
  • Пример:
printer.setBarcodeHeight(100);                //  Устанавливаем высоту штрихкода в 10 мм = 1 см
printer.printBarcode("IARDUINO.RU", CODE93);  //  Печать штрих-кода в формате CODE93 с установленной высотой
Функция: printBitmap();
  • Назначение: печать изображения.
  • Синтаксис: printBitmap( ШИРИНА , ВЫСОТА , МАССИВ [ , ФЛАГ_PROGMEM] );
  • Параметры:
    • ШИРИНА - значение от 8 до 65535 пикселей изображения
    • ВЫСОТА - значение от 1 до 65535 пикселей изображения
    • МАССИВ - имя массива хранящего данные изображения или ссылка на объект класса Stream
    • ФЛАГ_PROGMEM - указывает на то, что массив с изображением находится:
      true - в области памяти программ (по умолчанию) / false - в области оперативной памяти.
  • Возвращаемые значения: Нет.
  • Примечание:
    • Значение ширины изображения должно быть кратно 8, иначе правые пикселы изображения будет урезаться до кратного значения.
    • Изображение выводится из массива следующим образом:
      Каждый бит каждого байта массива это очередной пиксель изображения (0-белый, 1-чёрный). Изображение формируется построчно слева направо, сверху вниз, начиная со старшего бита младшего байта массива. Если количество выведенных пикселей в строке достигло значения ШИРИНА, то начинает выводиться следующая строка и так пока количество строк не достигнет значения ВЫСОТА.
    • При печати потокового изображения (не из массива, а используя объект класса Stream) параметр ФЛАГ_PROGMEM не указывается, а параметры ШИРИНА и ВЫСОТА являются не обязательными.
  • Пример:
static const uint8_t PROGMEM logo[] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFB,0xDF,0xFF,0xFF,0xFB,0xDF,0xFF,0xE0,0x03,0xC0,0x07,0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x07,0xE1,0xE0,0x07,0x87,0xFD,0xEE,0x77,0xBF,0xFD,0xEE,0x77,0xBF,0xFC,0x0E,0x70,0x3F,0xFF,0xFE,0x7F,0xFF,0xFF,0xFE,0x7F,0xFF};
printer.printBitmap(32, 20, logo);   //  Печать изображения (логотипа iarduino) размером 32x20 пикселей из массива logo находящегося в области памяти программ
uint8_t logo[] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFB,0xDF,0xFF,0xFF,0xFB,0xDF,0xFF,0xE0,0x03,0xC0,0x07,0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x07,0xE1,0xE0,0x07,0x87,0xFD,0xEE,0x77,0xBF,0xFD,0xEE,0x77,0xBF,0xFC,0x0E,0x70,0x3F,0xFF,0xFE,0x7F,0xFF,0xFF,0xFE,0x7F,0xFF};
printer.printBitmap(32, 20, logo, false);   //  Печать изображения (логотипа iarduino) размером 32x20 пикселей из массива logo находящегося в области оперативной памяти
Функция setDefault():
  • Назначение: сброс пользовательских настроек в значения по умолчанию.
  • Синтаксис: setDefault();
  • Параметры: Нет.
  • Возвращаемые значения: Нет.
  • Пример:
printer.setDefault();                //  Сбрасываем настройки
printer.println("iarduino.ru");      //  Этот текст будет напечатан стандартным шрифтом, из стандартной таблицы символов и т.д.
Функция test():
  • Назначение: вывод тестовой строки.
  • Синтаксис: test();
  • Параметры: Нет.
  • Возвращаемые значения: Нет.
  • Пример:
printer.test();                      //  На кассовой ленте будет напечатан тестовый текст «Hello World!» с установленными ранее параметрами
Функция testPage():
  • Назначение: вывод тестовой страницы.
  • Синтаксис: testPage();
  • Параметры: Нет.
  • Возвращаемые значения: Нет.
  • Пример:
printer.testPage();                  //  На кассовой ленте будет распечатана тестовая страница с установленными ранее параметрами
Функция sleep():
  • Назначение: перевод принтера в спящий режим.
  • Синтаксис: sleep();
  • Параметры: Нет.
  • Возвращаемые значения: Нет.
  • Примечание: Если после данной функции следует любая функция вывода данных на печать, без задержки, то часть данных может быть напечатана.
  • Пример:
printer.sleep();                      //  Принтер перейдёт в спящий режим и перестанет реагировать на команды вывода и даже на кнопку прокрутки ленты
Функция sleepAfter():
  • Назначение: перевод принтера в спящий режим через определённый промежуток времени
  • Синтаксис: sleepAfter( ВРЕМЯ );
  • Параметры:
    • ВРЕМЯ - количество секунд от 0 до 65535 являющееся интервалом до перехода в спящий режим.
  • Возвращаемые значения: Нет.
  • Пример:
printer.sleepAfter(5);               //  Принтер перейдёт в спящий, как при функции sleep(), но только через 5 секунд.
Функция wake():
  • Назначение: вывод принтера из спящего режима (пробуждение принтера).
  • Синтаксис: wake();
  • Параметры: Нет.
  • Возвращаемые значения: Нет.
  • Пример:
printer.wake();                      //  Принтер выйдет из спящего режима
Функция reset():
  • Назначение: перезагрузка принтера.
  • Синтаксис: reset();
  • Параметры: Нет.
  • Возвращаемые значения: Нет.
  • Примечание: Если принтер находился в спящем режиме, то перезагрузка произойдёт без его пробуждения.
  • Пример:
printer.reset();                     //  Принтер будет перезагружен, настройки принтера сбросятся в значения по умолчанию

Дополнительно:

Данные для печати поступают сначала в буфер принтера, а уже из него берутся для формирования изображений на кассовой ленте. Принтер не сообщает информацию об уровне заполненности буфера входных данных, по этому библиотека делает паузы на время требуемое для печати. Дело в том что скорость передачи данных по шине UART выше чем скорость печати принтера. Если отправлять данные потоком, без пауз, то буфер входных данных принтера может переполнится, что приведёт к потере текста или искажению изображений. С другой стороны, паузы устанавливаемые библиотекой сильно увеличивают время печати.

Выходом из данной ситуации может стать подключение жёлтого провода DTR (Data Terminal Ready) шины UART к любому выводу Arduino. Так принтер сможет сообщать о готовности получения новых данных. Номер вывода Arduino к которому подключён желтый провод нужно указать в качестве второго аргумента при объявлении объекта библиотеки Adafruit_Thermal.

...                                    //  См раздел подключение библиотеки
Adafruit_Thermal printer(&mySerial,7); //  Объявляем объект printer с указанием ссылки на объект mySerial (или на класс Serial) и № любого вывода Arduino (в данном случае 7) к которому подключен вывод DTR принтера
...                                    //

Теперь принтер будет сообщать библиотеке о готовности принять новые данные, а библиотека не будет устанавливать дополнительные паузы, это в разы ускорит работу принтера. Но вывод русского текста будет возможен только посимвольно, через функцию write().

Ссылки:

Обсуждение

Присоединяйся

На главную