Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Пн май 29, 2023 15:20:14

Сегодня пильнул платку ba63, чтоб влезала в бутылку через донышко пиленное снизу прям в торец..
плату отрезал в ширину - вверху по жёлтой полоске шелкографии, а по низу как видно на фотке.
В итоге влетело легко и никакие важные дорожки не перерезаются.
Платки есп8266 и клок с батарейкой запаиваю на укороченных штырях -зачищая маску на плате индикатора,
ba63 хорошо будет показывать только текст из за особенности самой колбы, большие цифры не очень будут смотреться..
по этому и морочиться не стану.
https://cloud.mail.ru/public/TTe2/Nb5bcKzUs.

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Пн май 29, 2023 18:23:59

Забавно вышло

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Сб июн 03, 2023 15:10:36

нашел фотки своих индикаторов
1 обычный с внешним контроллером
второй с драйвером в стекле

Изображение Изображение Изображение

сейчас еще есть возможность на ебее купить 2 штуки за 6 евров
и еще я нашел по 2.50 за штуку и можно даже в берлине взять и не платить за доставку

которые на фотках я их тоже за копейки взял давно

остался вопрос, можно ли их запитать от 5в 500ма зарядника с повышайкой до 12в
вроде бы я запитывал от бп, но уже не помню сколько они жрут

у меня есть идея сделать с модулем есп8266, чтобы можно было отображать на них что угодно и управление было легкое по сети

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Вс июн 04, 2023 11:48:24

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

Хорошая идея 8) я и сделал именно так- на основе кода "простые часы с wifi" о чем писал чуть выше и ссылку давал ..но не доделал до конца - не впихнул все хотелки в код.. работают больше- года развивать код типа времени нет..а скорее просто лень - работает и ладно.

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Вс июн 04, 2023 12:55:53



VFD дисплей Futaba M202MD10C. Часы на ESP8266 в среде Arduino.
Библиотекой не оформлял (пока лень разбираться))
Скетч прилагаю. В нём надо вписать имя вашей сети и её пароль.

Спойлер
Код:
// serialesp8266clock.ino
//
// Libraries needed:
//  Time.h & TimeLib.h:  https://github.com/PaulStoffregen/Time
//  Timezone.h: https://github.com/JChristensen/Timezone
//  NTPClient.h: https://github.com/arduino-libraries/NTPClient
//  ESP8266WiFi.h & WifiUDP.h: https://github.com/ekstrand/ESP8266wifi
//  Вывод на VFD дисплей Futaba M202MD10C, выравнивание текста, кириллицу и анимацию прикрутил abomin


#include <ESP8266WiFi.h>
#include <WifiUDP.h>
#include <String.h>
#include <Wire.h>
#include <NTPClient.h>
#include <Time.h>
#include <TimeLib.h>
#include <Timezone.h>

// Define NTP properties
#define NTP_OFFSET   60 * 60      // In seconds
#define NTP_INTERVAL 60 * 1000    // In miliseconds
#define NTP_ADDRESS  "ca.pool.ntp.org"  // change this to whatever pool is closest (see ntp.org)

// Set up the NTP UDP client
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);

const char* ssid = "SSID";   // insert your own ssid
const char* password = "PASSWORD";              // and password
String date;
String t;
const char * days[] = {"Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"} ;
const char * months[] = {"Января", "Февраля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Сентября", "Октября", "Ноября", "Декабря"} ;
const byte CYR_init_string[7] = {0x00, 0x01, 0x02, 0x0A, 0x14, 0x04, 0x20}; // кодовая страница СР-866, курсор выключить, яркость 20%
const int dispStringSize = 20; // сколько символов в строке дисплея
const int kadr = 60;   // задержка для смены спрайта

