Куток

Обкладинка для допису VFD Годинник з Індикатора Покупця
Ілля
Ілля

Додано

VFD Годинник з Індикатора Покупця

Індикатор Покупця

Дисплей покупця, індикатор покупця, індикатор клієнта, назв багато, але суть одна - це саме той "ламповий" дисплейчик який в багатьох магазинах відображає для Вас багато інформації, на кшталт решти, суми до сплати, позиції яку Ви купуєте, і тд. Через оновлення обладнання, банкрутство магазинів, і ще купу різних причин, такі дисплейчики дуже часто опиняються на смітниках, в гіршому для нас випадку, або на вторинному ринку, і це, як не дивно, кращий для нас випадок, так як по перше не зростає кількість електронних відходів, а по друге - дає можливість нам купити такий дисплейчик, і, наприклад, зробити з нього годинник :)

Подібні теми мабуть нетипові для данного сайту, тому в данній статті я пропоную лише познайомитись з одним з таких дисплеїв. До речі, українського виробництва! А якщо комусь подібна тема буде цікава, то я з радістью поділюсь усім необхідним для того щоб повторити такий проект(наразі він нажаль дуже сирий та заточений саме під мене).

ІКС-Л-2х20

ІКС-Л-2х20

Як нам каже сам виробник (ТОВ "ІКС-Техно"):

Індикатор "ІКС-Л-2х20" (IKC-L-2-20) призначений для роботи у складі блокових реєстраторів розрахункових операцій будь-якого призначення. Індикатор виконує функцію прийняття та відображення інформації та є пасивним пристроєм щодо РРО, у складі якого працює.

Він живиться від 9В до 27В, та сприймає команди по протоколу RS232. Коли ми чуємо RS232, то в голові одразу виникає образ COM або Serial порту, але в цьому дисплеї замість нього - RJ11.
Пропоную поглянути, що нас чекає всередині!
Величезний дисплей!
А всередині нас чекає дуууже великий(особливо після дисплеїв типу 1602) символьний вакуумно-люмінісцентний індикатор! "Символьні" дисплеї, це такі дисплеї, в котрих заздалегідь обозначено місце під кожний символ. Цей дисплей наприклад має, 2 лінії по 20 символів. Кожен символ являє собою двовимірний масив пікселів. Зазвичай це 5х8, але в нашому випадку - 5х7. Проте не вийде малювати там будь-що (поки що). Є певна таблиця символів, котрі дисплей може виводити. І в цьому криється ще один плюс конкретно цього, українського дисплею, адже так як він був розроблений для українського ринку, він вміє виводити українські літери! Так, в китайських дисплейчиках типу 1602 це можна зустріти доволі нечасто. Символьну таблицю для цього дисплею ви можете побачити в паспорті цього дисплею за ЦИМ ПОСИЛАННЯМ, або нижче:

Символьна таблиця для ІКС-Л-2х20

Так, це всі символи які може вивести цей дисплей. Насправді можна ще програмувати свої, але судячи з всього, в цьому дисплеї цього не реалізували, а свою прошивку я ще не написав(але планую!).
Дисплеєм полюбовались, тепер подивимось що там позаду нього.

Купа мікросхем

А позаду нас чекає ціла купа мікросхем! Потикавши в них мультиметром, і пошукавши даташити пару десяток хвилин, я зрозумів що є що, тому зараз розповім і вам.

Основні блоки дисплею

PT6314LQ-009

PT6314LQ-009

Це драйвер, який і керує самим дисплеєм. Якщо подивитись на фотографіях вище, можно помітити, що від самого дисплею на плату йде дуже багато виводів/контактів. І от щоб керувати дисплеєм з великою кількістю контактів, потрібна мікросхема з великою кількістю контактів :D
PT6314LQ це назва самої мікросхеми, а от 009 - це вже номер модифікації, від якої залежить та сама символьна таблиця, наприклад якщо б тут було 001, то символи були б зовсім інші, а саме англійські + японські. Але цікаво що про 009 в даташиті на цю мікросхему немає жодної інформації, як і будь де. Можливо це було якесь приватне замовлення лише для подібних дисплеїв від цього виробника, хто зна. Тому єдина інформація про символьну таблицю є в паспорті до цього дисплею. Ну і тепер також тут :)

