дисплей M202MD25C как подключить .
- Сообщения: 39
- Зарегистрирован: Чт июн 08, 2017 17:52:33
здравствуйте , есть такое чудо компании FUtaba M202MD25C .Нигде и ничего не могу найти на него.Вроде должен работать по RS232 . По маркировке дисплея , контроллера нет даже упоминаний. Писал в FUtaba а в ответ тишина. Читал что протокол у них как в 1602 HD44780 я с ним знаком хорошо и много чего делал на них , но как и кому посылать команды я пока не разобрался . Прошу помощи!!!
- Реклама
- Сообщения: 2905
- Зарегистрирован: Ср ноя 29, 2017 06:58:50
ну хоть бы фото выложили, пины, деталей на плате дисплее, мож там надпись на микрухе, а не только нашлёпка... а так... ну разве что тут каждый второй с этим дисплеем работал, чё там, подумаешь, копеечная футаба, все сразу с ней после светодиодика 
мож поможет:
мож поможет:
- Сообщения: 39
- Зарегистрирован: Чт июн 08, 2017 17:52:33
Извиняюсь что не прикрепил фото .
- Вложения
-
- WhatsApp Image 2020-11-27 at 21.08.16.jpeg
- (109.66 КБ) 544 скачивания
-
- WhatsApp Image 2020-11-27 at 21.08.15.jpeg
- (126.2 КБ) 427 скачиваний
-
- WhatsApp Image 2020-11-27 at 21.08.17.jpeg
- (161.45 КБ) 417 скачиваний
-
- WhatsApp Image 2020-11-27 at 21.08.16 (1).jpeg
- (172.44 КБ) 462 скачивания
- Сообщения: 2905
- Зарегистрирован: Ср ноя 29, 2017 06:58:50
Ну так это разработка по заказу https://www.dieboldnixdorf.com/ ,а не чисто футабовский продукт. можно попробовать как здесь: https://habr.com/ru/post/392757/
количество джамперов и пинов разъёма совпадают, но можно и проигорировать - на плате вижу подписи сигналов и контрольные точки. Большего особо и не нужно.
количество джамперов и пинов разъёма совпадают, но можно и проигорировать - на плате вижу подписи сигналов и контрольные точки. Большего особо и не нужно.
- Сообщения: 39
- Зарегистрирован: Чт июн 08, 2017 17:52:33
Пробежался мультиметром по разъему боковому 14 пин и скажу что он не имеет контактов с обозначенными пятаками .Если пробовать искать их на плате то можно предположить что CLK это тактирование , SI -данные а что такое CTS lat , BK ,SO какой то странный протокол получается...
- Реклама
- Сообщения: 2905
- Зарегистрирован: Ср ноя 29, 2017 06:58:50
это внутренние сигналы.
я бы экспериментировал с Rx Tx Clk
а вообще, проглядел бы пути от штатного разъёма, который, оказывается, по центру с металлическим корпусом.
Но думается мне, что так удаленно ничего не получится: обмениваться какими-то догадками это долго.
Напишите в никсдорфф, может они поделятся спецификацией
я бы экспериментировал с Rx Tx Clk
а вообще, проглядел бы пути от штатного разъёма, который, оказывается, по центру с металлическим корпусом.
Но думается мне, что так удаленно ничего не получится: обмениваться какими-то догадками это долго.
Напишите в никсдорфф, может они поделятся спецификацией
- Сообщения: 39
- Зарегистрирован: Чт июн 08, 2017 17:52:33
С разъема в центре идет RX/TX на микросхему SP232AEN и с ее выходов 9 и 10 на точки на плате около контроллера .Понимаю что дисплей создан для работы по 232 ,но не могу понять в каком формате запихать туда по TX команды...
Это обычный дисплей покупателя, магазинное оборудование.
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/
vdv22, имею аналогичный дисплей. Не могли бы вы проверить, есть ли ШИМ сигнал на затворе мофета рядом с трансформатором. У меня после подачи питания 5 В ток потребления 12-13 мА, статичный и нет ШИМ. Индикации тоже нет. Хотя, по идее, должна быть тестовая информация о дисплее
Нашел я где выводы питания. Подал 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. А для этого дисплея абсолютно это не надо.
И, судя по даташиту, который можно найти в указанной выше теме, дисплей имеет очень куцый набор команд.
- Сообщения: 7
- Зарегистрирован: Ср ноя 02, 2022 21:55:40
Приобрел таких немного за дешево, чисто поиграть. Лично мой ведет себя странно.
Про подключение и питание. Здесь кто-то обозначил 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);
}- Сообщения: 7
- Зарегистрирован: Ср ноя 02, 2022 21:55:40
[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);
Спойлер
Нашел статью про часы на этих модулях
https://cxem.net/arduino/arduino250.php ... d693179637
Но не нравится наличие дорогих модулей и датчиков в обвесе.
И ждать их из китая долго. И не присылают иногда вообще.
https://cxem.net/arduino/arduino250.php ... d693179637
Но не нравится наличие дорогих модулей и датчиков в обвесе.
И ждать их из китая долго. И не присылают иногда вообще.
- Сообщения: 7
- Зарегистрирован: Ср ноя 02, 2022 21:55:40
[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 лет раза три или четыре точно. А насчет "долго"... Займитесь чем нибудь интересным. Корпус например для часов сделайте. Месяц быстро пролетит.
Спасибо конечно за совет клеить корпуса, но у меня более плотный график и есть чем заняться.
Есть у меня кучка модулей похожих, вот думаю что-то на них сделать интересное.
Но нет нормальных схем в сети на них. Всё что есть, всё ардуиновское или глумное по сути.
На счёт разных модулей- так у них у всех протокол по витой паре практически одинаков.
Есть у меня кучка модулей похожих, вот думаю что-то на них сделать интересное.
Но нет нормальных схем в сети на них. Всё что есть, всё ардуиновское или глумное по сути.
На счёт разных модулей- так у них у всех протокол по витой паре практически одинаков.
- Сообщения: 7
- Зарегистрирован: Ср ноя 02, 2022 21:55:40
В общем сделал автоматическую регулировку яркости.
Напомню, отрезал дорожку от проца к контакту BK, подключил контакт BK к ESP8266.
В setup вставил analogWriteFreq(5000);, иначе стробоскоп на экране.
И куда нибудь в цЫкл:
Напомню, отрезал дорожку от проца к контакту BK, подключил контакт BK к ESP8266.
В setup вставил analogWriteFreq(5000);, иначе стробоскоп на экране.
И куда нибудь в цЫкл:
Код: Выделить всё
analogWrite(D7, 250 - analogRead(A0)/7);Спойлер
- Сообщения: 19
- Зарегистрирован: Вт май 31, 2016 20:04:06
[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 поделишься?
- Сообщения: 7
- Зарегистрирован: Ср ноя 02, 2022 21:55:40
[uquote="alakond",url="/forum/viewtopic.php?p=4695696#p4695696"]Привет. А скетчем для esp8266 поделишься?[/uquote]
Что конкретно интересует? Я его, дисплей, довольно глубоко в скетч интегрировал. Могу вкладку конкретно для дисплея выложить. Может какие-нибудь вопросы по управлению интересуют?
Что конкретно интересует? Я его, дисплей, довольно глубоко в скетч интегрировал. Могу вкладку конкретно для дисплея выложить. Может какие-нибудь вопросы по управлению интересуют?
- Сообщения: 19
- Зарегистрирован: Вт май 31, 2016 20:04:06
[uquote="Mr. Monk",url="/forum/viewtopic.php?p=4695708#p4695708"][uquote="alakond",url="/forum/viewtopic.php?p=4695696#p4695696"]Привет. А скетчем для esp8266 поделишься?[/uquote]
Что конкретно интересует? Я его, дисплей, довольно глубоко в скетч интегрировал. Могу вкладку конкретно для дисплея выложить. Может какие-нибудь вопросы по управлению интересуют?[/uquote]
Дисплей попал в руки, решил часы сделать. Так что интересует скетч для управления дисплеем. А если наглеть, то сразу скетч под часы.
Что конкретно интересует? Я его, дисплей, довольно глубоко в скетч интегрировал. Могу вкладку конкретно для дисплея выложить. Может какие-нибудь вопросы по управлению интересуют?[/uquote]
Дисплей попал в руки, решил часы сделать. Так что интересует скетч для управления дисплеем. А если наглеть, то сразу скетч под часы.
- Сообщения: 7
- Зарегистрирован: Ср ноя 02, 2022 21:55:40
[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