const byte userDefinedSymbol[] = {0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1C, 0x1D, 0x1E};
const byte fromL2R[] = {0x1D, 0x1C, 0x1A, 0x19, 0x1A, 0x1C, 0x1D, 0x1D};
const byte fromR2L[] = {0x18, 0x17, 0x16, 0x15, 0x15, 0x16, 0x17, 0x18};
const byte sprite[][8] = {
  {0x00, 0x70, 0xE8, 0xF8, 0xF8, 0x70, 0x00, 0X00}, // Pacman 1, user defined symbol #15
  {0x00, 0x70, 0xE8, 0xF8, 0xE0, 0x70, 0x00, 0X00}, // Pacman 2, user defined symbol #16
  {0x00, 0x70, 0xF8, 0xC0, 0xE0, 0x70, 0x00, 0X00}, // Pacman 3, user defined symbol #17
  {0x00, 0x70, 0xE0, 0xC0, 0xC0, 0x60, 0x00, 0X00}, // Pacman 4, user defined symbol #18
  {0x00, 0x70, 0xB8, 0xF8, 0xF8, 0x70, 0x00, 0X00}, // Pacman 5, user defined symbol #19
  {0x00, 0x70, 0xB8, 0xF8, 0x38, 0x70, 0x00, 0X00}, // Pacman 6, user defined symbol #1A
  {0x00, 0x70, 0xF8, 0x18, 0x38, 0x70, 0x00, 0X00}, // Pacman 7, user defined symbol #1C
  {0x00, 0x70, 0x38, 0x18, 0x18, 0x30, 0x00, 0X00}, // Pacman 8, user defined symbol #1D
  {0x00, 0x70, 0xA8, 0xF8, 0x88, 0x70, 0x00, 0X00} // Pacman 9, user defined symbol #1E
};
// Перекодировка русского текста для вывода в serial
char* RUS(char* StrIn)
{
  char* StrOut=StrIn; // сначала выходную строку приравниваем к входной
  uint8_t i[4]={0,0,StrIn[0],StrIn[1]}; // создаём "рабочий" байтовый массив из 4-х членов: 0-счётик нечётных байтов входной строки, 1-счётик чётных байтов входной строки, 2-нечётный байт, 3-чётный байт
  while(i[2]>0&&i[0]<255) // проверяем, что не конец массива (тогда нулевой байт) и ограничиваем длину строки в 254 символов
   {
   if(i[2]==0xd0&&i[3]>0x8F&&i[3]<0xC0) // проверка - кирилица? от "А" до "п"?
    {
    StrOut[i[1]]=i[3]-0x10;i[0]++; // переводим в СР-866
    }
      else if(i[2]==0xd0&&i[3]==0x81) // проверка - кирилица? "Ё"?
      {
      StrOut[i[1]]=0xF0;i[0]++; // меняем на Ё СР-866
      }
        else if(i[2]==0xd1&&i[3]>0x7F&&i[3]<0x90) // проверка - кирилица? от "р" до "я"?
        {
        StrOut[i[1]]=i[3]+0x60;i[0]++; // переводим в СР-866
        }
          else if(i[2]==0xd1&&i[3]==0x91) // проверка - кирилица? "ё"?
          {
          StrOut[i[1]]=0xF1;i[0]++; // меняем на ё СР-866
          }
            else
            {
            StrOut[i[1]]=i[2];
            }
    i[0]++;
    i[1]++;
    i[2]=StrIn[i[0]];
    i[3]=StrIn[i[0]+1];
    }
  StrOut[i[1]]='\0';
  return StrOut;
}
// п-п печати спрайта
void printSprite(byte a, int b, int c) {
        Serial.write(0x10); // задать вывод символа
        Serial.write(b); // в b-е знакоместо
        Serial.write(a); // вывод спрайта a
        delay (c); 
        }

// п-п очистки (забоя) последнего символа
void backspace() {       
        Serial.write(8); // backspace
        Serial.write(32); // space
        }

//  п-п задания след. позиции вывода символа слева вверху
void goLeftUpCorner() {
    Serial.write(0x10); // задать вывод символа
    Serial.write(0x00); // в нулевое знакоместо   
    }
         
// Выравнивание строки по центру
String centerJustify(String inputString)
  {
    int needSpaces = (dispStringSize - inputString.length()) / 2;
    String outputString = "";
    for(int i = 0; i < needSpaces; i++)
    outputString += ' ';
    outputString += inputString;
    for(int i = 0; i < (needSpaces - 1); i++)
    outputString += ' ';
    return outputString;
  }
//
 