Atmega8A

Atmega8A

Це мікроконтролер. Це такий собі мікро комп'ютер, сюди залили певний код, і він виконує певні функції. А саме - обробка команд які приходять по RS232, і комунікація з драйвером, щоб драйвер виводив на дисплей саме те що нам потрібно. Саме цю мікросхему треба замінити на інший мікроконтролер, з іншим кодом, і тоді можливо на дисплей можна буде виводити нові символи, і робити ще низку прикольних речей. Можливо мікроконтролер можна і не міняти, адже на платі навіть є виводи для програмування мікроконтролеру.

Піни програмування

Але це може не спрацювати якщо на мікроконтролері стоїть захист від запису/читання. Або якщо в решті решт не вийде написати код, то для відновлення роботи дисплею знадобиться дуже багато зусиль. Тому краще експериментувати на окремому мікроконтролері, щоб в разі невдачі, просто впаяти на місце старий.

ST232C

ST232C

Задача цієї мікросхеми одна - вона є сполучною ланкою між RS232 та мікроконтролером. Справа просто в тому, що щоб не вбити мікроконтролер, на нього слід подавати не більше 5В. А в RS232 часто гуляє напруга набагато(по міркам мікроконтролеру) вища, тому ST232C перетворює "високовольтні" команди на звичні для мікроконтролеру.

063AC

063AC

Ну і сама нецікава, але не менш важлива мікросхема. Вона займається перетворенням напруги. Справа в тому, що якщо подати 9В на цей дисплейчик, то цього буде забагато для мікроконтролеру, але замало для самого дисплею. Тому тут на платі 2 такі мікросхеми, та що зліва на загальному фото(DC-DC Step Down) - понижує напругу до напруги живлення мікроконтролеру, а та що справа(DC-DC Step Up) - підвищує напругу для дисплею.

Виводимо дані!

З мікросхемами розібрались, але як же тепер на нього вивести хоч щось? Тут є 2 шляхи. Перший - просто підключити його до Serial порту(якщо він у вас ще є звісно) за допомогою дроту RS232-RJ11. Порт в мене є а от дроту немає, тому я пішов другим шляхом - випаяти ST232C.

Демонтаж мікросхеми

Після таких манипуляцій ми зможемо напряму підключитись до ліній RX/TX мікроконтролеру, і посилати на нього дані, наприклад за допомогою іншого мікроконтролеру або USB-UART перехіднику. Адже вони вже не будуть посилати "високовольтних" команд, це будуть або 3.3В, або 5В.
Ну а інформація щодо вигляду самих даних, є вже у паспорті дисплею:
Кожной символ ASCII передається:

  • – 1-м стартовим бітом;
  • – 8-ма інформаційними бітами;
  • – 1-м стоповим бітом;
  • – без контролю парності

Якщо Ви програмуєте мікроконтролер в середовищі Arduino IDE, або наприклад PlatformIO, то для англійських і багатьох інших символів це просто Serial.print(); Baud Rate, або швидкість Serial-у, кому як зручно, повинна бути 9600. З українськими символами вже складніше, тут нам допоможе таблиця символів про яку ми говорили раніше. Давайте наприклад знайдемо там символ У. Це стовбець 9, і рядок 3. Тому щоб вивести символ У, нам треба зробити Serial.write(0x93); А для символу Ї наприклад це буде Serial.write(0xF4); І тд.
Після виводу хоча б декількох символів, ви скоріш за все зіткнетеся з необхідністю перемістити курсор. Наприклад щоб перекрити раніше написані дані, або ще для чогось. Команда на пересування курсору зазначена в паспорті на цей дисплей:

Команда для пересування курсору

Для цього я реалізував таку просту функцію. Звісно можна було ще заморочитись щоб вона приймала не байт, а інт, але мені і так годиться.

// byte place from 0x31 to 0x58 (1-40)
void setCursorVFD(byte place)
{
    //                        EOT  SOH      P           ETB
    byte cursor_position[] = {0x04, 0x01, 0x50, place, 0x17};
    Serial.write(cursor_position, sizeof(cursor_position));
}
Увімкніть повноекранний режим Вийти з повноекранного режиму

