Пн май 29, 2023 15:20:14
Пн май 29, 2023 18:23:59
Сб июн 03, 2023 15:10:36
Вс июн 04, 2023 11:48:24
Вс июн 04, 2023 12:55:53
// 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)
}
Вс июн 04, 2023 13:10:39
Вс июн 04, 2023 15:54:27
Energizer-A писал(а):Хорошая идея я и сделал именно так- на основе кода "простые часы с wifi" о чем писал чуть выше и ссылку давал
Вс июн 04, 2023 16:51:57
Вс июн 04, 2023 17:22:50
Energizer-A писал(а):Что до скорости отображения линейки - если не все знаки обновлять то вполне справится..
Вс июн 04, 2023 17:31:08
Вс июн 04, 2023 18:38:46
Пн июн 05, 2023 01:49:09
// 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)
}
Пн июн 05, 2023 10:09:11
Пн июн 05, 2023 11:59:12
Пн июн 05, 2023 15:34:13
STekLyAToR писал(а):Ну что же, библиотеку для дисплея Futaba M202MD10C я доделал.
Пн июн 05, 2023 16:57:23
STekLyAToR писал(а):Ну что же, библиотеку для дисплея Futaba M202MD10C я доделал.
Пн июн 05, 2023 22:52:24
STekLyAToR писал(а):то есть это сделать можно вообще без задействования вычислительных возможностей микроконтроллера, всё будет посчитано заранее.
Вт июн 06, 2023 01:29:43
STekLyAToR писал(а):то есть это сделать можно вообще без задействования вычислительных возможностей микроконтроллера, всё будет посчитано заранее.
Вт июн 06, 2023 02:05:12
Вт июн 06, 2023 12:12:38