void setup ()
{
  Serial.begin(9600); // most ESP-01's use 115200 but this could vary
  timeClient.begin();   // Start the NTP UDP client
 
// инициализировать дисплей
  for(int i=0; i<7; i++)
    Serial.write(CYR_init_string[i]);
   
// набиваем пользовательские символы:
  for(int j=0; j<9; j++) {    // девять пользовательских символов
  Serial.write(03);
  Serial.write(userDefinedSymbol[j]);
  for(int i=0; i<8; i++)    // 8 байт на символ
    Serial.write(sprite[j][i]);}
   
  // Connect to wifi
  Serial.println("");
  Serial.print(RUS("Подключаюсь к WiFi"));
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print(RUS("Подключено к WiFi at "));
  Serial.print(WiFi.localIP());
  delay(1000);
  Serial.println("");
  Serial.println("");
}

void loop()
{
  if (WiFi.status() == WL_CONNECTED) //Check WiFi connection status
  {   
    date = "";  // clear the variables
    t = "";
   
    // update the NTP client and get the UNIX UTC timestamp
    timeClient.update();
    unsigned long epochTime =  timeClient.getEpochTime();

    // convert received time stamp to time_t object
    time_t local, utc;
    utc = epochTime;

    // Then convert the UTC UNIX timestamp to local time
    TimeChangeRule MSK = {"MSK", Second, Sun, Mar, 2, +120};  //UTC - 5 hours - change this as needed
//    TimeChangeRule usEST = {"EST", First, Sun, Nov, 2, -360};   //UTC - 6 hours - change this as needed
    Timezone tMSK(MSK, MSK);
    local = tMSK.toLocal(utc);

 // now format the date variables into string with proper names for month, day etc
    date += day(local);
    date += " ";
    date += months[month(local)-1];
    date += " ";
    date += year(local);

// сформировать выровненную по центру строку даты
    char dateChar[date.length()+1];
    date.toCharArray(dateChar, sizeof(dateChar));
    String dateString = centerJustify(RUS(dateChar));   

// format the time
    if(hour(local) < 10)  // add a space if hour is under 10
      t += " ";
    t += hour(local);
    t += ":";
    if(minute(local) < 10)  // add a zero if minute is under 10
      t += "0";
    t += minute(local);

// сформировать выровненную по центру строку времени и дня недели
    String dayNow = days[weekday(local)-1];
    char dayChar[23];
    dayNow.toCharArray(dayChar, 23);
    String timeDayChar866 = t + ' ' + RUS(dayChar);
    String timeDayString = centerJustify(timeDayChar866);

    // Display the date and time
    goLeftUpCorner();
    Serial.println(timeDayString);
    Serial.print(dateString);

    delay (5000);

// анимация Pacman
     
    for(int i=38; i>19; i--) {  // нижняя строка
      for(int k=0; k<8; k++)
        printSprite(fromR2L[k], i, kadr);
        backspace(); }
     
    for(int i=0; i<20; i++) { // верхняя строка
      for(int k=0; k<8; k++)
        printSprite(fromL2R[k], i, kadr);
        backspace(); }
       
    printSprite(0x1E, 19, 1000);   
    backspace();
    goLeftUpCorner();
  }
  else // attempt to connect to wifi again if disconnected
  {
    WiFi.begin(ssid, password);
    delay(1000);
  }
   
//  delay(10000);    //Send a request to update every 10 sec (= 10,000 ms)
}

Благодарю! Крайне полезная информация. В ближайшее время планирую доделать библиотеку для работы с этим дисплеем, в общий доступ, разумеется, выложу. И подобный нигде и никак не документированный функционал мне крайне полезен! Напишите, как вас в коде библиотеки упомянуть, если вы не против, конечно :solder:

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Вс июн 04, 2023 13:10:39

Для упихивания в компактный корпус/бутылку/трубу отлично подходят дисплеи POSIFLEX PD-2800/320. К тому же есть масса предложений на Авито.
Изображение Изображение Изображение

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Вс июн 04, 2023 15:54:27

Energizer-A писал(а):Хорошая идея 8) я и сделал именно так- на основе кода "простые часы с wifi" о чем писал чуть выше и ссылку давал

я наверное не совсем точно выразился

я имел в виду не слать в контроллер индикатора данные для его знакогенератора
а приделать есп напрямую к ДРАЙВЕРУ индикатора, а контроллер тот древний выкинуть

однако я посмотрел на фотки и загуглил даташит на драйвер

это плохой, негодный драйвер
в нем нет собственного генератора и нет экранного буфера озу, только регистры и высоковольтные драйверы анодов

так же в нем нет шины спи, только входы регистров и таких линеек регистров 4 штуки