І нажаль це все. Більше ніяких команд в паспорті не зазначено! Навіть команди для очищення дисплею! Для цього довелося городити ось такий жах:

void clearVFD()
{
    setCursorVFD(0x31);
    Serial.print("                                        ");
    setCursorVFD(0x31);
}
Увімкніть повноекранний режим Вийти з повноекранного режиму

Це звісно і є основним приводом для того щоб переписати код в мікроконтролері дисплею. Все таки драйвер підтримує очищення, і очистити дисплей буде набагато швидше і доречніше ніж друкувати 40 разів ' '! Перш ніж робити такі висновки, що команди немає, я звісно багато чого перепробував - і команди від аналогічних японських дисплеїв, і команди іншого дисплею від "ІКС-Техно", але всюди мене чекала невдача. Я навіть написав онлайн листа до "ІКС-Техно", з проханням надати можливо якийсь більш детальний паспорт чи типу того, але відповіді поки що не було. Єдине що я знайшов, це команду на перевірку дисплею. Коли на дисплей будуть виводитись різноманітні символи, щоб переконатись що дисплей справний, і горять лише ті пікселі, які повинні горіти. Але то не цікаво.

Годинник!

Але, не зважаючи на все це, дисплеєм можна користуватись! Повертаючись до того, з чого ми починали - годинник.

Годинник
Годинник
Реалізацій можна придумати безліч, і навіть додати відображення погоди! Якщо мікроконтролер підтримує технологію Wi-Fi.

Погода

Але як я і казав, проект дуже сирий, і заточений під мене, так як я використовував там бракований RTC модуль, щоб його не викидати. Але якщо ця тема Вам буде цікава, я залюбки напишу дуже докладний гайд виду "Купив, спаяв, запрограмував", щоб кожен бажаючий міг зробити собі такий годинник, або ще щось! Все таки тут вже є корпус, і коштує це щастя на ОЛХ не дуже багато. Я наприклад купував за 375 грн.
Але якщо хтось хоче прямо зараз цим зайнятись, не чекаючи поки я зроблю гайд, то при винекнинні будь яких питань - можете писати мені, я залюбки вам допоможу чим зможу!

Не тільки годинник!

Але не лише для годинника можна використовувати цей дисплей. Все таки це після наших манипуляцій майже звичайний символьний дисплей. Тому і робити з ним можна все, що зазвичай роблять з китайськими символьними LCD дисплеями. Головне щоб символів вистачало ;)

Кімнатний термометр, годинник, погодна станція, вольтметр, амперметр, відображувач навантаження ОЗП, ЦП, Відеокарти і тд.
Навіть лічильник підпсників для ютуб каналу зробити можна :D

Привіт Ternox ;D
(Історична фотографія, коли на каналі "Твій Семпай" ще немає мільйонів підписників)

Топ коментарі (4)

Звернути
 
yonabeef_dev profile image
yonabeef

Дуже мила штука

Звернути
 
__67b8a3b8a profile image
Вадим Титаренко

а, можна весь код купив 3 таких ындикатора

Звернути
 
systemctl profile image
Ілля

Доброго дня! Вибачаюсь за пізну відповідь. Ось код. Одразу попереджаю що я не програміст, тому може виглядати так собі. Але працює! В змінні ssid та password треба підставити дані від своєї WiFi мережі. Або можна переробити код так, щоб воно працювало і без інтернету.

#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <RTClib.h>
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>

const int oneWireBus = 2;
const char *ssid = "";
const char *password = "";
String h_hours, h_minutes, h_seconds;
String h_month_day, h_month;
int year;
byte div_step = 0;
unsigned long last_millis = 0;
unsigned long current_millis;
unsigned long temp_millis = 0;
DateTime now;

RTC_DS3231 rtc;
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 10800, 1000);

const char date_div[] = "\\|/-";
const char time_div[] = ": : ";

