Часы из осциллографа и ESP32 своими руками
Превратите ваш старый осциллограф в аналоговые часы с помощью микроконтроллера ESP32 и трех проводов.
В данном материале представлен, пожалуй, самый простой способ отобразить аналоговые часы на дисплее осциллографа. Осциллограф должен быть двухканальным, один канал для оси «x», а другой для «y». На GitHub-странице Mauro Pintus (https://github.com/maurohh/ESP32_OscilloscopeClock) есть подробное описание и код, который использует внутренние ЦАП микроконтроллера ESP32 и WiFi ntp clock sync (синхронизация часов с NTP-сервером). По умолчанию этот скетч начнется с фиксированного времени 10:08:37 каждый раз, когда вы сбрасываете плату.
Чтобы изменить это, измените переменные h, m, s в коде. Чтобы синхронизировать часы с NTP-сервером, вам необходимо установить библиотеку NTPtimeESP от Andreas Spiess. Отредактируйте учетные данные WiFi вместо вашего SSID и вашего пароля. Проверьте в последовательном мониторе, доступен ли сервер NTP.
Библиотека NTPtimeESP предназначалась для ESP8266, и вам нужно добавить файл NTPtimeESP.h, чтобы использовать ее с ESP32. Откройте «NTPtimeESP.h» внутри библиотеки и замените в include «ESP8266WiFi.h» на «WiFi.h».
Схема подключения очень проста.
Как видно на схеме, контакт 25 ESP32 подключен к «x» (канал 1) осциллографа, а контакт 26 к «y» (канал 2). Затем выбираем X-Y режим работы осциллографа. Подключение осуществляется с помощью экранированных кабелей.
Код программы для Arduino IDE:
#include <driver/dac.h>
#include <soc/rtc.h>
#include <soc/sens_reg.h>
#include "DataTable.h"
//#define EXCEL
//#define NTP
#if defined NTP
#include <NTPtimeESP.h>
#include <WiFi.h>
NTPtime NTPch("europe.pool.ntp.org"); // Выберите свой пул серверов
char *ssid = "Your SSID"; // Установите свой WiFi SSID
char *password = "Your PASS"; // Установите пароль WiFi
int status = WL_IDLE_STATUS;
strDateTime dateTime;
#endif //
// Измените это, чтобы установить начальное время
// По умолчанию 10:08:37
int h=10; // Начальный час
int m=8; // Начальные минуты
int s=37; // Начальные секунды
// Переменные
int lastx,lasty;
unsigned long currentMillis = 0;
unsigned long previousMillis = 0;
int Timeout = 20;
const long interval = 990; // миллисекунды, вы можете изменять это
// чтобы получить лучшую точность
//*****************************************************************************
// PlotTable
//*****************************************************************************
void PlotTable(byte *SubTable, int SubTableSize, int skip, int opt, int offset)
{
int i=offset;
while (i<SubTableSize){
if (SubTable[i+2]==skip){
i=i+3;
if (opt==1) if (SubTable[i]==skip) i++;
}
Line(SubTable[i],SubTable[i+1],SubTable[i+2],SubTable[i+3]);
if (opt==2){
Line(SubTable[i+2],SubTable[i+3],SubTable[i],SubTable[i+1]);
}
i=i+2;
if (SubTable[i+2]==0xFF) break;
}
}
//*****************************************************************************
//*****************************************************************************
// Dot
//*****************************************************************************
inline void Dot(int x, int y)
{
if (lastx!=x){
lastx=x;
dac_output_voltage(DAC_CHANNEL_1, x);
}
#if defined EXCEL
Serial.print("0x");
if (x<=0xF) Serial.print("0");
Serial.print(x,HEX);
Serial.print(",");
#endif
#if defined EXCEL
Serial.print("0x");
if (lasty<=0xF) Serial.print("0");
Serial.print(lasty,HEX);
Serial.println(",");
#endif
if (lasty!=y){
lasty=y;
dac_output_voltage(DAC_CHANNEL_2, y);
}
#if defined EXCEL
Serial.print("0x");
if (x<=0xF) Serial.print("0");
Serial.print(x,HEX);
Serial.print(",");
#endif
#if defined EXCEL
Serial.print("0x");
if (y<=0xF) Serial.print("0");
Serial.print(y,HEX);
Serial.println(",");
#endif
}
//*****************************************************************************
//*****************************************************************************
// Line
//*****************************************************************************
// Реализация алгоритма Брезенхема
// также известный как DDA - цифровой дифференциальный анализатор
void Line(byte x1, byte y1, byte x2, byte y2)
{
int acc;
// for speed, there are 8 DDA's, one for each octant
if (y1 < y2) { // quadrant 1 or 2
byte dy = y2 - y1;
if (x1 < x2) { // quadrant 1
byte dx = x2 - x1;
if (dx > dy) { // < 45
acc = (dx >> 1);
for (; x1 <= x2; x1++) {
Dot(x1, y1);
acc -= dy;
if (acc < 0) {
y1++;
acc += dx;
}
}
}
else { // > 45
acc = dy >> 1;
for (; y1 <= y2; y1++) {
Dot(x1, y1);
acc -= dx;
if (acc < 0) {
x1++;
acc += dy;
}
}
}
}
else { // quadrant 2
byte dx = x1 - x2;
if (dx > dy) { // < 45
acc = dx >> 1;
for (; x1 >= x2; x1--) {
Dot(x1, y1);
acc -= dy;
if (acc < 0) {
y1++;
acc += dx;
}
}
}
else { // > 45
acc = dy >> 1;
for (; y1 <= y2; y1++) {
Dot(x1, y1);
acc -= dx;
if (acc < 0) {
x1--;
acc += dy;
}
}
}
}
}
else { // quadrant 3 or 4
byte dy = y1 - y2;
if (x1 < x2) { // quadrant 4
byte dx = x2 - x1;
if (dx > dy) { // < 45
acc = dx >> 1;
for (; x1 <= x2; x1++) {
Dot(x1, y1);
acc -= dy;
if (acc < 0) {
y1--;
acc += dx;
}
}
}
else { // > 45
acc = dy >> 1;
for (; y1 >= y2; y1--) {
Dot(x1, y1);
acc -= dx;
if (acc < 0) {
x1++;
acc += dy;
}
}
}
}
else { // quadrant 3
byte dx = x1 - x2;
if (dx > dy) { // < 45
acc = dx >> 1;
for (; x1 >= x2; x1--) {
Dot(x1, y1);
acc -= dy;
if (acc < 0) {
y1--;
acc += dx;
}
}
}
else { // > 45
acc = dy >> 1;
for (; y1 >= y2; y1--) {
Dot(x1, y1);
acc -= dx;
if (acc < 0) {
x1--;
acc += dy;
}
}
}
}
}
}
//*****************************************************************************
//*****************************************************************************
// setup
//*****************************************************************************
void setup()
{
Serial.begin(115200);
Serial.println("\nESP32 Oscilloscope Clock v1.0");
Serial.println("Mauro Pintus 2018\nwww.mauroh.com");
//rtc_clk_cpu_freq_set(RTC_CPU_FREQ_240M);
Serial.println("CPU Clockspeed: ");
Serial.println(rtc_clk_cpu_freq_value(rtc_clk_cpu_freq_get()));
dac_output_enable(DAC_CHANNEL_1);
dac_output_enable(DAC_CHANNEL_2);
if (h > 12) h=h-12;
#if defined NTP
Serial.println("Connecting to Wi-Fi");
WiFi.begin (ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(1000);
Timeout--;
if (Timeout==0){
Serial.println("\nWiFi Timeout");
break;
}
}
if (Timeout!=0){
Serial.println("\nWiFi connected");
Serial.println("NTP request sent to Server.");
dateTime = NTPch.getNTPtime(1.0, 1);
Timeout=20;
while (!dateTime.valid) {
dateTime = NTPch.getNTPtime(1.0, 1);
Serial.print(".");
delay(1000);
Timeout--;
if (Timeout==0){
Serial.println("\nNTP Server Timeout");
break;
}
}
if (Timeout!=0){
Serial.println("\nUsing NTP Time");
NTPch.printDateTime(dateTime);
byte actualHour = dateTime.hour;
byte actualMinute = dateTime.minute;
byte actualsecond = dateTime.second;
int actualyear = dateTime.year;
byte actualMonth = dateTime.month;
byte actualday = dateTime.day;
byte actualdayofWeek = dateTime.dayofWeek;
if (actualHour > 12) actualHour=actualHour-12;
h=actualHour;
m=actualMinute;
s=actualsecond;
}
else{
Serial.println("\nUsing Fix Time");
}
}
#endif
#if !defined NTP
Serial.println("Using Fix Time");
#endif
if (h<10) Serial.print("0");
Serial.print(h);
Serial.print(":");
if (m<10) Serial.print("0");
Serial.print(m);
Serial.print(":");
if (s<10) Serial.print("0");
Serial.println(s);
h=(h*5)+m/12;
}
//*****************************************************************************
//*****************************************************************************
// loop
//*****************************************************************************
void loop() {
currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
s++;
}
if (s==60) {
s=0;
m++;
if ((m==12)||(m==24)||(m==36)||(m==48)) {
h++;
}
}
if (m==60) {
m=0;
h++;
}
if (h==60) {
h=0;
}
// Опционально
//PlotTable(DialDots,sizeof(DialDots),0x00,1,0);
//PlotTable(TestData,sizeof(TestData),0x00,0,00); // Полный
//PlotTable(TestData,sizeof(TestData),0x00,0,11); // Без квадрата
int i;
//Serial.println("Out Ring");
//for (i=0; i < 1000; i++) PlotTable(DialData,sizeof(DialData),0x00,2,0);
//Serial.println("Diagonals");
//for (i=0; i < 2000; i++) PlotTable(DialData,sizeof(DialData),0x00,0,0);
PlotTable(DialData,sizeof(DialData),0x00,1,0);
PlotTable(DialDigits12,sizeof(DialDigits12),0x00,1,0);
PlotTable(HrPtrData, sizeof(HrPtrData), 0xFF,0,9*h);
PlotTable(MinPtrData,sizeof(MinPtrData),0xFF,0,9*m);
PlotTable(SecPtrData,sizeof(SecPtrData),0xFF,0,5*s);
#if defined EXCEL
while(1);
#endif
}
Код файла DataTable.h:
byte DialData[] PROGMEM = {
0x80,0xfe,0x80,0xf2,0x00,0x8d,0xfe,0x8c,0xf9,0x00,0x9a,0xfc,0x99,0xf7,0x00,0xa6,0xf8,0xa5,0xf4,0x00,
0xb3,0xf4,0xb1,0xef,0x00,0xbf,0xee,0xba,0xe5,0x00,0xca,0xe6,0xc7,0xe2,0x00,0xd4,0xde,0xd0,0xda,0x00,
0xdd,0xd5,0xd9,0xd1,0x00,0xe5,0xcb,0xe1,0xc8,0x00,0xed,0xbf,0xe4,0xba,0x00,0xf3,0xb4,0xee,0xb2,0x00,
0xf7,0xa7,0xf3,0xa6,0x00,0xfb,0x9b,0xf6,0x9a,0x00,0xfd,0x8e,0xf8,0x8d,0x00,0xfd,0x80,0xf1,0x80,0x00,
0xfd,0x73,0xf8,0x74,0x00,0xfb,0x66,0xf6,0x67,0x00,0xf7,0x5a,0xf3,0x5b,0x00,0xf3,0x4d,0xee,0x4f,0x00,
0xed,0x41,0xe4,0x46,0x00,0xe5,0x36,0xe1,0x39,0x00,0xdd,0x2c,0xd9,0x30,0x00,0xd4,0x23,0xd0,0x27,0x00,
0xca,0x1b,0xc7,0x1f,0x00,0xbf,0x13,0xba,0x1c,0x00,0xb3,0x0d,0xb1,0x12,0x00,0xa6,0x09,0xa5,0x0d,0x00,
0x9a,0x05,0x99,0x0a,0x00,0x8d,0x03,0x8c,0x08,0x00,0x7f,0x03,0x7f,0x0f,0x00,0x72,0x03,0x73,0x08,0x00,
0x65,0x05,0x66,0x0a,0x00,0x59,0x09,0x5a,0x0d,0x00,0x4c,0x0d,0x4e,0x12,0x00,0x41,0x13,0x46,0x1c,0x00,
0x35,0x1b,0x38,0x1f,0x00,0x2b,0x23,0x2f,0x27,0x00,0x22,0x2c,0x26,0x30,0x00,0x1a,0x36,0x1e,0x39,0x00,
0x12,0x42,0x1b,0x47,0x00,0x0c,0x4d,0x11,0x4f,0x00,0x08,0x5a,0x0c,0x5b,0x00,0x04,0x66,0x09,0x67,0x00,
0x02,0x73,0x07,0x74,0x00,0x02,0x81,0x0e,0x81,0x00,0x02,0x8e,0x07,0x8d,0x00,0x04,0x9b,0x09,0x9a,0x00,
0x08,0xa7,0x0c,0xa6,0x00,0x0c,0xb4,0x11,0xb2,0x00,0x12,0xbf,0x1b,0xba,0x00,0x1a,0xcb,0x1e,0xc8,0x00,
0x22,0xd5,0x26,0xd1,0x00,0x2b,0xde,0x2f,0xda,0x00,0x35,0xe6,0x38,0xe2,0x00,0x40,0xee,0x45,0xe5,0x00,
0x4c,0xf4,0x4e,0xef,0x00,0x59,0xf8,0x5a,0xf4,0x00,0x65,0xfc,0x66,0xf7,0x00,0x72,0xfe,0x73,0xf9,0xff
};
byte DialDots[] PROGMEM = {
0x80,0xfe,0x80,0xfd,0x81,0xfd,0x81,0xfc,0x00,0x8d,0xfe,0x8d,0xfd,0x8e,0xfd,0x8e,0xfc,0x00,0x9a,0xfc,0x99,0xfb,0x9b,0xfb,0x9a,0xfa,0x00,
0xa6,0xf8,0xa6,0xf7,0xa7,0xf7,0xa7,0xf6,0x00,0xb3,0xf4,0xb2,0xf3,0xb4,0xf3,0xb3,0xf2,0x00,0xbf,0xee,0xbe,0xed,0xc0,0xed,0xbf,0xec,0x00,
0xca,0xe6,0xc9,0xe6,0xcb,0xe5,0xca,0xe5,0x00,0xd4,0xde,0xd3,0xdd,0xd5,0xdd,0xd4,0xdc,0x00,0xdd,0xd5,0xdc,0xd4,0xde,0xd4,0xdd,0xd3,0x00,
0xe5,0xcb,0xe5,0xca,0xe6,0xca,0xe6,0xc9,0x00,0xed,0xbf,0xec,0xbf,0xee,0xbe,0xed,0xbe,0x00,0xf3,0xb4,0xf2,0xb3,0xf4,0xb3,0xf3,0xb2,0x00,
0xf7,0xa7,0xf6,0xa7,0xf8,0xa6,0xf7,0xa6,0x00,0xfb,0x9b,0xfa,0x9a,0xfc,0x9a,0xfb,0x99,0x00,0xfd,0x8e,0xfc,0x8e,0xfe,0x8d,0xfd,0x8d,0x00,
0xfd,0x80,0xfc,0x80,0xfe,0x81,0xfd,0x81,0x00,0xfd,0x73,0xfc,0x73,0xfe,0x74,0xfd,0x74,0x00,0xfb,0x66,0xfa,0x67,0xfc,0x67,0xfb,0x68,0x00,
0xf7,0x5a,0xf6,0x5a,0xf8,0x5b,0xf7,0x5b,0x00,0xf3,0x4d,0xf2,0x4e,0xf4,0x4e,0xf3,0x4f,0x00,0xed,0x41,0xec,0x42,0xee,0x42,0xed,0x43,0x00,
0xe5,0x36,0xe5,0x37,0xe6,0x37,0xe6,0x38,0x00,0xdd,0x2c,0xdc,0x2d,0xde,0x2d,0xdd,0x2e,0x00,0xd4,0x23,0xd3,0x24,0xd5,0x24,0xd4,0x25,0x00,
0xca,0x1b,0xc9,0x1b,0xcb,0x1c,0xca,0x1c,0x00,0xbf,0x13,0xbe,0x14,0xc0,0x14,0xbf,0x15,0x00,0xb3,0x0d,0xb2,0x0e,0xb4,0x0e,0xb3,0x0f,0x00,
0xa6,0x09,0xa6,0x0a,0xa7,0x0a,0xa7,0x0b,0x00,0x9a,0x05,0x99,0x06,0x9b,0x06,0x9a,0x07,0x00,0x8d,0x03,0x8d,0x04,0x8e,0x04,0x8e,0x05,0x00,
0x7f,0x03,0x7f,0x04,0x80,0x04,0x80,0x05,0x00,0x72,0x03,0x72,0x04,0x73,0x04,0x73,0x05,0x00,0x65,0x05,0x66,0x06,0x66,0x06,0x67,0x07,0x00,
0x59,0x09,0x59,0x0a,0x5a,0x0a,0x5a,0x0b,0x00,0x4c,0x0d,0x4d,0x0e,0x4d,0x0e,0x4e,0x0f,0x00,0x41,0x13,0x41,0x14,0x42,0x14,0x42,0x15,0x00,
0x35,0x1b,0x36,0x1b,0x36,0x1c,0x37,0x1c,0x00,0x2b,0x23,0x2c,0x24,0x2c,0x24,0x2d,0x25,0x00,0x22,0x2c,0x23,0x2d,0x23,0x2d,0x24,0x2e,0x00,
0x1a,0x36,0x1a,0x37,0x1b,0x37,0x1b,0x38,0x00,0x12,0x42,0x13,0x42,0x13,0x43,0x14,0x43,0x00,0x0c,0x4d,0x0d,0x4e,0x0d,0x4e,0x0e,0x4f,0x00,
0x08,0x5a,0x09,0x5a,0x09,0x5b,0x0a,0x5b,0x00,0x04,0x66,0x05,0x67,0x05,0x67,0x06,0x68,0x00,0x02,0x73,0x03,0x73,0x03,0x74,0x04,0x74,0x00,
0x02,0x81,0x03,0x81,0x03,0x82,0x04,0x82,0x00,0x02,0x8e,0x03,0x8e,0x03,0x8d,0x04,0x8d,0x00,0x04,0x9b,0x05,0x9a,0x05,0x9a,0x06,0x99,0x00,
0x08,0xa7,0x09,0xa7,0x09,0xa6,0x0a,0xa6,0x00,0x0c,0xb4,0x0d,0xb3,0x0d,0xb3,0x0e,0xb2,0x00,0x12,0xbf,0x13,0xbf,0x13,0xbe,0x14,0xbe,0x00,
0x1a,0xcb,0x1a,0xca,0x1b,0xca,0x1b,0xc9,0x00,0x22,0xd5,0x23,0xd4,0x23,0xd4,0x24,0xd3,0x00,0x2b,0xde,0x2c,0xdd,0x2c,0xdd,0x2d,0xdc,0x00,
0x35,0xe6,0x36,0xe6,0x36,0xe5,0x37,0xe5,0x00,0x40,0xee,0x41,0xed,0x41,0xed,0x42,0xec,0x00,0x4c,0xf4,0x4d,0xf3,0x4d,0xf3,0x4e,0xf2,0x00,
0x59,0xf8,0x59,0xf7,0x5a,0xf7,0x5a,0xf6,0x00,0x65,0xfc,0x66,0xfb,0x66,0xfb,0x67,0xfa,0x00,0x72,0xfe,0x72,0xfd,0x73,0xfd,0x73,0xfc,0xff
};
byte DialDigits12[] PROGMEM = {
0x7a,0xeb,0x7a,0xd9,0x00,0x80,0xe8,0x83,0xeb,0x89,0xeb,0x8c,0xe8,0x8c,0xe5,0x80,0xd9,0x8c,0xd9,0x00,
0xb5,0xe4,0xb5,0xd2,0x00,0x00,
0xd2,0xbb,0xd5,0xbe,0xdb,0xbe,0xde,0xbb,0xde,0xb8,0xd2,0xac,0xde,0xac,0x00,0x00,
0xe2,0x86,0xe5,0x89,0xeb,0x89,0xee,0x86,0xee,0x83,0xeb,0x80,0xee,0x7d,0xee,0x7a,0xeb,0x77,0xe5,0x77,0xe2,0x7a,0x00,0xe5,0x80,0xeb,0x80,0x00,
0xe0,0x4c,0xd4,0x4c,0xdd,0x55,0xdd,0x43,0x00,0x00,
0xb8,0x31,0xac,0x31,0xac,0x28,0xb5,0x28,0xb8,0x25,0xb8,0x22,0xb5,0x1f,0xaf,0x1f,0xac,0x22,0x00,0x00,
0x85,0x21,0x82,0x24,0x7c,0x24,0x79,0x21,0x79,0x15,0x7c,0x12,0x82,0x12,0x85,0x15,0x85,0x18,0x82,0x1b,0x7c,0x1b,0x79,0x18,0x00,0x47,0x31,0x53,0x31,0x53,0x2e,0x50,0x2b,0x4d,0x25,0x4d,0x1f,0x00,
0x22,0x4c,0x1f,0x4f,0x1f,0x52,0x22,0x55,0x28,0x55,0x2b,0x52,0x2b,0x4f,0x28,0x4c,0x22,0x4c,0x1f,0x49,0x1f,0x46,0x22,0x43,0x28,0x43,0x2b,0x46,0x2b,0x49,0x28,0x4c,0x00,0x00,
0x1d,0x84,0x1a,0x81,0x1a,0x81,0x14,0x81,0x11,0x84,0x11,0x87,0x14,0x8a,0x1a,0x8a,0x1d,0x87,0x1d,0x7b,0x1a,0x78,0x14,0x78,0x11,0x7b,0x00,0x00,
0x21,0xbe,0x21,0xac,0x00,0x00,
0x27,0xbb,0x2a,0xbe,0x30,0xbe,0x33,0xbb,0x33,0xaf,0x30,0xac,0x2a,0xac,0x27,0xaf,0x27,0xbb,0x00,0x00,
0x49,0xe4,0x49,0xd2,0x00,0x00,
0x53,0xe4,0x53,0xd2,0xff,0x00
};
byte DialDigits24[] PROGMEM = {
0x73,0xef,0x76,0xf2,0x7c,0xf2,0x7f,0xef,0x7f,0xec,0x73,0xe0,0x7f,0xe0,0x00,0x8d,0xe9,0x81,0xe9,0x8a,0xf2,0x8a,0xe0,0x00,
0xaa,0xe2,0xaa,0xd0,0x00,0x00,
0xb0,0xdf,0xb3,0xe2,0xb9,0xe2,0xbc,0xdf,0xbc,0xdc,0xb9,0xd9,0xbc,0xd6,0xbc,0xd3,0xb9,0xd0,0xb3,0xd0,0xb0,0xd3,0x00,0xb3,0xd9,0xb9,0xd9,0x00,
0xd0,0xbc,0xd0,0xaa,0x00,0x00,
0xe2,0xb3,0xd6,0xb3,0xdf,0xbc,0xdf,0xaa,0x00,0x00,
0xdc,0x89,0xdc,0x77,0x00,0xee,0x89,0xe2,0x89,0xe2,0x80,0xeb,0x80,0xee,0x7d,0xee,0x7a,0xeb,0x77,0xe5,0x77,0xe2,0x7a,0x00,
0xd0,0x55,0xd0,0x43,0x00,0x00,
0xe2,0x52,0xdf,0x55,0xd9,0x55,0xd6,0x52,0xd6,0x46,0xd9,0x43,0xdf,0x43,0xe2,0x46,0xe2,0x49,0xdf,0x4c,0xd9,0x4c,0xd6,0x49,0x00,0x00,
0xaa,0x2d,0xaa,0x1b,0x00,0x00,
0xb0,0x2d,0xbc,0x2d,0xbc,0x2a,0xb9,0x27,0xb6,0x21,0xb6,0x1b,0x00,0x00,
0x7b,0x21,0x7b,0x0f,0x00,0x83,0x18,0x80,0x1b,0x80,0x1e,0x83,0x21,0x89,0x21,0x8c,0x1e,0x8c,0x1b,0x89,0x18,0x83,0x18,0x80,0x15,0x80,0x12,0x83,0x0f,0x89,0x0f,0x8c,0x12,0x8c,0x15,0x89,0x18,0x00,
0x49,0x2f,0x49,0x1d,0x00,0x00,
0x5b,0x29,0x58,0x26,0x58,0x26,0x52,0x26,0x4f,0x29,0x4f,0x2c,0x52,0x2f,0x58,0x2f,0x5b,0x2c,0x5b,0x20,0x58,0x1d,0x52,0x1d,0x4f,0x20,0x00,0x00,
0x1e,0x52,0x21,0x55,0x27,0x55,0x2a,0x52,0x2a,0x4f,0x1e,0x43,0x2a,0x43,0x00,0x00,
0x2f,0x52,0x32,0x55,0x38,0x55,0x3b,0x52,0x3b,0x46,0x38,0x43,0x32,0x43,0x2f,0x46,0x2f,0x52,0x00,0x00,
0x11,0x87,0x14,0x8a,0x1a,0x8a,0x1d,0x87,0x1d,0x84,0x11,0x78,0x1d,0x78,0x00,0x00,
0x23,0x8a,0x23,0x78,0x00,0x00,
0x1e,0xbb,0x21,0xbe,0x27,0xbe,0x2a,0xbb,0x2a,0xb8,0x1e,0xac,0x2a,0xac,0x00,0x00,
0x2f,0xbb,0x32,0xbe,0x38,0xbe,0x3b,0xbb,0x3b,0xb8,0x2f,0xac,0x3b,0xac,0x00,0x00,
0x40,0xdd,0x43,0xe0,0x49,0xe0,0x4c,0xdd,0x4c,0xda,0x40,0xce,0x4c,0xce,0x00,0x00,
0x51,0xdd,0x54,0xe0,0x5a,0xe0,0x5d,0xdd,0x5d,0xda,0x5a,0xd7,0x5d,0xd4,0x5d,0xd1,0x5a,0xce,0x54,0xce,0x51,0xd1,0x00,0x54,0xd7,0x5a,0xd7,0xff
};
byte DialDigitsRoman[] PROGMEM = {
0x76,0xdf,0x8a,0xdf,0x00,0x79,0xdf,0x80,0xf3,0x00,0x79,0xf3,0x80,0xdf,0x00,0x83,0xdf,0x83,0xf3,0x00,0x87,0xf3,0x87,0xdf,0x00,0x76,0xf3,0x8a,0xf3,0x00,
0xad,0xd1,0xb5,0xd1,0x00,0xb1,0xd1,0xb1,0xe5,0x00,0xad,0xe5,0xb5,0xe5,0x00,0x00,
0xd2,0xab,0xde,0xab,0x00,0xd6,0xab,0xd6,0xbf,0x00,0xda,0xab,0xda,0xbf,0x00,0xd2,0xbf,0xde,0xbf,0x00,
0xdc,0x76,0xee,0x76,0x00,0xe0,0x76,0xe0,0x8a,0x00,0xe5,0x76,0xe5,0x8a,0x00,0xea,0x76,0xea,0x8a,0x00,0xdc,0x8a,0xee,0x8a,0x00,0xc9,0x42,0xdf,0x42,0x00,0xce,0x42,0xce,0x56,0x00,0xd2,0x42,0xd2,0x56,0x00,0xd6,0x42,0xd6,0x56,0x00,0xda,0x42,0xda,0x56,0x00,0xc9,0x56,0xdf,0x56,0x00,0x00,
0xa9,0x22,0xb9,0x22,0x00,0xad,0x36,0xb1,0x22,0xb5,0x36,0x00,0xa9,0x36,0xb9,0x36,0x00,0x00,
0x75,0x14,0x89,0x14,0x00,0x79,0x28,0x7d,0x14,0x81,0x28,0x00,0x85,0x14,0x85,0x28,0x00,0x75,0x28,0x89,0x28,0x00,
0x43,0x22,0x59,0x22,0x00,0x46,0x36,0x4a,0x22,0x4e,0x36,0x00,0x51,0x22,0x51,0x36,0x00,0x55,0x22,0x55,0x36,0x00,0x43,0x36,0x59,0x36,0x00,0x00,
0x1d,0x42,0x39,0x42,0x00,0x22,0x56,0x26,0x42,0x2a,0x56,0x00,0x2e,0x42,0x2e,0x56,0x00,0x32,0x42,0x32,0x56,0x00,0x36,0x42,0x36,0x56,0x00,0x1d,0x56,0x39,0x56,0x00,
0x11,0x77,0x23,0x77,0x00,0x14,0x77,0x14,0x8b,0x00,0x18,0x77,0x20,0x8b,0x00,0x18,0x8b,0x20,0x77,0x00,0x11,0x8b,0x23,0x8b,0x00,0x00,
0x24,0xab,0x32,0xab,0x00,0x27,0xab,0x2f,0xbf,0x00,0x27,0xbf,0x2f,0xab,0x00,0x24,0xbf,0x32,0xbf,0x00,
0x48,0xd1,0x5a,0xd1,0x00,0x4b,0xd1,0x53,0xe5,0x00,0x4b,0xe5,0x53,0xd1,0x00,0x56,0xd1,0x56,0xe5,0x00,0x48,0xe5,0x5a,0xe5,0xff,0x00
};
byte DialDigitsMin [] PROGMEM = {
0x7a,0xeb,0x7a,0xd9,0x00,0x80,0xe8,0x83,0xeb,0x89,0xeb,0x8c,0xe8,0x8c,0xe5,0x80,0xd9,0x8c,0xd9,0x00,
0xe2,0x86,0xe5,0x89,0xeb,0x89,0xee,0x86,0xee,0x83,0xeb,0x80,0xee,0x7d,0xee,0x7a,0xeb,0x77,0xe5,0x77,0xe2,0x7a,0x00,0xe5,0x80,0xeb,0x80,0x00,
0x85,0x21,0x82,0x24,0x7c,0x24,0x79,0x21,0x79,0x15,0x7c,0x12,0x82,0x12,0x85,0x15,0x85,0x18,0x82,0x1b,0x7c,0x1b,0x79,0x18,0x00,0x1d,0x84,0x1a,0x81,0x1a,0x81,0x14,0x81,0x11,0x84,0x11,0x87,0x14,0x8a,0x1a,0x8a,0x1d,0x87,0x1d,0x7b,0x1a,0x78,0x14,0x78,0x11,0x7b,0xff
};
byte SecPtrData[] PROGMEM = {
0x80,0xec,0x80,0x80,0xff,0x8b,0xec,0x80,0x80,0xff,0x96,0xea,0x80,0x80,0xff,0xa1,0xe7,0x80,0x80,0xff,
0xab,0xe3,0x80,0x80,0xff,0xb6,0xde,0x80,0x80,0xff,0xbf,0xd8,0x80,0x80,0xff,0xc8,0xd1,0x80,0x80,0xff,
0xd0,0xc9,0x80,0x80,0xff,0xd7,0xc0,0x80,0x80,0xff,0xdd,0xb6,0x80,0x80,0xff,0xe2,0xac,0x80,0x80,0xff,
0xe6,0xa2,0x80,0x80,0xff,0xe9,0x97,0x80,0x80,0xff,0xeb,0x8c,0x80,0x80,0xff,0xeb,0x80,0x80,0x80,0xff,
0xeb,0x75,0x80,0x80,0xff,0xe9,0x6a,0x80,0x80,0xff,0xe6,0x5f,0x80,0x80,0xff,0xe2,0x55,0x80,0x80,0xff,
0xdd,0x4a,0x80,0x80,0xff,0xd7,0x41,0x80,0x80,0xff,0xd0,0x38,0x80,0x80,0xff,0xc8,0x30,0x80,0x80,0xff,
0xbf,0x29,0x80,0x80,0xff,0xb6,0x23,0x80,0x80,0xff,0xab,0x1e,0x80,0x80,0xff,0xa1,0x1a,0x80,0x80,0xff,
0x96,0x17,0x80,0x80,0xff,0x8b,0x15,0x80,0x80,0xff,0x80,0x15,0x80,0x80,0xff,0x74,0x15,0x80,0x80,0xff,
0x69,0x17,0x80,0x80,0xff,0x5e,0x1a,0x80,0x80,0xff,0x54,0x1e,0x80,0x80,0xff,0x4a,0x23,0x80,0x80,0xff,
0x40,0x29,0x80,0x80,0xff,0x37,0x30,0x80,0x80,0xff,0x2f,0x38,0x80,0x80,0xff,0x28,0x41,0x80,0x80,0xff,
0x22,0x4b,0x80,0x80,0xff,0x1d,0x55,0x80,0x80,0xff,0x19,0x5f,0x80,0x80,0xff,0x16,0x6a,0x80,0x80,0xff,
0x14,0x75,0x80,0x80,0xff,0x14,0x80,0x80,0x80,0xff,0x14,0x8c,0x80,0x80,0xff,0x16,0x97,0x80,0x80,0xff,
0x19,0xa2,0x80,0x80,0xff,0x1d,0xac,0x80,0x80,0xff,0x22,0xb6,0x80,0x80,0xff,0x28,0xc0,0x80,0x80,0xff,
0x2f,0xc9,0x80,0x80,0xff,0x37,0xd1,0x80,0x80,0xff,0x40,0xd8,0x80,0x80,0xff,0x49,0xde,0x80,0x80,0xff,
0x54,0xe3,0x80,0x80,0xff,0x5e,0xe7,0x80,0x80,0xff,0x69,0xea,0x80,0x80,0xff,0x74,0xec,0x80,0x80,0xff
};
byte MinPtrData[] PROGMEM = {
0x82,0x80,0x80,0xe6,0x7e,0x80,0x82,0x80,0xff,0x81,0x80,0x8a,0xe6,0x7e,0x81,0x81,0x80,0xff,
0x81,0x80,0x95,0xe4,0x7e,0x81,0x81,0x80,0xff,0x81,0x80,0x9f,0xe2,0x7e,0x81,0x81,0x80,0xff,
0x81,0x80,0xa9,0xde,0x7e,0x81,0x81,0x80,0xff,0x81,0x7f,0xb3,0xd9,0x7e,0x82,0x81,0x7f,0xff,
0x81,0x7f,0xbb,0xd3,0x7e,0x82,0x81,0x7f,0xff,0x81,0x7f,0xc4,0xcc,0x7e,0x82,0x81,0x7f,0xff,
0x81,0x7f,0xcb,0xc5,0x7e,0x82,0x81,0x7f,0xff,0x81,0x7f,0xd2,0xbc,0x7e,0x82,0x81,0x7f,0xff,
0x80,0x7f,0xd8,0xb3,0x7f,0x82,0x80,0x7f,0xff,0x80,0x7f,0xdd,0xaa,0x7f,0x82,0x80,0x7f,0xff,
0x80,0x7f,0xe1,0xa0,0x7f,0x82,0x80,0x7f,0xff,0x80,0x7f,0xe3,0x96,0x7f,0x82,0x80,0x7f,0xff,
0x80,0x7f,0xe5,0x8b,0x7f,0x82,0x80,0x7f,0xff,0x7f,0x7e,0xe5,0x80,0x80,0x82,0x7f,0x7e,0xff,
0x7f,0x7f,0xe5,0x76,0x80,0x82,0x7f,0x7f,0xff,0x7f,0x7f,0xe3,0x6b,0x80,0x82,0x7f,0x7f,0xff,
0x7f,0x7f,0xe1,0x61,0x80,0x82,0x7f,0x7f,0xff,0x7f,0x7f,0xdd,0x57,0x80,0x82,0x7f,0x7f,0xff,
0x7e,0x7f,0xd8,0x4d,0x81,0x82,0x7e,0x7f,0xff,0x7e,0x7f,0xd2,0x45,0x81,0x82,0x7e,0x7f,0xff,
0x7e,0x7f,0xcb,0x3c,0x81,0x82,0x7e,0x7f,0xff,0x7e,0x7f,0xc4,0x35,0x81,0x82,0x7e,0x7f,0xff,
0x7e,0x7f,0xbb,0x2e,0x81,0x82,0x7e,0x7f,0xff,0x7e,0x7f,0xb3,0x28,0x81,0x82,0x7e,0x7f,0xff,
0x7e,0x80,0xa9,0x23,0x81,0x81,0x7e,0x80,0xff,0x7e,0x80,0x9f,0x1f,0x81,0x81,0x7e,0x80,0xff,
0x7e,0x80,0x95,0x1d,0x81,0x81,0x7e,0x80,0xff,0x7e,0x80,0x8a,0x1b,0x81,0x81,0x7e,0x80,0xff,
0x7e,0x81,0x7f,0x1b,0x82,0x80,0x7e,0x81,0xff,0x7e,0x81,0x75,0x1b,0x81,0x80,0x7e,0x81,0xff,
0x7e,0x81,0x6a,0x1d,0x81,0x80,0x7e,0x81,0xff,0x7e,0x81,0x60,0x1f,0x81,0x80,0x7e,0x81,0xff,
0x7e,0x81,0x56,0x23,0x81,0x80,0x7e,0x81,0xff,0x7e,0x81,0x4d,0x28,0x81,0x80,0x7e,0x81,0xff,
0x7e,0x82,0x44,0x2e,0x81,0x7f,0x7e,0x82,0xff,0x7e,0x82,0x3b,0x35,0x81,0x7f,0x7e,0x82,0xff,
0x7e,0x82,0x34,0x3c,0x81,0x7f,0x7e,0x82,0xff,0x7e,0x82,0x2d,0x45,0x81,0x7f,0x7e,0x82,0xff,
0x7f,0x82,0x27,0x4e,0x80,0x7f,0x7f,0x82,0xff,0x7f,0x82,0x22,0x57,0x80,0x7f,0x7f,0x82,0xff,
0x7f,0x82,0x1e,0x61,0x80,0x7f,0x7f,0x82,0xff,0x7f,0x82,0x1c,0x6b,0x80,0x7f,0x7f,0x82,0xff,
0x7f,0x82,0x1a,0x76,0x80,0x7f,0x7f,0x82,0xff,0x80,0x82,0x1a,0x81,0x7f,0x7e,0x80,0x82,0xff,
0x80,0x82,0x1a,0x8b,0x7f,0x7f,0x80,0x82,0xff,0x80,0x82,0x1c,0x96,0x7f,0x7f,0x80,0x82,0xff,
0x80,0x82,0x1e,0xa0,0x7f,0x7f,0x80,0x82,0xff,0x80,0x82,0x22,0xaa,0x7f,0x7f,0x80,0x82,0xff,
0x80,0x82,0x27,0xb3,0x7f,0x7f,0x80,0x82,0xff,0x81,0x82,0x2d,0xbc,0x7e,0x7f,0x81,0x82,0xff,
0x81,0x82,0x34,0xc5,0x7e,0x7f,0x81,0x82,0xff,0x81,0x82,0x3b,0xcc,0x7e,0x7f,0x81,0x82,0xff,
0x81,0x82,0x44,0xd3,0x7e,0x7f,0x81,0x82,0xff,0x81,0x82,0x4c,0xd9,0x7e,0x7f,0x81,0x82,0xff,
0x81,0x81,0x56,0xde,0x7e,0x80,0x81,0x81,0xff,0x81,0x81,0x60,0xe2,0x7e,0x80,0x81,0x81,0xff,
0x81,0x81,0x6a,0xe4,0x7e,0x80,0x81,0x81,0xff,0x81,0x81,0x75,0xe6,0x7e,0x80,0x81,0x81,0xff
};
byte HrPtrData[] PROGMEM = {
0x82,0x80,0x80,0xbc,0x7e,0x80,0x82,0x80,0xff,0x81,0x80,0x86,0xbc,0x7e,0x81,0x81,0x80,0xff,
0x81,0x80,0x8c,0xbb,0x7e,0x81,0x81,0x80,0xff,0x81,0x80,0x92,0xba,0x7e,0x81,0x81,0x80,0xff,
0x81,0x80,0x98,0xb7,0x7e,0x81,0x81,0x80,0xff,0x81,0x7f,0x9e,0xb4,0x7e,0x82,0x81,0x7f,0xff,
0x81,0x7f,0xa3,0xb1,0x7e,0x82,0x81,0x7f,0xff,0x81,0x7f,0xa8,0xad,0x7e,0x82,0x81,0x7f,0xff,
0x81,0x7f,0xac,0xa9,0x7e,0x82,0x81,0x7f,0xff,0x81,0x7f,0xb0,0xa4,0x7e,0x82,0x81,0x7f,0xff,
0x80,0x7f,0xb3,0x9e,0x7f,0x82,0x80,0x7f,0xff,0x80,0x7f,0xb6,0x99,0x7f,0x82,0x80,0x7f,0xff,
0x80,0x7f,0xb9,0x93,0x7f,0x82,0x80,0x7f,0xff,0x80,0x7f,0xba,0x8d,0x7f,0x82,0x80,0x7f,0xff,
0x80,0x7f,0xbb,0x87,0x7f,0x82,0x80,0x7f,0xff,0x7f,0x7e,0xbb,0x80,0x80,0x82,0x7f,0x7e,0xff,
0x7f,0x7f,0xbb,0x7a,0x80,0x82,0x7f,0x7f,0xff,0x7f,0x7f,0xba,0x74,0x80,0x82,0x7f,0x7f,0xff,
0x7f,0x7f,0xb9,0x6e,0x80,0x82,0x7f,0x7f,0xff,0x7f,0x7f,0xb6,0x68,0x80,0x82,0x7f,0x7f,0xff,
0x7e,0x7f,0xb3,0x62,0x81,0x82,0x7e,0x7f,0xff,0x7e,0x7f,0xb0,0x5d,0x81,0x82,0x7e,0x7f,0xff,
0x7e,0x7f,0xac,0x58,0x81,0x82,0x7e,0x7f,0xff,0x7e,0x7f,0xa8,0x54,0x81,0x82,0x7e,0x7f,0xff,
0x7e,0x7f,0xa3,0x50,0x81,0x82,0x7e,0x7f,0xff,0x7e,0x7f,0x9e,0x4d,0x81,0x82,0x7e,0x7f,0xff,
0x7e,0x80,0x98,0x4a,0x81,0x81,0x7e,0x80,0xff,0x7e,0x80,0x92,0x47,0x81,0x81,0x7e,0x80,0xff,
0x7e,0x80,0x8c,0x46,0x81,0x81,0x7e,0x80,0xff,0x7e,0x80,0x86,0x45,0x81,0x81,0x7e,0x80,0xff,
0x7e,0x81,0x7f,0x45,0x82,0x80,0x7e,0x81,0xff,0x7e,0x81,0x79,0x45,0x81,0x80,0x7e,0x81,0xff,
0x7e,0x81,0x73,0x46,0x81,0x80,0x7e,0x81,0xff,0x7e,0x81,0x6d,0x47,0x81,0x80,0x7e,0x81,0xff,
0x7e,0x81,0x67,0x4a,0x81,0x80,0x7e,0x81,0xff,0x7e,0x81,0x62,0x4d,0x81,0x80,0x7e,0x81,0xff,
0x7e,0x82,0x5c,0x50,0x81,0x7f,0x7e,0x82,0xff,0x7e,0x82,0x57,0x54,0x81,0x7f,0x7e,0x82,0xff,
0x7e,0x82,0x53,0x58,0x81,0x7f,0x7e,0x82,0xff,0x7e,0x82,0x4f,0x5d,0x81,0x7f,0x7e,0x82,0xff,
0x7f,0x82,0x4c,0x63,0x80,0x7f,0x7f,0x82,0xff,0x7f,0x82,0x49,0x68,0x80,0x7f,0x7f,0x82,0xff,
0x7f,0x82,0x46,0x6e,0x80,0x7f,0x7f,0x82,0xff,0x7f,0x82,0x45,0x74,0x80,0x7f,0x7f,0x82,0xff,
0x7f,0x82,0x44,0x7a,0x80,0x7f,0x7f,0x82,0xff,0x80,0x82,0x44,0x81,0x7f,0x7e,0x80,0x82,0xff,
0x80,0x82,0x44,0x87,0x7f,0x7f,0x80,0x82,0xff,0x80,0x82,0x45,0x8d,0x7f,0x7f,0x80,0x82,0xff,
0x80,0x82,0x46,0x93,0x7f,0x7f,0x80,0x82,0xff,0x80,0x82,0x49,0x99,0x7f,0x7f,0x80,0x82,0xff,
0x80,0x82,0x4c,0x9e,0x7f,0x7f,0x80,0x82,0xff,0x81,0x82,0x4f,0xa4,0x7e,0x7f,0x81,0x82,0xff,
0x81,0x82,0x53,0xa9,0x7e,0x7f,0x81,0x82,0xff,0x81,0x82,0x57,0xad,0x7e,0x7f,0x81,0x82,0xff,
0x81,0x82,0x5c,0xb1,0x7e,0x7f,0x81,0x82,0xff,0x81,0x82,0x61,0xb4,0x7e,0x7f,0x81,0x82,0xff,
0x81,0x81,0x67,0xb7,0x7e,0x80,0x81,0x81,0xff,0x81,0x81,0x6d,0xba,0x7e,0x80,0x81,0x81,0xff,
0x81,0x81,0x73,0xbb,0x7e,0x80,0x81,0x81,0xff,0x81,0x81,0x79,0xbc,0x7e,0x80,0x81,0x81,0xff
};
byte TestData[] PROGMEM = {
0x01,0x01,0x01,0xfe,0xfe,0xfe,0xfe,0x01,0x01,0x01,0x00,
0x01,0x3f,0x01,0xbd,0x3f,0xfe,0xbd,0xfe,0xfe,0xbd,0xfe,0x3f,0xbd,0x01,0x3f,0x01,0x01,0x3f,0x00,
0x7f,0x7f,0x7f,0xfe,0x00,0x7f,0x7f,0xbd,0xfe,0x00,0x7f,0x7f,0xfe,0xfe,0x00,0x7f,0x7f,0xfe,0xbd,0x00,
0x7f,0x7f,0xfe,0x7f,0x00,0x7f,0x7f,0xfe,0x3f,0x00,0x7f,0x7f,0xfe,0x01,0x00,0x7f,0x7f,0xbd,0x01,0x00,
0x7f,0x7f,0x7f,0x01,0x00,0x7f,0x7f,0x3f,0x01,0x00,0x7f,0x7f,0x01,0x01,0x00,0x7f,0x7f,0x01,0x3f,0x00,
0x7f,0x7f,0x01,0x7f,0x00,0x7f,0x7f,0x01,0xbd,0x00,0x7f,0x7f,0x01,0xfe,0x00,0x7f,0x7f,0x3f,0xfe,0xff
};
© digitrode.ru