поэтому есп будет нагружена сильно софтовым бит бангом, хотя при ее скорости даже в 80мгц это наверное не так уж и страшно
весь вопрос в асинхронности работы кода управления драйвером и кодом вебсервера

вот даташит на драйвер SED2800FVA
Изображение

так что лучше тупо слать байты в юарт
вчера пришла идея в другой теме - сделать из такого индикатора индикатор уровня аудиосигнала :)))

интересно, насколько он шустрый на 115200 будет, чтобы успевать отрисовывать 40 символов

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Вс июн 04, 2023 16:51:57

Под каждый индикатор мысли излагать в большом количестве ну нафиг.. Про ногодрыг, идею отбросил потому что пришлось бы осваивать в объеме ртос, к чему не готов. Да и актуальности не особо чувствую - вполне хватает текстового отображения. наверное проще недостающее мнемоники закинуть в не используемые страницы devicepro, уже делал это успешно в pos labau/poslab правя дампы sm5964.. у меня пока нет параллельного программатора для этого чипа а лить с помощью штатного загрузчика ещё нужно разобраться возможно ли - потому что он может быть запущен только из юзер программы и при этом не факт что такая возможность есть в коде и как попасть на адрес загрузчика и можно ли вопрос открытый.. нужно попробовать разобраться - в этом нет у меня нужных навыков..
Что до скорости отображения линейки - если не все знаки обновлять то вполне справится.. иначе так себе индикатор - тормоза заметны и на меньшей динамике.
Последний раз редактировалось Energizer-A Вс июн 04, 2023 17:23:14, всего редактировалось 1 раз.

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Вс июн 04, 2023 17:22:50

Energizer-A писал(а):Что до скорости отображения линейки - если не все знаки обновлять то вполне справится..

а у тебя он на какой скорости работает? 9600?
да и как не все знаки обновлять? а как тогда затирать то, что не должно светиться? для этого же формируют после еще пробелы?

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Вс июн 04, 2023 17:31:08

Да 9600. На часах в нынешней стадии хватает.
Знаки да- тереть пробелом и писать знак выставляя курсор в нужную позицию
Либы которые выкладывал это делают так же как и команды протоколов - разница отсутствует.. просто переносимость кода выше

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Вс июн 04, 2023 18:38:46

я думаю мне проще на стороне хоста сформировать массив байт для отправки в порт и потом его сразу загнать
главное чтобы хватило скорости в 115200

попробую это сделать на шарпе, там можно таймер софтовый организовать
в моих индикаторах есть еще ртс и дтр сигналы, типа можно узнать, когда индикатор готов к новой порции

я еще только что купил 2 сканера штрих и 2х мерных кодов
https://sps.honeywell.com/ru/ru/product ... ee-scanner

короче 2 индикатора и 2 сканера + пересылка = 12 евров 8)

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Пн июн 05, 2023 01:49:09



VFD дисплей Futaba M202MD10C. Часы на ESP8266 в среде Arduino.
Библиотекой не оформлял (пока лень разбираться))
Скетч прилагаю. В нём надо вписать имя вашей сети и её пароль.

Спойлер
Код:
// serialesp8266clock.ino
//
// Libraries needed:
//  Time.h & TimeLib.h:  https://github.com/PaulStoffregen/Time
//  Timezone.h: https://github.com/JChristensen/Timezone
//  NTPClient.h: https://github.com/arduino-libraries/NTPClient
//  ESP8266WiFi.h & WifiUDP.h: https://github.com/ekstrand/ESP8266wifi
//  Вывод на VFD дисплей Futaba M202MD10C, выравнивание текста, кириллицу и анимацию прикрутил abomin


#include <ESP8266WiFi.h>
#include <WifiUDP.h>
#include <String.h>
#include <Wire.h>
#include <NTPClient.h>
#include <Time.h>
#include <TimeLib.h>
#include <Timezone.h>

// Define NTP properties
#define NTP_OFFSET   60 * 60      // In seconds
#define NTP_INTERVAL 60 * 1000    // In miliseconds
#define NTP_ADDRESS  "ca.pool.ntp.org"  // change this to whatever pool is closest (see ntp.org)

// Set up the NTP UDP client
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);

