дисплей M202MD25C как подключить .
дисплей M202MD25C как подключить .
здравствуйте , есть такое чудо компании FUtaba M202MD25C .Нигде и ничего не могу найти на него.Вроде должен работать по RS232 . По маркировке дисплея , контроллера нет даже упоминаний. Писал в FUtaba а в ответ тишина. Читал что протокол у них как в 1602 HD44780 я с ним знаком хорошо и много чего делал на них , но как и кому посылать команды я пока не разобрался . Прошу помощи!!!
- Реклама
-
BlackKilkennyCat
- Собутыльник Кота
- Сообщения: 2905
- Зарегистрирован: Ср ноя 29, 2017 06:58:50
Re: дисплей M202MD25C как подключить .
ну хоть бы фото выложили, пины, деталей на плате дисплее, мож там надпись на микрухе, а не только нашлёпка... а так... ну разве что тут каждый второй с этим дисплеем работал, чё там, подумаешь, копеечная футаба, все сразу с ней после светодиодика 
мож поможет:
мож поможет:
Re: дисплей M202MD25C как подключить .
Извиняюсь что не прикрепил фото .
- Вложения
-
- WhatsApp Image 2020-11-27 at 21.08.16.jpeg
- (109.66 КБ) 534 скачивания
-
- WhatsApp Image 2020-11-27 at 21.08.15.jpeg
- (126.2 КБ) 425 скачиваний
-
- WhatsApp Image 2020-11-27 at 21.08.17.jpeg
- (161.45 КБ) 411 скачиваний
-
- WhatsApp Image 2020-11-27 at 21.08.16 (1).jpeg
- (172.44 КБ) 457 скачиваний
-
BlackKilkennyCat
- Собутыльник Кота
- Сообщения: 2905
- Зарегистрирован: Ср ноя 29, 2017 06:58:50
Re: дисплей M202MD25C как подключить .
Ну так это разработка по заказу https://www.dieboldnixdorf.com/ ,а не чисто футабовский продукт. можно попробовать как здесь: https://habr.com/ru/post/392757/
количество джамперов и пинов разъёма совпадают, но можно и проигорировать - на плате вижу подписи сигналов и контрольные точки. Большего особо и не нужно.
количество джамперов и пинов разъёма совпадают, но можно и проигорировать - на плате вижу подписи сигналов и контрольные точки. Большего особо и не нужно.
Re: дисплей M202MD25C как подключить .
Пробежался мультиметром по разъему боковому 14 пин и скажу что он не имеет контактов с обозначенными пятаками .Если пробовать искать их на плате то можно предположить что CLK это тактирование , SI -данные а что такое CTS lat , BK ,SO какой то странный протокол получается...
- Реклама
-
BlackKilkennyCat
- Собутыльник Кота
- Сообщения: 2905
- Зарегистрирован: Ср ноя 29, 2017 06:58:50
Re: дисплей M202MD25C как подключить .
это внутренние сигналы.
я бы экспериментировал с Rx Tx Clk
а вообще, проглядел бы пути от штатного разъёма, который, оказывается, по центру с металлическим корпусом.
Но думается мне, что так удаленно ничего не получится: обмениваться какими-то догадками это долго.
Напишите в никсдорфф, может они поделятся спецификацией
я бы экспериментировал с Rx Tx Clk
а вообще, проглядел бы пути от штатного разъёма, который, оказывается, по центру с металлическим корпусом.
Но думается мне, что так удаленно ничего не получится: обмениваться какими-то догадками это долго.
Напишите в никсдорфф, может они поделятся спецификацией
Re: дисплей M202MD25C как подключить .
С разъема в центре идет RX/TX на микросхему SP232AEN и с ее выходов 9 и 10 на точки на плате около контроллера .Понимаю что дисплей создан для работы по 232 ,но не могу понять в каком формате запихать туда по TX команды...
Re: дисплей M202MD25C как подключить .
Это обычный дисплей покупателя, магазинное оборудование.
https://kassastore.ru/upload/iblock/663 ... 221af9.bmp
https://docviewer.yandex.ru/view/0/?pag ... J9&lang=ru
Инфу по ним рыть нужно. Но народ что-то на них делает
http://monitor.espec.ws/section9/topic180280.html
https://zipstore.ru/blog/displei-pokupatelya-icd2002/
https://habr.com/ru/post/457352/
https://kassastore.ru/upload/iblock/663 ... 221af9.bmp
https://docviewer.yandex.ru/view/0/?pag ... J9&lang=ru
Инфу по ним рыть нужно. Но народ что-то на них делает
http://monitor.espec.ws/section9/topic180280.html
https://zipstore.ru/blog/displei-pokupatelya-icd2002/
https://habr.com/ru/post/457352/
Re: дисплей M202MD25C как подключить .
vdv22, имею аналогичный дисплей. Не могли бы вы проверить, есть ли ШИМ сигнал на затворе мофета рядом с трансформатором. У меня после подачи питания 5 В ток потребления 12-13 мА, статичный и нет ШИМ. Индикации тоже нет. Хотя, по идее, должна быть тестовая информация о дисплее
Re: дисплей M202MD25C как подключить .
Нашел я где выводы питания. Подал 12 В. Дисплей кратковременно засвечивает все сегменты и тухнет. Служебную информацию не выводит. Система команд неизвестна, скорость RS232 тоже.
В общем запустил. Решение было тут на форуме.
https://radiokot.ru/forum/viewtopic.php ... 6#p4240386
1. Запаял перемычку J3 (Parity OFF)
2. Сигнал с микроконтроллера подал напрямую на 9 ногу микросхемы *232.
3. При инициализации загрузил таблицу с кириллицей 1B 52 35 (или можно попробовать 1B 52 29
Дисплей оказался BA63, но набор комманд мне непонятен. Он схож с коммандами на дисплей LIUST-51. Я такой давно запускал. А перед этим запускал дисплей с коммандами EPSON и там все совсем по-другому. Комманды между собой несовместимы. У EPSON/POS7300 и подобных для инициализации надо послать в порт 1B 40. А для этого дисплея абсолютно это не надо.
И, судя по даташиту, который можно найти в указанной выше теме, дисплей имеет очень куцый набор команд.
В общем запустил. Решение было тут на форуме.
https://radiokot.ru/forum/viewtopic.php ... 6#p4240386
1. Запаял перемычку J3 (Parity OFF)
2. Сигнал с микроконтроллера подал напрямую на 9 ногу микросхемы *232.
3. При инициализации загрузил таблицу с кириллицей 1B 52 35 (или можно попробовать 1B 52 29
Дисплей оказался BA63, но набор комманд мне непонятен. Он схож с коммандами на дисплей LIUST-51. Я такой давно запускал. А перед этим запускал дисплей с коммандами EPSON и там все совсем по-другому. Комманды между собой несовместимы. У EPSON/POS7300 и подобных для инициализации надо послать в порт 1B 40. А для этого дисплея абсолютно это не надо.
И, судя по даташиту, который можно найти в указанной выше теме, дисплей имеет очень куцый набор команд.
Re: дисплей M202MD25C как подключить .
Приобрел таких немного за дешево, чисто поиграть. Лично мой ведет себя странно.
Про подключение и питание. Здесь кто-то обозначил CN3 на плате:
1. RX платы дисплея
2. пустой (на самом деле TX платы дисплея)
3. + питание
4. - земля
Еще вчера воткнул пятивольтовый блок питания, замкнув тестовую перемычку J6. Дисплей ожил, начал гонять тест. Радости не было предела, ибо нужен только один БП 5 вольт на всё. А вот сегодня этот фокус не прокатил. Странно. Пришлось цеплять 12 вольт.
С платы дисплея 5 вольт на ESP8266 взять не получилось. Схема питания не тянет себя, и еще ESP сверху.
TX ESP8266 => RX на CN3 работало. Но не долго. Даже получилось применить стандартный Serial со swap() на gpio15. Естественно с перемычкой J3.
А вот потом опять странности. Сначала перестало работать через CN3. Чего же тут странного, если уровни не те. Перекинул(ся) на 9 ногу конвертера 232. Некоторое время на gpio15 работало. Потом перестало. На ноге TX работает.
Ладно, будем как все (постараемся). Берем SoftwareSerial, пробуем со всеми доступными "ногами" ESP. Везде, кроме gpio15, работает. Меняю проц. Те же яйца, вид сбоку. Сюжет!?
Но человеку дан пытливый ум не только для набивки брюха.
Читаем РТФМ SoftwareSerial углубленно, делаем выводы, пробуем:
Убираем перемычку J3. Работает.

Про выбор столбцанемного переписал код, иначе такая хрень в виде буквы H появлялась на позициях дальше девятой.

Про подключение и питание. Здесь кто-то обозначил CN3 на плате:
1. RX платы дисплея
2. пустой (на самом деле TX платы дисплея)
3. + питание
4. - земля
Еще вчера воткнул пятивольтовый блок питания, замкнув тестовую перемычку J6. Дисплей ожил, начал гонять тест. Радости не было предела, ибо нужен только один БП 5 вольт на всё. А вот сегодня этот фокус не прокатил. Странно. Пришлось цеплять 12 вольт.
С платы дисплея 5 вольт на ESP8266 взять не получилось. Схема питания не тянет себя, и еще ESP сверху.
TX ESP8266 => RX на CN3 работало. Но не долго. Даже получилось применить стандартный Serial со swap() на gpio15. Естественно с перемычкой J3.
А вот потом опять странности. Сначала перестало работать через CN3. Чего же тут странного, если уровни не те. Перекинул(ся) на 9 ногу конвертера 232. Некоторое время на gpio15 работало. Потом перестало. На ноге TX работает.
Ладно, будем как все (постараемся). Берем SoftwareSerial, пробуем со всеми доступными "ногами" ESP. Везде, кроме gpio15, работает. Меняю проц. Те же яйца, вид сбоку. Сюжет!?
Но человеку дан пытливый ум не только для набивки брюха.
Код: Выделить всё
#include <SoftwareSerial.h>
#define MYPORT_TX D7
#define MYPORT_RX -1
SoftwareSerial myPort;
void setup()
{
myPort.begin(9600, SWSERIAL_8O1, MYPORT_RX, MYPORT_TX);Про выбор столбца
Код: Выделить всё
void set_cursor (uint8_t str, uint8_t col) { // установить курсор
// строка , колонка
myPort.write(0x1b);
myPort.write(0x5b);
myPort.write(0x30 + str);
myPort.write(0x3b);
if (col < 10) myPort.write(0x30 + col);
else if (col == 20) {myPort.write(0x32); myPort.write(0x30);}
else {myPort.write(0x31); myPort.write(0x30 + col%10);}
myPort.write(0x48);
}Re: дисплей M202MD25C как подключить .
[uquote="Mr. Monk",url="/forum/viewtopic.php?p=4314021#p4314021"]А вот потом опять странности. Сначала перестало работать через CN3.[/uquote] Поправка. Надо быть внимательнее, и не забывать про инвертирование сигнала на COM порту.
Собственно по подключению к ESP8266.
Подключился таки к CN3 на плате:
1. RX платы дисплея
2. пустой (на самом деле TX платы дисплея)
3. + питание
4. - земля
Если использовать стандартный Serial, то код должен быть таким:
Если использовать SoftwareSerial, то код должен быть таким:
Перемычка J3 не нужна.
Про регулировку яркости. Везде пишут про контакт BK. Решил попробовать. отрезал дорожку от 28 ноги процессора, BK подключил к ESP8266, analogWrite(D7, analog_Write);В общем работает. Но с нюансами. analogWrite в ESP8266 программный. Прилось выставить частоту analogWriteFreq(5000);, иначе получался стробоскоп.
Собственно по подключению к ESP8266.
Подключился таки к CN3 на плате:
1. RX платы дисплея
2. пустой (на самом деле TX платы дисплея)
3. + питание
4. - земля
Если использовать стандартный Serial, то код должен быть таким:
Код: Выделить всё
void setup()
{
// HardwareSerial::begin(unsigned long baud, SerialConfig config, SerialMode mode, uint8_t tx_pin, bool invert)
Serial.begin(9600, SERIAL_8O1, SERIAL_TX_ONLY, 1, true);
Serial.swap(); //Пины переместятся на GPIO15/D8 (TX) и GPIO13/D7 (RX)
Serial.flush();Код: Выделить всё
#include <SoftwareSerial.h>
SoftwareSerial myPort;
void setup()
{
// begin(baud, config, rxPin, txPin, m_invert);
myPort.begin(9600, SWSERIAL_8O1, MYPORT_RX, MYPORT_TX, true);
Про регулировку яркости. Везде пишут про контакт BK. Решил попробовать. отрезал дорожку от 28 ноги процессора, BK подключил к ESP8266, analogWrite(D7, analog_Write);
Спойлер
Re: дисплей M202MD25C как подключить .
Нашел статью про часы на этих модулях
https://cxem.net/arduino/arduino250.php ... d693179637
Но не нравится наличие дорогих модулей и датчиков в обвесе.
И ждать их из китая долго. И не присылают иногда вообще.
https://cxem.net/arduino/arduino250.php ... d693179637
Но не нравится наличие дорогих модулей и датчиков в обвесе.
И ждать их из китая долго. И не присылают иногда вообще.
Re: дисплей M202MD25C как подключить .
[uquote="zenner",url="/forum/viewtopic.php?p=4321388#p4321388"]Нашел статью про часы на этих модулях[/uquote]
Не-а, не на этих.
[uquote="zenner",url="/forum/viewtopic.php?p=4321388#p4321388"]Но не нравится наличие дорогих модулей и датчиков в обвесе.[/uquote]
Смотря что Вам от устройства требуется. Барометры с влажностью - да, не по детски подорожали. Сразу в 10 раз год назад. Сейчас вроде цена падает. Недавно BME280 чуть дороже 200 рублей брал. От RTC можно отказаться при наличии интернета и ESP.
[uquote="zenner",url="/forum/viewtopic.php?p=4321388#p4321388"]И ждать их из китая долго. И не присылают иногда вообще.[/uquote]
Раз на раз не приходится. Бывает, что теряется посылка. У меня за последние 10 лет раза три или четыре точно. А насчет "долго"... Займитесь чем нибудь интересным. Корпус например для часов сделайте. Месяц быстро пролетит.
Не-а, не на этих.
[uquote="zenner",url="/forum/viewtopic.php?p=4321388#p4321388"]Но не нравится наличие дорогих модулей и датчиков в обвесе.[/uquote]
Смотря что Вам от устройства требуется. Барометры с влажностью - да, не по детски подорожали. Сразу в 10 раз год назад. Сейчас вроде цена падает. Недавно BME280 чуть дороже 200 рублей брал. От RTC можно отказаться при наличии интернета и ESP.
[uquote="zenner",url="/forum/viewtopic.php?p=4321388#p4321388"]И ждать их из китая долго. И не присылают иногда вообще.[/uquote]
Раз на раз не приходится. Бывает, что теряется посылка. У меня за последние 10 лет раза три или четыре точно. А насчет "долго"... Займитесь чем нибудь интересным. Корпус например для часов сделайте. Месяц быстро пролетит.
Re: дисплей M202MD25C как подключить .
Спасибо конечно за совет клеить корпуса, но у меня более плотный график и есть чем заняться.
Есть у меня кучка модулей похожих, вот думаю что-то на них сделать интересное.
Но нет нормальных схем в сети на них. Всё что есть, всё ардуиновское или глумное по сути.
На счёт разных модулей- так у них у всех протокол по витой паре практически одинаков.
Есть у меня кучка модулей похожих, вот думаю что-то на них сделать интересное.
Но нет нормальных схем в сети на них. Всё что есть, всё ардуиновское или глумное по сути.
На счёт разных модулей- так у них у всех протокол по витой паре практически одинаков.
Re: дисплей M202MD25C как подключить .
В общем сделал автоматическую регулировку яркости.
Напомню, отрезал дорожку от проца к контакту BK, подключил контакт BK к ESP8266.
В setup вставил analogWriteFreq(5000);, иначе стробоскоп на экране.
И куда нибудь в цЫкл:
Напомню, отрезал дорожку от проца к контакту BK, подключил контакт BK к ESP8266.
В setup вставил analogWriteFreq(5000);, иначе стробоскоп на экране.
И куда нибудь в цЫкл:
Код: Выделить всё
analogWrite(D7, 250 - analogRead(A0)/7);Спойлер
Re: дисплей M202MD25C как подключить .
[uquote="Mr. Monk",url="/forum/viewtopic.php?p=4321497#p4321497"]В общем сделал автоматическую регулировку яркости.
Напомню, отрезал дорожку от проца к контакту BK, подключил контакт BK к ESP8266.
В setup вставил analogWriteFreq(5000);, иначе стробоскоп на экране.
И куда нибудь в цЫкл:
[/uquote]
Привет. А скетчем для esp8266 поделишься?
Напомню, отрезал дорожку от проца к контакту BK, подключил контакт BK к ESP8266.
В setup вставил analogWriteFreq(5000);, иначе стробоскоп на экране.
И куда нибудь в цЫкл:
Код: Выделить всё
analogWrite(D7, 250 - analogRead(A0)/7);Спойлер
Привет. А скетчем для esp8266 поделишься?
Re: дисплей M202MD25C как подключить .
[uquote="alakond",url="/forum/viewtopic.php?p=4695696#p4695696"]Привет. А скетчем для esp8266 поделишься?[/uquote]
Что конкретно интересует? Я его, дисплей, довольно глубоко в скетч интегрировал. Могу вкладку конкретно для дисплея выложить. Может какие-нибудь вопросы по управлению интересуют?
Что конкретно интересует? Я его, дисплей, довольно глубоко в скетч интегрировал. Могу вкладку конкретно для дисплея выложить. Может какие-нибудь вопросы по управлению интересуют?
Re: дисплей M202MD25C как подключить .
[uquote="Mr. Monk",url="/forum/viewtopic.php?p=4695708#p4695708"][uquote="alakond",url="/forum/viewtopic.php?p=4695696#p4695696"]Привет. А скетчем для esp8266 поделишься?[/uquote]
Что конкретно интересует? Я его, дисплей, довольно глубоко в скетч интегрировал. Могу вкладку конкретно для дисплея выложить. Может какие-нибудь вопросы по управлению интересуют?[/uquote]
Дисплей попал в руки, решил часы сделать. Так что интересует скетч для управления дисплеем. А если наглеть, то сразу скетч под часы.
Что конкретно интересует? Я его, дисплей, довольно глубоко в скетч интегрировал. Могу вкладку конкретно для дисплея выложить. Может какие-нибудь вопросы по управлению интересуют?[/uquote]
Дисплей попал в руки, решил часы сделать. Так что интересует скетч для управления дисплеем. А если наглеть, то сразу скетч под часы.
Re: дисплей M202MD25C как подключить .
[uquote="alakond",url="/forum/viewtopic.php?p=4695709#p4695709"]Дисплей попал в руки, решил часы сделать. Так что интересует скетч для управления дисплеем. А если наглеть, то сразу скетч под часы.[/uquote]
Ну как то так для начала.
void showTime()
{
String outVFD1, outVFD2;
analogWrite(BK_pin, 215 - analogRead(A0)/5); // Яркость
countShT++;
// =============== collectTime(outVFD1);
if (NTPtimeGet || DS3231_present)
{
outVFD1 = FPSTR(day_of_weekVFD[dayOfWeek]);
outVFD1 += addZero(dayOfMonth, 2, " ");
outVFD1 += ".";
outVFD1 += addZero(monthDS, 2, "0");
outVFD1 += ".";
outVFD1 += addZero(yearDS, 2, "0");
outVFD1 += " ";
outVFD1 += addZero(hourDS, 2, "0");
outVFD1 += hither_thither ? ":" : "\376";
outVFD1 += addZero(minuteDS, 2, "0");
outVFD1 += hither_thither ? ":" : "\376";
outVFD1 += addZero(secondDS, 2, "0");
hither_thither = !hither_thither;
}
else
{
outVFD1 = FPSTR(txtVFD[0]); // ВРЕМЯ НЕ ПОЛУЧЕНО
}
//=================
#if defined(Desk_Clock)
//=================
// =============== Первый экран
if (countShT < 7)
{
if (CLIMATE_present)
{
if (Weather_t >= 0) outVFD2 = "+";
outVFD2 += Weather_t;
outVFD2 += F("\370 ");
outVFD2 += Weather_h;
outVFD2 += "%";
}
else
{
outVFD2 = descr_Weather;
outVFD2 += FPSTR(txtVFD[2]); // НЕ ПОДКЛЮЧЕН
countShT = 9;
}
}
// =============== Второй экран
#ifdef BME280
else if (countShT > 6 && countShT < 10)
{
if (CLIMATE_present)
{
outVFD2 = F("Давление ");
outVFD2 += Weather_p;
outVFD2 += F("mHg");
}
else
{
outVFD2 = descr_Weather;
outVFD2 += FPSTR(txtVFD[2]); // НЕ ПОДКЛЮЧЕН
countShT = 9;
}
}
#else
else if (countShT > 6 && countShT < 10)
{
outVFD2 = F("Давление неизвестно");
countShT = 9;
}
#endif
// =============== Третий экран
else if (countShT > 9 && countShT < 13)
{
#if defined(DallaS)
if (DS18B20_present)
{
outVFD2 = descr_DS18B20;
outVFD2 += " ";
if (DS18B20_t >= 0) outVFD2 += "+";
outVFD2 += DS18B20_t;
outVFD2 += F("\370");
}
else
{
outVFD2 = descr_DS18B20;
outVFD2 += FPSTR(txtVFD[2]); // НЕ ПОДКЛЮЧЕН
countShT = 12;
}
#else
#endif
}
// =============== Четвертый экран
else if (countShT > 12 && countShT < 15)
{
if (WiFi.status() == WL_CONNECTED)
{
outVFD2 = WiFi.SSID();
outVFD2 += " ";
outVFD2 += WiFi.RSSI();
outVFD2 += F(" dbm");
}
else
{
outVFD2 = F("Wi-Fi");
outVFD2 += FPSTR(txtVFD[2]); // НЕ ПОДКЛЮЧЕН
countShT = 0;
}
if (countShT == 14) countShT = 0;
}
//=================
#elif defined(Weather_St)
//=================
// =============== Первый экран
if (countShT < 7)
{
#if defined(DallaS)
if (DS18B20_present)
{
outVFD1 = descr_DS18B20;
String DS18B20_tS;
if (DS18B20_t >= 0) DS18B20_tS = "+";
DS18B20_tS += DS18B20_t;
uint8_t i = 0;
uint8_t ii = DS18B20_tS.length() < 6 ? 8 : 9; // количество знакомест в температуре
uint8_t iii = outVFD1.length(); // количество байтов в названии
while (iii--) {if (outVFD1[iii]==0xd1 || outVFD1[iii]==0xd0) i++;} // считаем количество русских букв
iii = NUMofCOL - outVFD1.length() + i - ii; // сколько нужно пустых знакомест в начале?
while (iii--) outVFD1 += " "; // набиваем...
outVFD1 += DS18B20_tS;
outVFD1 += F("\370");
iii = NUMofCOL - outVFD1.length() + i - 1; // сколько нужно пустых знакомест в конце?
while (iii--) outVFD1 += " "; // добиваем...
if (countShT == 1 || countShT == 4) outVFD1 += "/";
else if (countShT == 2 || countShT == 5) outVFD1 += "-";
else if (countShT == 3 || countShT == 6) outVFD1 += "\\";
}
#endif
if (CLIMATE_present)
{
outVFD2 = descr_Weather;
String Weather_tS;
if (Weather_t >= 0) Weather_tS = "+";
Weather_tS += Weather_t;
uint8_t i = 0;
uint8_t ii = Weather_tS.length() < 6 ? 8 : 9; // количество знакомест в температуре
uint8_t iii = outVFD2.length(); // количество байтов в названии
while (iii--) {if (outVFD2[iii]==0xd1 || outVFD2[iii]==0xd0) i++;} // считаем количество русских букв
iii = NUMofCOL - outVFD2.length() + i - ii; // сколько нужно пустых знакомест между?
while (iii--) outVFD2 += " "; // набиваем...
outVFD2 += Weather_tS;
outVFD2 += F("\370");
iii = NUMofCOL - outVFD2.length() + i; // сколько нужно пустых знакомест в конце?
while (iii--) outVFD2 += " "; // добиваем...
}
else
{
outVFD2 = descr_Weather;
outVFD2 += FPSTR(txtVFD[2]); // НЕ ПОДКЛЮЧЕН
}
}
// =============== Второй экран
else if (countShT > 6 && countShT < 10)
{
if (CLIMATE_present)
{
outVFD2 = Weather_h;
outVFD2 += "%";
#ifdef BME280
outVFD2 += F(" ");
outVFD2 += Weather_p;
outVFD2 += F(" mHg");
#endif
}
else
{
outVFD2 = descr_Weather;
outVFD2 += FPSTR(txtVFD[2]); // НЕ ПОДКЛЮЧЕН
}
if (countShT == 9) countShT = 0;
}
#endif
print_on_VFDa(1, outVFD1, " ");
print_on_VFDa(2, outVFD2, " ");
}
void Set_country_code(uint8_t country_code) // ESCRn (1B 52 35)
{
Serial.print(F("\x1BR") + String(country_code)); delay (100);
// выбор кодовой страницы рус - но печатать из под ардуино сможет только после обработки кодером из cp1251 в cp866
}
void CLS() // очистка экрана ESC[2J (1B 5B 32 4A)
{
Serial.print(F("\x1B[2J")); delay (100);
}
void set_cursor (uint8_t _row, uint8_t _column) // установить курсор ESC[row;columnH (1B 5B row 3B column 48)
{
Serial.print(F("\x1B[") + String(_row) + ";" + String(_column) + "H");
}
void print_on_VFD(uint8_t _row, uint8_t _column, const String& txtVFD) // Строка, колонка, текст
{
set_cursor(_row, _column); Serial.print(txtVFD);
}
void print_on_VFDa(uint8_t _row, const String& txtVFD, String what) // Строка, текст, чем забиваем пустоту
{
String utf8_cp866 = UTF8_CP866(txtVFD);
int iii = NUMofCOL - utf8_cp866.length();
if (iii > 0)
{
int left = (iii) / 2;
while (left--) utf8_cp866 = what + utf8_cp866;
while (utf8_cp866.length() < NUMofCOL) utf8_cp866 = utf8_cp866 + what;
}
else
{
utf8_cp866 = utf8_cp866.substring(0, NUMofCOL); // берем с "нулевого" до размера экрана
}
set_cursor(_row, 1); Serial.print(utf8_cp866);
}
void write_on_VFD(uint8_t _row, uint8_t _column, int16_t symbolVFD) // Строка, колонка, текст
{
set_cursor(_row, _column); Serial.write(symbolVFD);
}
String UTF8_CP866(const String& txtVFD)
{
char out[NUMofCOL]; // создали массив символов для вывода
int j=-1;
for (int i=0; i < txtVFD.length() + 1; i++) //-- Пробегаемся по всем символам, учитываем отличия между таблицами
{
j++;
if (txtVFD==0xd0) // коды русских букв все двухбайтовые, первым из которых является 0xd0 (208) или 0xd1 (209)
{
i++; // следующий конвертим
if (txtVFD >= 0x90 && txtVFD <= 0xBF) out[j] = txtVFD - 0x10;
else if(txtVFD == 0x81) out[j] = 0xf0; // буква Ё
}
else if (txtVFD==0xd1)
{
i++; // следующий конвертим
if (txtVFD >= 0x80 && txtVFD <= 0x8F) out[j] = txtVFD + 0x60;
else if(txtVFD == 0x91) out[j] = 0xf1; // буква ё
}
else out[j] = txtVFD[i];
}
return out;
}
void init_VFDser()
{
Serial.begin(9600, SERIAL_8O1, SERIAL_TX_ONLY, 1, true);
Serial.swap(); //Пины переместятся на GPIO15/D8 (TX) и GPIO13/D7 (RX)
Serial.flush();
analogWriteFreq(5000);
analogWrite(BK_pin, 250 - analogRead(A0)/7); // Яркость
CLS();
Set_country_code(0x35);
print_on_VFDa(1, F("Загружается версия"), " ");
print_on_VFDa(2, nSketch, " ");
delay(1000);
}
#endif
Ну как то так для начала.
Спойлер
#ifdef VFDservoid showTime()
{
String outVFD1, outVFD2;
analogWrite(BK_pin, 215 - analogRead(A0)/5); // Яркость
countShT++;
// =============== collectTime(outVFD1);
if (NTPtimeGet || DS3231_present)
{
outVFD1 = FPSTR(day_of_weekVFD[dayOfWeek]);
outVFD1 += addZero(dayOfMonth, 2, " ");
outVFD1 += ".";
outVFD1 += addZero(monthDS, 2, "0");
outVFD1 += ".";
outVFD1 += addZero(yearDS, 2, "0");
outVFD1 += " ";
outVFD1 += addZero(hourDS, 2, "0");
outVFD1 += hither_thither ? ":" : "\376";
outVFD1 += addZero(minuteDS, 2, "0");
outVFD1 += hither_thither ? ":" : "\376";
outVFD1 += addZero(secondDS, 2, "0");
hither_thither = !hither_thither;
}
else
{
outVFD1 = FPSTR(txtVFD[0]); // ВРЕМЯ НЕ ПОЛУЧЕНО
}
//=================
#if defined(Desk_Clock)
//=================
// =============== Первый экран
if (countShT < 7)
{
if (CLIMATE_present)
{
if (Weather_t >= 0) outVFD2 = "+";
outVFD2 += Weather_t;
outVFD2 += F("\370 ");
outVFD2 += Weather_h;
outVFD2 += "%";
}
else
{
outVFD2 = descr_Weather;
outVFD2 += FPSTR(txtVFD[2]); // НЕ ПОДКЛЮЧЕН
countShT = 9;
}
}
// =============== Второй экран
#ifdef BME280
else if (countShT > 6 && countShT < 10)
{
if (CLIMATE_present)
{
outVFD2 = F("Давление ");
outVFD2 += Weather_p;
outVFD2 += F("mHg");
}
else
{
outVFD2 = descr_Weather;
outVFD2 += FPSTR(txtVFD[2]); // НЕ ПОДКЛЮЧЕН
countShT = 9;
}
}
#else
else if (countShT > 6 && countShT < 10)
{
outVFD2 = F("Давление неизвестно");
countShT = 9;
}
#endif
// =============== Третий экран
else if (countShT > 9 && countShT < 13)
{
#if defined(DallaS)
if (DS18B20_present)
{
outVFD2 = descr_DS18B20;
outVFD2 += " ";
if (DS18B20_t >= 0) outVFD2 += "+";
outVFD2 += DS18B20_t;
outVFD2 += F("\370");
}
else
{
outVFD2 = descr_DS18B20;
outVFD2 += FPSTR(txtVFD[2]); // НЕ ПОДКЛЮЧЕН
countShT = 12;
}
#else
#endif
}
// =============== Четвертый экран
else if (countShT > 12 && countShT < 15)
{
if (WiFi.status() == WL_CONNECTED)
{
outVFD2 = WiFi.SSID();
outVFD2 += " ";
outVFD2 += WiFi.RSSI();
outVFD2 += F(" dbm");
}
else
{
outVFD2 = F("Wi-Fi");
outVFD2 += FPSTR(txtVFD[2]); // НЕ ПОДКЛЮЧЕН
countShT = 0;
}
if (countShT == 14) countShT = 0;
}
//=================
#elif defined(Weather_St)
//=================
// =============== Первый экран
if (countShT < 7)
{
#if defined(DallaS)
if (DS18B20_present)
{
outVFD1 = descr_DS18B20;
String DS18B20_tS;
if (DS18B20_t >= 0) DS18B20_tS = "+";
DS18B20_tS += DS18B20_t;
uint8_t i = 0;
uint8_t ii = DS18B20_tS.length() < 6 ? 8 : 9; // количество знакомест в температуре
uint8_t iii = outVFD1.length(); // количество байтов в названии
while (iii--) {if (outVFD1[iii]==0xd1 || outVFD1[iii]==0xd0) i++;} // считаем количество русских букв
iii = NUMofCOL - outVFD1.length() + i - ii; // сколько нужно пустых знакомест в начале?
while (iii--) outVFD1 += " "; // набиваем...
outVFD1 += DS18B20_tS;
outVFD1 += F("\370");
iii = NUMofCOL - outVFD1.length() + i - 1; // сколько нужно пустых знакомест в конце?
while (iii--) outVFD1 += " "; // добиваем...
if (countShT == 1 || countShT == 4) outVFD1 += "/";
else if (countShT == 2 || countShT == 5) outVFD1 += "-";
else if (countShT == 3 || countShT == 6) outVFD1 += "\\";
}
#endif
if (CLIMATE_present)
{
outVFD2 = descr_Weather;
String Weather_tS;
if (Weather_t >= 0) Weather_tS = "+";
Weather_tS += Weather_t;
uint8_t i = 0;
uint8_t ii = Weather_tS.length() < 6 ? 8 : 9; // количество знакомест в температуре
uint8_t iii = outVFD2.length(); // количество байтов в названии
while (iii--) {if (outVFD2[iii]==0xd1 || outVFD2[iii]==0xd0) i++;} // считаем количество русских букв
iii = NUMofCOL - outVFD2.length() + i - ii; // сколько нужно пустых знакомест между?
while (iii--) outVFD2 += " "; // набиваем...
outVFD2 += Weather_tS;
outVFD2 += F("\370");
iii = NUMofCOL - outVFD2.length() + i; // сколько нужно пустых знакомест в конце?
while (iii--) outVFD2 += " "; // добиваем...
}
else
{
outVFD2 = descr_Weather;
outVFD2 += FPSTR(txtVFD[2]); // НЕ ПОДКЛЮЧЕН
}
}
// =============== Второй экран
else if (countShT > 6 && countShT < 10)
{
if (CLIMATE_present)
{
outVFD2 = Weather_h;
outVFD2 += "%";
#ifdef BME280
outVFD2 += F(" ");
outVFD2 += Weather_p;
outVFD2 += F(" mHg");
#endif
}
else
{
outVFD2 = descr_Weather;
outVFD2 += FPSTR(txtVFD[2]); // НЕ ПОДКЛЮЧЕН
}
if (countShT == 9) countShT = 0;
}
#endif
print_on_VFDa(1, outVFD1, " ");
print_on_VFDa(2, outVFD2, " ");
}
void Set_country_code(uint8_t country_code) // ESCRn (1B 52 35)
{
Serial.print(F("\x1BR") + String(country_code)); delay (100);
// выбор кодовой страницы рус - но печатать из под ардуино сможет только после обработки кодером из cp1251 в cp866
}
void CLS() // очистка экрана ESC[2J (1B 5B 32 4A)
{
Serial.print(F("\x1B[2J")); delay (100);
}
void set_cursor (uint8_t _row, uint8_t _column) // установить курсор ESC[row;columnH (1B 5B row 3B column 48)
{
Serial.print(F("\x1B[") + String(_row) + ";" + String(_column) + "H");
}
void print_on_VFD(uint8_t _row, uint8_t _column, const String& txtVFD) // Строка, колонка, текст
{
set_cursor(_row, _column); Serial.print(txtVFD);
}
void print_on_VFDa(uint8_t _row, const String& txtVFD, String what) // Строка, текст, чем забиваем пустоту
{
String utf8_cp866 = UTF8_CP866(txtVFD);
int iii = NUMofCOL - utf8_cp866.length();
if (iii > 0)
{
int left = (iii) / 2;
while (left--) utf8_cp866 = what + utf8_cp866;
while (utf8_cp866.length() < NUMofCOL) utf8_cp866 = utf8_cp866 + what;
}
else
{
utf8_cp866 = utf8_cp866.substring(0, NUMofCOL); // берем с "нулевого" до размера экрана
}
set_cursor(_row, 1); Serial.print(utf8_cp866);
}
void write_on_VFD(uint8_t _row, uint8_t _column, int16_t symbolVFD) // Строка, колонка, текст
{
set_cursor(_row, _column); Serial.write(symbolVFD);
}
String UTF8_CP866(const String& txtVFD)
{
char out[NUMofCOL]; // создали массив символов для вывода
int j=-1;
for (int i=0; i < txtVFD.length() + 1; i++) //-- Пробегаемся по всем символам, учитываем отличия между таблицами
{
j++;
if (txtVFD==0xd0) // коды русских букв все двухбайтовые, первым из которых является 0xd0 (208) или 0xd1 (209)
{
i++; // следующий конвертим
if (txtVFD >= 0x90 && txtVFD <= 0xBF) out[j] = txtVFD - 0x10;
else if(txtVFD == 0x81) out[j] = 0xf0; // буква Ё
}
else if (txtVFD==0xd1)
{
i++; // следующий конвертим
if (txtVFD >= 0x80 && txtVFD <= 0x8F) out[j] = txtVFD + 0x60;
else if(txtVFD == 0x91) out[j] = 0xf1; // буква ё
}
else out[j] = txtVFD[i];
}
return out;
}
void init_VFDser()
{
Serial.begin(9600, SERIAL_8O1, SERIAL_TX_ONLY, 1, true);
Serial.swap(); //Пины переместятся на GPIO15/D8 (TX) и GPIO13/D7 (RX)
Serial.flush();
analogWriteFreq(5000);
analogWrite(BK_pin, 250 - analogRead(A0)/7); // Яркость
CLS();
Set_country_code(0x35);
print_on_VFDa(1, F("Загружается версия"), " ");
print_on_VFDa(2, nSketch, " ");
delay(1000);
}
#endif