byte week_days[][10] = {
    {0x8D, 0xA5, 0xA4, 0x69, 0xAB, 0xEF, 0x20, 0x20, 0x20, 0x20}, // Неділя
    {0x8F, 0xAE, 0xAD, 0xA5, 0xA4, 0x69, 0xAB, 0xAE, 0xAA, 0x20}, // Понеділок
    {0x82, 0x69, 0xA2, 0xE2, 0xAE, 0xE0, 0xAE, 0xAA, 0x20, 0x20}, // Вівторок
    {0x91, 0xA5, 0xE0, 0xA5, 0xA4, 0xA0, 0x20, 0x20, 0x20, 0x20}, // Середа
    {0x97, 0xA5, 0xE2, 0xA2, 0xA5, 0xE0, 0x20, 0x20, 0x20, 0x20}, // Четвер
    {0x8F, 0x27, 0xEF, 0xE2, 0xAD, 0xA8, 0xE6, 0xEF, 0x20, 0x20}, // П'ятниця
    {0x91, 0xE3, 0xA1, 0xAE, 0xE2, 0xA0, 0x20, 0x20, 0x20, 0x20}  // Субота
};

OneWire oneWire(oneWireBus);
DallasTemperature sensors(&oneWire);

void setup()
{
    delay(10);
    WiFi.begin(ssid, password);
    Serial.begin(9600);
    sensors.begin();
    rtc.begin();
    clearVFD();
    Serial.print("Loading");
    while (WiFi.status() != WL_CONNECTED)
    {
        Serial.print('.');
        delay(175);
    }
    clearVFD();
    adjustRTCviaNTP();
    WiFi.disconnect();
    WiFi.mode(WIFI_OFF);
    WiFi.forceSleepBegin();
    now = rtc.now();
    drawTemp();
}

void loop()
{
    current_millis = millis();
    calculateTime();
    drawTime();
    if (current_millis - last_millis >= 500)
    {   
        now = rtc.now();
        div_step++;
        if (div_step > 3)
        {
            div_step = 0;
        }
        last_millis = current_millis;
    }
    if (current_millis - temp_millis >= 60000)
    {
        drawTemp();
        temp_millis = current_millis;
    }
}

String unitHandler(int unit)
{
    int a = unit / 10 % 10;
    int b = unit % 10;
    String complete_string = String(a) + String(b);
    return complete_string;
}

// byte place from 0x31 to 0x58 (1-40)
void setCursorVFD(byte place)
{
    //                        EOT  SOH      P           ETB
    byte cursor_position[] = {0x04, 0x01, 0x50, place, 0x17};
    Serial.write(cursor_position, sizeof(cursor_position));
}

void clearVFD()
{
    setCursorVFD(0x31);
    Serial.print("                                        ");
    setCursorVFD(0x31);
}

void drawTime()
{
    setCursorVFD(0x31);
    Serial.print(h_hours + time_div[div_step] + h_minutes + time_div[div_step] + h_seconds);
    setCursorVFD(0x45);
    Serial.write(week_days[now.dayOfTheWeek()], sizeof(week_days[now.dayOfTheWeek()]));
    setCursorVFD(0x4F);
    Serial.print(h_month_day + date_div[div_step] + h_month + date_div[div_step] + year);
}

void calculateTime()
{
    h_hours = unitHandler(now.hour());
    h_minutes = unitHandler(now.minute());
    h_seconds = unitHandler(now.second());
    h_month_day = unitHandler(now.day());
    h_month = unitHandler(now.month());
    year = now.year();
}

void adjustRTCviaNTP()
{
    timeClient.begin();
    timeClient.update();
    time_t epochTime = timeClient.getEpochTime();
    struct tm *ptm = gmtime((time_t *)&epochTime);
    rtc.adjust(DateTime(ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday, timeClient.getHours(), timeClient.getMinutes(), timeClient.getSeconds()));
    timeClient.end();
}

void drawTemp()
{
    setCursorVFD(0x3E);
    Serial.print(getTemp());
    Serial.write(0xF8);
    Serial.print('C');
}

float getTemp()
{
    sensors.requestTemperatures();
    float temperatureC = sensors.getTempCByIndex(0);
    return temperatureC;
}
Увімкніть повноекранний режим Вийти з повноекранного режиму
Звернути
 
__67b8a3b8a profile image
Вадим Титаренко

Гарний матеріал, дякую.

Куток

Підписуйтеся на наші соціальні мережі:
Telegram
Twitter
Facebook


Тепер у нас також є Youtube канал!