const char* ssid = "SSID";   // insert your own ssid
const char* password = "PASSWORD";              // and password
String date;
String t;
const char * days[] = {"Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"} ;
const char * months[] = {"Января", "Февраля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Сентября", "Октября", "Ноября", "Декабря"} ;
const byte CYR_init_string[7] = {0x00, 0x01, 0x02, 0x0A, 0x14, 0x04, 0x20}; // кодовая страница СР-866, курсор выключить, яркость 20%
const int dispStringSize = 20; // сколько символов в строке дисплея
const int kadr = 60;   // задержка для смены спрайта

const byte userDefinedSymbol[] = {0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1C, 0x1D, 0x1E};
const byte fromL2R[] = {0x1D, 0x1C, 0x1A, 0x19, 0x1A, 0x1C, 0x1D, 0x1D};
const byte fromR2L[] = {0x18, 0x17, 0x16, 0x15, 0x15, 0x16, 0x17, 0x18};
const byte sprite[][8] = {
  {0x00, 0x70, 0xE8, 0xF8, 0xF8, 0x70, 0x00, 0X00}, // Pacman 1, user defined symbol #15
  {0x00, 0x70, 0xE8, 0xF8, 0xE0, 0x70, 0x00, 0X00}, // Pacman 2, user defined symbol #16
  {0x00, 0x70, 0xF8, 0xC0, 0xE0, 0x70, 0x00, 0X00}, // Pacman 3, user defined symbol #17
  {0x00, 0x70, 0xE0, 0xC0, 0xC0, 0x60, 0x00, 0X00}, // Pacman 4, user defined symbol #18
  {0x00, 0x70, 0xB8, 0xF8, 0xF8, 0x70, 0x00, 0X00}, // Pacman 5, user defined symbol #19
  {0x00, 0x70, 0xB8, 0xF8, 0x38, 0x70, 0x00, 0X00}, // Pacman 6, user defined symbol #1A
  {0x00, 0x70, 0xF8, 0x18, 0x38, 0x70, 0x00, 0X00}, // Pacman 7, user defined symbol #1C
  {0x00, 0x70, 0x38, 0x18, 0x18, 0x30, 0x00, 0X00}, // Pacman 8, user defined symbol #1D
  {0x00, 0x70, 0xA8, 0xF8, 0x88, 0x70, 0x00, 0X00} // Pacman 9, user defined symbol #1E
};
// Перекодировка русского текста для вывода в serial
char* RUS(char* StrIn)
{
  char* StrOut=StrIn; // сначала выходную строку приравниваем к входной
  uint8_t i[4]={0,0,StrIn[0],StrIn[1]}; // создаём "рабочий" байтовый массив из 4-х членов: 0-счётик нечётных байтов входной строки, 1-счётик чётных байтов входной строки, 2-нечётный байт, 3-чётный байт
  while(i[2]>0&&i[0]<255) // проверяем, что не конец массива (тогда нулевой байт) и ограничиваем длину строки в 254 символов
   {
   if(i[2]==0xd0&&i[3]>0x8F&&i[3]<0xC0) // проверка - кирилица? от "А" до "п"?
    {
    StrOut[i[1]]=i[3]-0x10;i[0]++; // переводим в СР-866
    }
      else if(i[2]==0xd0&&i[3]==0x81) // проверка - кирилица? "Ё"?
      {
      StrOut[i[1]]=0xF0;i[0]++; // меняем на Ё СР-866
      }
        else if(i[2]==0xd1&&i[3]>0x7F&&i[3]<0x90) // проверка - кирилица? от "р" до "я"?
        {
        StrOut[i[1]]=i[3]+0x60;i[0]++; // переводим в СР-866
        }
          else if(i[2]==0xd1&&i[3]==0x91) // проверка - кирилица? "ё"?
          {
          StrOut[i[1]]=0xF1;i[0]++; // меняем на ё СР-866
          }
            else
            {
            StrOut[i[1]]=i[2];
            }
    i[0]++;
    i[1]++;
    i[2]=StrIn[i[0]];
    i[3]=StrIn[i[0]+1];
    }
  StrOut[i[1]]='\0';
  return StrOut;
}
// п-п печати спрайта
void printSprite(byte a, int b, int c) {
        Serial.write(0x10); // задать вывод символа
        Serial.write(b); // в b-е знакоместо
        Serial.write(a); // вывод спрайта a
        delay (c); 
        }

// п-п очистки (забоя) последнего символа
void backspace() {       
        Serial.write(8); // backspace
        Serial.write(32); // space
        }

//  п-п задания след. позиции вывода символа слева вверху
void goLeftUpCorner() {
    Serial.write(0x10); // задать вывод символа
    Serial.write(0x00); // в нулевое знакоместо   
    }
         
// Выравнивание строки по центру
String centerJustify(String inputString)
  {
    int needSpaces = (dispStringSize - inputString.length()) / 2;
    String outputString = "";
    for(int i = 0; i < needSpaces; i++)
    outputString += ' ';
    outputString += inputString;
    for(int i = 0; i < (needSpaces - 1); i++)
    outputString += ' ';
    return outputString;
  }
//
 
void setup ()
{
  Serial.begin(9600); // most ESP-01's use 115200 but this could vary
  timeClient.begin();   // Start the NTP UDP client
 
// инициализировать дисплей
  for(int i=0; i<7; i++)
    Serial.write(CYR_init_string[i]);
   
// набиваем пользовательские символы:
  for(int j=0; j<9; j++) {    // девять пользовательских символов
  Serial.write(03);
  Serial.write(userDefinedSymbol[j]);
  for(int i=0; i<8; i++)    // 8 байт на символ
    Serial.write(sprite[j][i]);}
   
  // Connect to wifi
  Serial.println("");
  Serial.print(RUS("Подключаюсь к WiFi"));
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print(RUS("Подключено к WiFi at "));
  Serial.print(WiFi.localIP());
  delay(1000);
  Serial.println("");
  Serial.println("");
}

void loop()
{
  if (WiFi.status() == WL_CONNECTED) //Check WiFi connection status
  {   
    date = "";  // clear the variables
    t = "";
   
    // update the NTP client and get the UNIX UTC timestamp
    timeClient.update();
    unsigned long epochTime =  timeClient.getEpochTime();

    // convert received time stamp to time_t object
    time_t local, utc;
    utc = epochTime;

    // Then convert the UTC UNIX timestamp to local time
    TimeChangeRule MSK = {"MSK", Second, Sun, Mar, 2, +120};  //UTC - 5 hours - change this as needed
//    TimeChangeRule usEST = {"EST", First, Sun, Nov, 2, -360};   //UTC - 6 hours - change this as needed
    Timezone tMSK(MSK, MSK);
    local = tMSK.toLocal(utc);

 // now format the date variables into string with proper names for month, day etc
    date += day(local);
    date += " ";
    date += months[month(local)-1];
    date += " ";
    date += year(local);

// сформировать выровненную по центру строку даты
    char dateChar[date.length()+1];
    date.toCharArray(dateChar, sizeof(dateChar));
    String dateString = centerJustify(RUS(dateChar));   

// format the time
    if(hour(local) < 10)  // add a space if hour is under 10
      t += " ";
    t += hour(local);
    t += ":";
    if(minute(local) < 10)  // add a zero if minute is under 10
      t += "0";
    t += minute(local);

// сформировать выровненную по центру строку времени и дня недели
    String dayNow = days[weekday(local)-1];
    char dayChar[23];
    dayNow.toCharArray(dayChar, 23);
    String timeDayChar866 = t + ' ' + RUS(dayChar);
    String timeDayString = centerJustify(timeDayChar866);

    // Display the date and time
    goLeftUpCorner();
    Serial.println(timeDayString);
    Serial.print(dateString);

    delay (5000);

// анимация Pacman
     
    for(int i=38; i>19; i--) {  // нижняя строка
      for(int k=0; k<8; k++)
        printSprite(fromR2L[k], i, kadr);
        backspace(); }
     
    for(int i=0; i<20; i++) { // верхняя строка
      for(int k=0; k<8; k++)
        printSprite(fromL2R[k], i, kadr);
        backspace(); }
       
    printSprite(0x1E, 19, 1000);   
    backspace();
    goLeftUpCorner();
  }
  else // attempt to connect to wifi again if disconnected
  {
    WiFi.begin(ssid, password);
    delay(1000);
  }
   
//  delay(10000);    //Send a request to update every 10 sec (= 10,000 ms)
}

Благодарю! Крайне полезная информация. В ближайшее время планирую доделать библиотеку для работы с этим дисплеем, в общий доступ, разумеется, выложу. И подобный нигде и никак не документированный функционал мне крайне полезен! Напишите, как вас в коде библиотеки упомянуть, если вы не против, конечно :solder:


Ну что же, библиотеку для дисплея Futaba M202MD10C я доделал. Уже доступна на гитхабе вместе с тестовыми скетчами: https://github.com/SNMetamorph/FutabaVfdM202MD10C
А также, в течение пары дней библиотека уже должна быть доступна в ардуиновском менеджере библиотек.

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Пн июн 05, 2023 10:09:11

Зачетно вышло.. наверное эта библиотека должна называться по имени протокола или дисплея, а не колбы - общение не с колбой напрямую ведь?

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Пн июн 05, 2023 11:59:12

Зачетно вышло.. наверное эта библиотека должна называться по имени протокола или дисплея, а не колбы - общение не с колбой напрямую ведь?

А так и есть. Это не название колбы, а название дисплея целиком. Оно там даже шелкографией нанесено на печатной плате.

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Пн июн 05, 2023 15:34:13

STekLyAToR писал(а):Ну что же, библиотеку для дисплея Futaba M202MD10C я доделал.

а с чем связано, что для печати на русском у тебя в примере символы кодированы? почему нельзя просто написать нормальными буквами?
иде это интерпретирует как утф8 по 2 байта?

а нет ли там какого макроса, чтобы при компиляции оно конвертировалось в аскии? или наверное ардуиновская иде даже позволяет написать такой макрос?

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Пн июн 05, 2023 16:57:23

STekLyAToR писал(а):Ну что же, библиотеку для дисплея Futaba M202MD10C я доделал.

а с чем связано, что для печати на русском у тебя в примере символы кодированы? почему нельзя просто написать нормальными буквами?
иде это интерпретирует как утф8 по 2 байта?

а нет ли там какого макроса, чтобы при компиляции оно конвертировалось в аскии? или наверное ардуиновская иде даже позволяет написать такой макрос?

Потому что у файла кодировка текста UTF-8, а дисплей принимает CP866, поэтому я просто нужную строку вручную закодировал в CP866 и вбил байтами.

А по поводу конвертации текста в нужную кодировку - хорошая идея. Современный С++ в целом позволяет такие вещи делать во время компиляции без особых проблем, то есть это сделать можно вообще без задействования вычислительных возможностей микроконтроллера, всё будет посчитано заранее. В данном случае нам надо конвертировать UTF-8 в CP866.

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Пн июн 05, 2023 22:52:24

STekLyAToR писал(а):то есть это сделать можно вообще без задействования вычислительных возможностей микроконтроллера, всё будет посчитано заранее.

об этом и речь, чтобы на этапе компиляции компилятор сам понимал, что строки надо компилить в такую-то кодировку однобайтную

что-то я пока не нашел как это делается
https://forum.arduino.cc/t/why-serial-w ... t/597153/8
тут походу в строках сериала иде сама конвертирует в аскии, хотя сам скетч сохраняется в утф8

гимор только в том, что русских таблиц было несколько
866 это дос, а в редакторе может быть 1251 виндовс
индикатор имеет только досовскую таблицу и могут вылезти каракули

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Вт июн 06, 2023 01:29:43

STekLyAToR писал(а):то есть это сделать можно вообще без задействования вычислительных возможностей микроконтроллера, всё будет посчитано заранее.

об этом и речь, чтобы на этапе компиляции компилятор сам понимал, что строки надо компилить в такую-то кодировку однобайтную

что-то я пока не нашел как это делается
https://forum.arduino.cc/t/why-serial-w ... t/597153/8
тут походу в строках сериала иде сама конвертирует в аскии, хотя сам скетч сохраняется в утф8

гимор только в том, что русских таблиц было несколько
866 это дос, а в редакторе может быть 1251 виндовс
индикатор имеет только досовскую таблицу и могут вылезти каракули

Вся суть в том, что кодировка UTF-8, является обратно совместимой с ASCII, поэтому ничего даже и не надо конвертировать.

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Вт июн 06, 2023 02:05:12

тогда в строках буквы русские будут нормально отображаться на индикаторе? при компиляции компилятор обрежет 1 байт в каждой букве?

Re: Ардуино и дисплей покупателя - vfd как подключить/управл

Вт июн 06, 2023 12:12:38

Там перекодировка в CP866 у меня 5 строчек заняла. Ничего сложного. И проблема с буквой Ё/ё решена.
Хотя встречал знакогенератор на этих дисплеях, где местами поменяли буквы Ъ и Ь.
Ответить