Ещё вариант под датчик BMP180. Добавлю: подсоединил Ардуино, которая 3,3 вольта и 8 MHz - не работает, хотя переделал на 5 вольт. Проблема решилась заменой кварца на 16 MHz. Часы работают как часы. Спасибо разработчикам и авторам.
/*BMP180
Часы с отображением температуры и влажности с индикацией на VFD (ВЛИ) дисплее покупателя 20*2 Futaba (vfd9cb1010 rev 1.2)
AMatroskin 2020 год.
devICEpro 2021 год.
*/
#include <GyverButton.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <iarduino_RTC.h>
#include <Adafruit_BMP085.h>
#define SEALEVELPRESSURE_HPA (1010.7)
#define BTN1 17 //____________________________________________________Пины кнопок
#define BTN2 16
#define BTN3 15
#define COR_TEMP 0 //_____________________________________________Коректирвка температуры (вычитается из показаний датчика)
#define FIRST_LEVEL 8 //_____________________________________________Уровни переключения яркости
#define SECOND_LEVEL 150
#define THIRD_LEVEL 210
#define SHIFT 1 //___________________________________________________Изменение порядка отображения на экране время -> температура/влажность (дата, день недели) и наоборот происходит раз в минуту
//____________________________________________________________________1 -автоматическая перестановка включена, 0 - выключена. (Уменьшение неравномерности износа люминофора)
Adafruit_BMP085 bmp; //______________________________________________Объекты датчика температуры/влажности, часов RTC, последовательного порта и кнопок
iarduino_RTC watch(RTC_DS3231);
SoftwareSerial mySerial(11, 10);
GButton butt1(BTN1);
GButton butt2(BTN2);
GButton butt3(BTN3);
char dots = 0;
int temp_round, temp_round_c1, temp_round_c2, temp_round_d; //_______Переменные для отображения температуры
int pres_round, pres_round_c1, pres_round_c2, pres_round_c3; //__________Переменные для отображения давления
uint32_t counter = 0, counter2 = 0; //_________________Переменные счетчиков
int val_filter; //___________________________________________________Переменные для фильтра датчика освещенности
long average;
int valArray[10];
byte idx = 0;
byte scr, index, min_hour = 0; //_________________________________________Служебные переменные
bool flag = 1, flag2 = 0, set_view = 0;
String up_half [12] { //_____________________________________________Верхние половины цифр
"\260\261", // ноль
"\264\265", // один
"\270\271", // два
"\274\275", // три
"\300\301", // четыре
"\304\305", // пять
"\310\311", // шесть
"\314\315", // семь
//"\400\401", // восемь
"\320\321", // восемь
"\324\325", // девять
"\330", // :
};
String down_half [12] { //___________________________________________Нижние половины цифр
"\262\263", // ноль
"\266\267", // один
"\272\273", // два
"\276\277", // три
"\302\303", // четыре
"\306\307", // пять
"\312\313", // шесть
"\316\317", // семь
"\322\323", // восемь
"\326\327", // девять
"\331", // :
"\333", // капля
};
/*String days [7] {
"\202\256\341", // Вос
"\217\256\255", // Пон
"\202\342\256", // Вто
"\221\340\245", // Сре
"\227\245\342", // Чет
"\217\357\342", // Пят
"\221\343\241", // Суб
};
*/
String days1 [] {
"\202",
"\217",
"\202",
"\221",
"\227",
"\217",
"\221",
};
String days2 [] {
"\256",
"\256",
"\342",
"\340",
"\245",
"\357",
"\343",
};
String days3 [] {
"\341",
"\255",
"\256",
"\245",
"\342",
"\342",
"\241",
};
void setup() {
delay(3000); //____________тут надо подождать
pinMode(10, OUTPUT);
watch.begin();
bmp.begin(0x76);
mySerial.begin(9600);
Serial.begin(9600);
mySerial.write(0x1B); //
mySerial.write(0x40); //____инициализация дисплея
delay(1000); //_____________и тут надо подождать
CustomFontLoad(); //________загрузка своего шрифта
delay(2000); //_____________и тут надо подождать
mySerial.write(0x0b); //____курсор домой
for (byte i; i < 10; i++) { //_Набираем массив значений с датчика освещенности для корректной работы сразу после запуска
Light (analogRead(20)); //___Датчик света подключен к 20 пину (А6)
}
}
void loop() {
butt1.tick();
if (butt1.isHolded() && butt1.isHold()) { //__Переключение режимов отображения/настройки времени
set_view = ! set_view;
mySerial.write(0x0b); //____________________курсор домой
}
switch (set_view) {
case 0: //________________________________Выводим время и устанавливаем яркость экрана раз в секунду
min_hour = 0;
if (millis() - counter >= 500) {
flag = ! flag;
show_time ();
counter += 500;
if ((Light (analogRead(20)) > THIRD_LEVEL)) {
set_brightness(4);
}
if (((Light (analogRead(20)) <= THIRD_LEVEL)) && ((Light (analogRead(20))) > SECOND_LEVEL) ) {
set_brightness(3);
}
if (((Light (analogRead(20)) <= SECOND_LEVEL)) && ((Light (analogRead(20)) > FIRST_LEVEL) )) {
set_brightness(2);
}
if (Light (analogRead(20)) <= FIRST_LEVEL) {
set_brightness(1);
}
}
break;
case 1: //________________________________Устанавливаем время
butt2.tick();
butt3.tick();
if (butt1.isClick()) {
min_hour ++;
}
if (min_hour > 5) min_hour = 0;
if (millis() - counter >= 200) {
counter += 200;
set_time();
}
break;
}
if (millis() - counter2 >= 5000) { //_______получаем температуру и влажность раз в 5 секунд
counter2 += 5000;
get_temp();
}
}
void CustomFontLoad() { //_____________________________Создаем свои символы
mySerial.write(0x1B);
mySerial.write(0x25);
mySerial.write(0x01); // Разрешаем кастомные символы
mySerial.write(0x1B);
mySerial.write(0x26);
mySerial.write(0x01); // Начинаем запись кастомных символов
mySerial.write(0xB0); // Первый адрес диапазона
//mySerial.write(0xdb); // Последний адрес диапазона
mySerial.write(0xdd); // Последний адрес диапазона
//_________________________Создание символов
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x1F); // Большой ноль 1
mySerial.write(0x3F); // \260
mySerial.write(0X70);
mySerial.write(0x60);
mySerial.write(0x60);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x63); // Большой ноль 2
mySerial.write(0x67); // \261
mySerial.write(0x76);
mySerial.write(0x3F);
mySerial.write(0x1F);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x7C); // Большой ноль 3
mySerial.write(0x7E); // \262
mySerial.write(0x37);
mySerial.write(0x73);
mySerial.write(0x63);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x3); // Большой ноль 4
mySerial.write(0x3); // \263
mySerial.write(0x7);
mySerial.write(0x7E);
mySerial.write(0x7C);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write((int)0x00); // Единица 1
mySerial.write((int)0x00); // \264
mySerial.write((int)0x00);
mySerial.write(0x18);
mySerial.write(0x38);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x7F); // Единица 2
mySerial.write(0x7F); // \265
mySerial.write((int)0x00);
mySerial.write((int)0x00);
mySerial.write((int)0x00);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write((int)0x00); // Единица 3
mySerial.write((int)0x00); // \266
mySerial.write((int)0x00);
mySerial.write(0x3);
mySerial.write(0x3);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x7F); // Единица 4
mySerial.write(0x7F); // \267
mySerial.write(0X3);
mySerial.write(0x3);
mySerial.write((int)0x00);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write((int)0x00); // Двойка 1
mySerial.write(0x30); // \270
mySerial.write(0X70);
mySerial.write(0x60);
mySerial.write(0x60);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x60); // Двойка 2
mySerial.write(0x61); // \271
mySerial.write(0X73);
mySerial.write(0x3F);
mySerial.write(0x1E);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x3); // Двойка 3
mySerial.write(0x7); // \272
mySerial.write(0XF);
mySerial.write(0x1F);
mySerial.write(0x3B);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x73); // Двойка 4
mySerial.write(0x63); // \273
mySerial.write(0X43);
mySerial.write(0x3);
mySerial.write(0x3);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write((int)0x00); // Тройка 1
mySerial.write(0x60); // \274
mySerial.write(0X60);
mySerial.write(0x61);
mySerial.write(0x63);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x67); // Тройка 2
mySerial.write(0x6E); // \275
mySerial.write(0X7C);
mySerial.write(0x78);
mySerial.write(0x70);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0xC); // Тройка 3
mySerial.write(0xE); // \276
mySerial.write(0X7);
mySerial.write(0x43);
mySerial.write(0x43);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x43); // Тройка 4
mySerial.write(0x43); // \277
mySerial.write(0X67);
mySerial.write(0x7E);
mySerial.write(0x3C);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x1); // Четверка 1
mySerial.write(0x3); // \300
mySerial.write(0X7);
mySerial.write(0xE);
mySerial.write(0x1C);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x60); // Четверка 2
mySerial.write(0x7F); // \301
mySerial.write(0X7F);
mySerial.write((int)0x00);
mySerial.write((int)0x00);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x70); // Четверка 3
mySerial.write(0x70); // \302
mySerial.write(0X30);
mySerial.write(0x30);
mySerial.write(0x30);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x30); // Четверка 4
mySerial.write(0x7F); // \303
mySerial.write(0X7F);
mySerial.write(0x30);
mySerial.write(0x30);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write((int)0x00); // Пятерка 1
mySerial.write(0x7F); // \304
mySerial.write(0X7F);
mySerial.write(0x63);
mySerial.write(0x63);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x63); // Пятерка 2
mySerial.write(0x63); // \305
mySerial.write(0X63);
mySerial.write(0x61);
mySerial.write(0x60);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0xC); // Пятерка 3
mySerial.write(0xE); // \306
mySerial.write(0X7);
mySerial.write(0x3);
mySerial.write(0x3);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x3); // Пятерка 4
mySerial.write(0x3); // \307
mySerial.write(0X47);
mySerial.write(0x7E);
mySerial.write(0x7C);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0xF); // Шестерка 1
mySerial.write(0x1F); // \310
mySerial.write(0X39);
mySerial.write(0x73);
mySerial.write(0x63);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x63); // Шестерка 2
mySerial.write(0x63); // \311
mySerial.write(0X63);
mySerial.write(0x61);
mySerial.write((int)0x00);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x7C); // Шестерка 3
mySerial.write(0x7E); // \312
mySerial.write(0X47);
mySerial.write(0x43);
mySerial.write(0x3);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x3); // Шестерка 4
mySerial.write(0x3); // \313
mySerial.write(0X47);
mySerial.write(0x7E);
mySerial.write(0x7C);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write((int)0x00); // Семерка 1
mySerial.write(0x60); // \314
mySerial.write(0X60);
mySerial.write(0x60);
mySerial.write(0x60);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x63); // Семерка 2
mySerial.write(0x67); // \315
mySerial.write(0X6E);
mySerial.write(0x7C);
mySerial.write(0x78);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write((int)0x00); // Семерка 3
mySerial.write((int)0x00); // \316
mySerial.write((int)0x00);
mySerial.write(0x3F);
mySerial.write(0x7F);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write((int)0x00); // Семерка 4
mySerial.write((int)0x00); // \317
mySerial.write((int)0x00);
mySerial.write((int)0x00);
mySerial.write((int)0x00);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x1E); // Восьмерка 1
mySerial.write(0x3F); // \320
mySerial.write(0X73);
mySerial.write(0x61);
mySerial.write(0x61);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x61); // Восьмерка 2
mySerial.write(0x61); // \321
mySerial.write(0X73);
mySerial.write(0x3F);
mySerial.write(0x1E);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x3C); // Восьмерка 3
mySerial.write(0x7E); // \322
mySerial.write(0X67);
mySerial.write(0x43);
mySerial.write(0x43);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x43); // Восьмерка 4
mySerial.write(0x43); // \323
mySerial.write(0X67);
mySerial.write(0x7E);
mySerial.write(0x3C);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x1F); // Девятка 1
mySerial.write(0x3F); // \324
mySerial.write(0X71);
mySerial.write(0x60);
mySerial.write(0x60);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x60); // Девятка 2
mySerial.write(0x60); // \325
mySerial.write(0X71);
mySerial.write(0x3F);
mySerial.write(0x1F);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write((int)0x00); // Девятка 3
mySerial.write(0x43); // \326
mySerial.write(0X63);
mySerial.write(0x63);
mySerial.write(0x63);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x63); // Девятка 4
mySerial.write(0x67); // \327
mySerial.write(0X4E);
mySerial.write(0x7C);
mySerial.write(0x78);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write((int)0x00); // Двоеточие верх
mySerial.write(0xE); // \330
mySerial.write(0XE);
mySerial.write(0xE);
mySerial.write((int)0x00); //
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write((int)0x00); // Двоеточие низ
mySerial.write(0x38); // \331
mySerial.write(0X38);
mySerial.write(0x38);
mySerial.write((int)0x00);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x30); // Значок градуса °
mySerial.write(0x48); // \332
mySerial.write(0x48);
mySerial.write(0x30);
mySerial.write((int)0x00);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0xe); // Значок капелька
mySerial.write(0x1f); // \333
mySerial.write(0x7f);
mySerial.write(0x1f);
mySerial.write(0xe);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x10); // Значок домик
mySerial.write(0x3e); // \334
mySerial.write(0x72);
mySerial.write(0x3e);
mySerial.write(0x10);
mySerial.write(0x05); // Размер символа 5 байт
mySerial.write(0x04); // Значок стрелка
mySerial.write(0x06); // \335
mySerial.write(0x7F);
mySerial.write(0x06);
mySerial.write(0x04);
}
void show_time () { //_________________________________Отображение времени
watch.gettime();
byte m2;
m2 = watch.minutes % 10;
//_____________________________________________________Отрисовка содержимого экрана
if ((SHIFT) && ((m2 % 2) == 0)) { //_____________________Если изменение порядка отображения на экране активно
scr = constrain(scr, 1, 8);
output();
scr--;
} else if ((SHIFT) && ((m2 % 2) != 0)) {
scr = constrain(scr, 1, 8);
output();
scr++;
} else {
if ((m2 % 2) == 0) {
// scr = constrain(scr, 8, 10);
scr = 9;
output();
// scr++;
} else if ((m2 % 2) != 0) {
// scr = constrain(scr, 8, 10);
scr = 8;
output();
// scr--;
}
}
}
void output() {
byte d1, d2, mon1, mon2, wd;
d1 = watch.day / 10;
d2 = watch.day % 10;
mon1 = watch.month / 10;
mon2 = watch.month % 10;
// days = watch.gettime("D");
wd = watch.weekday;
Serial.println(scr);
switch (scr) {
case 1:
mySerial.print(" "); //Дата слева
mySerial.print(days1 [wd]);
mySerial.print(days2 [wd]);
mySerial.print(days3 [wd]);
mySerial.print(" ");
big_time_up();
mySerial.print(d1); //Дата слева
mySerial.print(d2);
mySerial.print("/");
mySerial.print(mon1);
mySerial.print(mon2);
mySerial.print(" ");
big_time_down();
break;
case 2:
mySerial.print(days1 [wd]);
mySerial.print(days2 [wd]);
mySerial.print(days3 [wd]);
mySerial.print(" ");
big_time_up();
mySerial.print(" ");
mySerial.print(d2);
mySerial.print("/");
mySerial.print(mon1);
mySerial.print(mon2);
mySerial.print(" ");
big_time_down();
mySerial.print(" ");
break;
case 3:
mySerial.print(days2 [wd]);
mySerial.print(days3 [wd]);
mySerial.print(" ");
big_time_up();
mySerial.print(" \334");
mySerial.print("/");
mySerial.print(mon1);
mySerial.print(mon2);
mySerial.print(" ");
big_time_down();
mySerial.print(" \335");
break;
case 4:
mySerial.print(days3 [wd]);
mySerial.print(" ");
big_time_up();
mySerial.print(" \334");
mySerial.print(temp_round_c1);
mySerial.print(mon1);
mySerial.print(mon2);
mySerial.print(" ");
big_time_down();
mySerial.print(" \335");
mySerial.print(pres_round_c1);
break;
case 5:
mySerial.print(" ");
big_time_up();
mySerial.print(" \334");
mySerial.print(temp_round_c1);
mySerial.print(temp_round_c2);
mySerial.print(mon2);
mySerial.print(" ");
big_time_down();
mySerial.print(" \335");
mySerial.print(pres_round_c1);
mySerial.print(pres_round_c2);
break;
case 6:
mySerial.print(" ");
big_time_up();
mySerial.print(" \334");
mySerial.print(temp_round_c1);
mySerial.print(temp_round_c2);
mySerial.print(".");
mySerial.print(" ");
big_time_down();
mySerial.print(" \335");
mySerial.print(pres_round_c1);
mySerial.print(pres_round_c2);
mySerial.print(pres_round_c3);
break;
case 7:
mySerial.print(" ");
big_time_up();
mySerial.print(" \334");
mySerial.print(temp_round_c1);
mySerial.print(temp_round_c2);
mySerial.print(".");
mySerial.print(temp_round_d);
mySerial.print(" ");
big_time_down();
mySerial.print(" \335");
mySerial.print(pres_round_c1);
mySerial.print(pres_round_c2);
mySerial.print(pres_round_c3);
mySerial.print("H");
break;
case 8:
big_time_up();
mySerial.print(" \334");
mySerial.print(temp_round_c1);
mySerial.print(temp_round_c2);
mySerial.print(".");
mySerial.print(temp_round_d);
mySerial.print("\332");
big_time_down();
mySerial.print(" \335");
mySerial.print(pres_round_c1);
mySerial.print(pres_round_c2);
mySerial.print(pres_round_c3);
mySerial.print("Hg");
break;
case 9:
big_time_up();
mySerial.print(" "); //Дата справа
mySerial.print(days1 [wd]);
mySerial.print(days2 [wd]);
mySerial.print(days3 [wd]);
mySerial.print(" ");
big_time_down();
mySerial.print(" ");
mySerial.print(d1); //Дата справа
mySerial.print(d2);
mySerial.print("/");
mySerial.print(mon1);
mySerial.print(mon2);
break;
}
}
void big_time_up() {
byte h1, h2, m1, m2, s1, s2;
String dots_up;
if (flag) { //_______________________________________Мигаем точками
dots_up = up_half [10];
dots = ':';
} else {
dots_up = " ";
dots = ' ';
}
h1 = watch.Hours / 10;
h2 = watch.Hours % 10;
m1 = watch.minutes / 10;
m2 = watch.minutes % 10;
s1 = watch.seconds / 10;
s2 = watch.seconds % 10;
String h10_up; //_________________Гашение старшего ноля
if (h1 == 0) {
h10_up = " ";
} else {
h10_up = up_half [h1];
}
mySerial.print(" ");
mySerial.print(h10_up); //_______________________Первая строка: верхние половины больших цифр, точек, значение температуры, символ градуса
mySerial.print(up_half [h2]);
mySerial.print(dots_up);
mySerial.print(up_half [m1]);
mySerial.print(up_half [m2]);
mySerial.print(" "); //три пробела
}
void big_time_down() {
byte h1, h2, m1, m2, s1, s2;
String dots_down;
if (flag) { //_______________________________________Мигаем точками
dots_down = down_half [10];
dots = ' ';
} else {
dots_down = " ";
dots = ' ';
}
h1 = watch.Hours / 10;
h2 = watch.Hours % 10;
m1 = watch.minutes / 10;
m2 = watch.minutes % 10;
s1 = watch.seconds / 10;
s2 = watch.seconds % 10;
String h10_down; //_________________Гашение старшего ноля
if (h1 == 0) {
h10_down = " ";
} else {
h10_down = down_half [h1];
}
mySerial.print(" ");
mySerial.print(h10_down); //_____________________Вторая строка: нижние половины больших цифр, точек, влажность
mySerial.print(down_half [h2]);
mySerial.print(dots_down);
mySerial.print(down_half [m1]);
mySerial.print(down_half [m2]);
mySerial.print(dots);
mySerial.print(watch.seconds / 10);
mySerial.print(watch.seconds % 10);
}
void get_temp() { //___________________________________Получение данных о температуре и влажности и их обработка (округление, разбиение на разряды)
temp_round = bmp.readTemperature() - COR_TEMP;
temp_round_c1 = (temp_round / 10);
temp_round_c2 = (temp_round % 10);
int d = (bmp.readTemperature() * 10);
temp_round_d = (d % 10);
float p = bmp.readPressure();
pres_round = (p / 100 / 100 * 75); //________________________________________//перевод Па в мм.рт.ст.
//Serial.print(bmp.readPressure());
// Serial.print("Press_pound:");
// Serial.println(pres_round);
pres_round_c1 = (pres_round / 100);
pres_round_c2 = ((pres_round % 100) / 10);
pres_round_c3 = (pres_round % 10);
}
void set_brightness(byte lev) {//______________________Установка яркости дисплея (1 - 4)
byte level = lev;
switch (level) {
case 1:
mySerial.write(0x1B); //_________________________Первый уровень яркости
mySerial.write(0x2A);
mySerial.write(0x01);
break;
case 2:
mySerial.write(0x1B); //_________________________Второй уровень яркости
mySerial.write(0x2A);
mySerial.write(0x02);
break;
case 3:
mySerial.write(0x1B); //_________________________Третий уровень яркости
mySerial.write(0x2A);
mySerial.write(0x03);
break;
case 4:
mySerial.write(0x1B); //_________________________Четвертый уровень яркости
mySerial.write(0x2A);
mySerial.write(0x04);
break;
}
}
void set_time() { //___________________________________Экран установки времени
flag = ! flag;
if (min_hour == 0) {
// mySerial.print(" Setting Hours ");
mySerial.print(" \223\341\342\240\255\256\242\252\240\40\227\240\341\256\242 ");
} else if (min_hour == 1) {
// mySerial.print(" Setting Minutes ");
mySerial.print(" \223\341\342\240\255\256\242\252\240\40\214\250\255\343\342 ");
} else if (min_hour == 2) {
// mySerial.print(" Reset Seconds ");
mySerial.print(" \221\241\340\256\341\40\221\245\252\343\255\244 ");
} else if (min_hour == 3) {
// mySerial.print("Setting Day of Week ");
mySerial.print("\223\341\342\240\255\256\242\252\240\40\204\255\357\40\215\245\244\245\253\250");
} else if (min_hour == 4) {
// mySerial.print("Setting Day of Month");
mySerial.print(" \223\341\342\240\255\256\242\252\240\40\227\250\341\253\240 ");
} else if (min_hour == 5) {
// mySerial.print(" Setting Month ");
mySerial.print(" \223\341\342\240\255\256\242\252\240\40\214\245\341\357\346\240 ");
}
watch.gettime();
mySerial.print(watch.Hours / 10);
mySerial.print(watch.Hours % 10);
mySerial.print(":");
mySerial.print(watch.minutes / 10);
mySerial.print(watch.minutes % 10);
mySerial.print(":");
mySerial.print(watch.seconds / 10);
mySerial.print(watch.seconds % 10);
mySerial.print(" ");
mySerial.print(watch.gettime("D"));
mySerial.print(" ");
mySerial.print(watch.day / 10);
mySerial.print(watch.day % 10);
mySerial.print(" ");
mySerial.print(watch.gettime("M"));
//__________________________________________Минуты
if ((min_hour == 1) && butt2.isClick() ) {
//flag2 = 0;
int m = (watch.minutes + 1);
if (m >= 60) m = 0;
watch.settime(-1, m);
}
if ((min_hour == 1) && butt2.isHold() ) {
int m = (watch.minutes + 5);
if (m >= 60) m = 0;
watch.settime(-1, m);
}
if ((min_hour == 1) && butt3.isClick()) {
// flag2 = 0;
int m = (watch.minutes - 1);
if (m < 0) m = 59;
watch.settime(-1, m);
}
if ((min_hour == 1) && butt3.isHold()) {
int m = (watch.minutes - 5);
if (m < 0) m = 59;
watch.settime(-1, m);
}
//__________________________________________Часы
if ((min_hour == 0) && butt2.isClick() ) {
int m = (watch.Hours + 1);
if (m >= 24) m = 0;
watch.settime(-1, -1, m);
}
if ((min_hour == 0) && butt2.isHold() ) {
int m = (watch.Hours + 2);
if (m >= 24) m = 0;
watch.settime(-1, -1, m);
}
if ((min_hour == 0) && butt3.isClick() ) {
int m = (watch.Hours - 1);
if (m < 0) m = 23;
watch.settime(-1, -1, m);
}
if ((min_hour == 0) && butt3.isHold() ) {
int m = (watch.Hours - 2);
if (m < 0) m = 23;
watch.settime(-1, -1, m);
}
//__________________________________________Секунды
if ((min_hour == 2) && butt2.isClick()) {
watch.settime(0);
}
if ((min_hour == 2) && butt3.isClick()) {
watch.settime(0);
}
//__________________________________________День недели
if ((min_hour == 3) && butt2.isClick()) {
int m = (watch.weekday + 1);
if (m > 6) m = 0;
watch.settime(-1, -1, -1, -1, -1, -1, m);
}
if ((min_hour == 3) && butt3.isClick()) {
int m = (watch.weekday - 1);
if (m < 0) m = 6;
watch.settime(-1, -1, -1, -1, -1, -1, m);
}
//__________________________________________День месяца
if ((min_hour == 4) && butt2.isClick()) {
int m = (watch.day + 1);
if (m > 31) m = 1;
watch.settime(-1, -1, -1, m);
}
if ((min_hour == 4) && butt3.isClick()) {
int m = (watch.day - 1);
if (m < 1) m = 31;
watch.settime(-1, -1, -1, m);
}
//__________________________________________Месяц
if ((min_hour == 5) && butt2.isClick()) {
int m = (watch.month + 1);
if (m > 12) m = 1;
watch.settime(-1, -1, -1, -1, m);
}
if ((min_hour == 5) && butt3.isClick()) {
int m = (watch.month - 1);
if (m < 1) m = 12;
watch.settime(-1, -1, -1, -1, m);
}
}
//__________________________________________Фильтр значений для датчика света (среднее арифметическое из последних 10 значений)
uint8_t Light(int newVal) { //________________принимает новое значение
valArray[idx] = newVal; //_________________пишем каждый раз в новую ячейку
if (++idx >= 10) idx = 0; //________________перезаписывая самое старое значение
average = 0; //_________________обнуляем среднее
for (int i = 0; i < 10; i++) {
average += valArray[i]; //________________суммируем
}
average /= 10; //________________делим
return average; //________________возвращаем
}
Давно валялся без дела такой дисплей, наконец-то нашлось применение. Решил на старости лет начать "здоровый образ жизни", приобрел самогонный аппарат. Так как живу в частном доме, то возникли проблемы с охлаждением. Насосная станция не обеспечивает постоянство давления, а большой объем утилизируемой воды, чреват частой откачкой сливной ямы. Поэтому была собрана система автономного охлаждения и небольшая автоматика. Она позволяет контролировать температуры на входе и выходе радиатора, а так-же поток охлаждающей жидкости. В дальнейшем, по итогам эксплуатации, скорее всего будут добавлены аварийная сигнализация и управление вентилятором радиатора. Скетч собран из нескольких кусков и явно не оптимален, но работает и достаточно хорошо прокомментирован, его легко модифицировать для своих хотелок. Связь с дисплеем по софт - сериалу. Аппаратный остался для программирования, и выведен в отверстие корпуса.
/*
https://arduino-diy.com/arduino-datchik-rashoda-vodi
Формула для расчета расхода воды с ипользованием датчика и Arduino
l_hour = (flow_frequency * 60 / 7.5)
Один обороте крыльчатки соответствует определенному объему жидкости. Количество импульсов,за оборот,
также фиксированно. Поэтому можно установить зависимость между количеством импульсов и расходом воды.
Для YF-S201 на 1 литр протекающей воды датчик Холла выдает 450 импульсов.Т.Е. каждый импульс означает
протекание 1/450 литра воды.
За V_total (1 литр) возьмем объем жидкости, протекающей через датчик расхода воды за время t(1 секунда),
а за N общее количество обнаруженных импульсов.
Тогда мы получим: V_total(L) = N* 1/450(L)
Кроме того, общий объем жидкости, протекающей через датчик расхода воды, равен расходу воды
(Q - литр/секунда), умноженному на время t (секунда).
V_total(L) = Q(L/s)*t(s)
В результате N*1/450 = Q(L/s)*t(s)
N/t = 450 * Q(L/s)
N/t - частота f = 450*Q(L/s);
Q(L/s) = f/450;
Q(L/min) = f*60/450 = f/7.5
Q(L/hour) = f*60*60/450 = f*60/7.5
Для YF - S402 на каждый литр протекающей воды датчик Холла выдает 4380 импульсов.
По аналогии:
f = 4380*Q(L/s);
Q(L/s) = f/4380;
Q(L/min) = f*60/4380 = f/73
Q(L/hour) = f*60*60/4380 = f*60 /73
*/
byte RI=0;
int Symbol;
int Radiator_In=255;
int Radiator_Out=200;
unsigned long total=0;
volatile int flow_frequency; // счетчик для измерения частоты вращения
int l_hour; // рассчитанные литр/час
unsigned char flowsensor = 2; // Вход сенсора
unsigned long currentTime;
unsigned long cloopTime;
unsigned long T_Ind;
String Buffer = "Система автономного охлаждения ";
#include <SoftwareSerial.h>
#include <OneWire.h>
SoftwareSerial display = SoftwareSerial(12, 11);// RX, TX
OneWire ds(10); // Вход для датчиков DS18B20,подтяжка к питанию 4,7 КОм
byte ND=0; // № датчика
void setup()
{
pinMode(flowsensor, INPUT);
digitalWrite(flowsensor, HIGH);
Serial.begin(9600);
display.begin(9600);
delay(500);
display.print(utf8rus("Система автономного охлаждения "));
delay(2000);Home();
attachInterrupt(0, impuls, RISING); //Прерывание по нарастающему фронту на D2
sei(); // активируем прерывания
currentTime = millis();
cloopTime = currentTime;
T_Ind=millis();
for (byte i=0; i<=39;i++)display.write(32);Home();
}
//*******************************************************************************************
void loop() {
currentTime = millis();
// Каждую секунду рассчитываем литры в час
if(currentTime >= (cloopTime + 1000))
{
cloopTime = currentTime; // Обновление cloopTime
// Частота импульсов (Гц) = 7.5Q, Q - это расход в л/мин.
l_hour = (flow_frequency * 60 / 7.5); // (Частота x 60 мин) / 7.5Q = расход в л/час
flow_frequency = 0; // Сбрасываем счетчик
}
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;
if ( !ds.search(addr)) {
if (ND==0)display.print(utf8rus(" Нет датчиков температуры"));
ND=0;
// Serial.println();
ds.reset_search();
delay(100);
return;
}
ND+=1;
//if (ND<1) display.print(utf8rus(" Нет датчиков температуры "));
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end
delay(500);
present = ds.reset();
ds.select(addr);
ds.write (0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
// convert the data to actual temperature
unsigned int raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// count remain gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
if (ND==1){Radiator_In=celsius*10;} // 1 датчик
if (ND==2){Radiator_Out=celsius*10;} // 2 датчик
if (millis()-T_Ind>10000) //Время смены экрана
{
RI=!RI;T_Ind=millis(); //Смена экрана
for (byte i=0; i<=39;i++)display.write(32);Home(); // Стирание табло и возврат в первую позицию
}
//l_hour+=1; total+=46; // Тестовая строка без датчика потока
if (RI==1)
{
display.print(utf8rus("Вх.радиатора "));
display.print(Radiator_In%1000/10);display.print(".");display.print(Radiator_In%10);display.write(248);
display.print("C");
display.print(utf8rus("Вых.радиатора "));
display.print(Radiator_Out%1000/10);display.print(".");display.print(Radiator_Out%10);display.write(248);
display.print("C");
}
else {
display.print(utf8rus(" Расход воды "));
//display.print (analogRead(SPIRT)/10);
if (l_hour<10)display.print(" ");
if (l_hour>=10 & l_hour<100)display.print(" ");
display.print(l_hour);
display.print(utf8rus(" л/ч Всего "));
display.print(total/450);
display.print(utf8rus(" л"));
}Home();
}
/* Recode russian fonts from UTF-8 to Windows-1251 */
String utf8rus(String source)
{
int i,k;
String target;
unsigned char n;
char m[2] = { '0', '\0' };
k = source.length(); i = 0;
while (i < k) {
n = source[i]; i++;
if (n >= 192) {// 192-207 А----Р
switch (n) {
case 208: {
n = source[i]; i++;
if (n >= 144 && n <= 191) n = n -16; // Большие А---Я
break;
}
case 209: {
n = source[i]; i++;
if (n >= 128 && n <= 143) n = n + 96; // малые р-----я
break;
}
}
}
m[0] = n; target = target + String(m);
}
return target;
}
// Подпрограмма прерывания
void impuls(){
{flow_frequency++;
total++;}
}
void Home(){
display.write(4);
display.write(1);
display.write(80);
display.write(0x31); // первая позиция
display.write(23);
}
Вот на такой ардуине запустил дисплей. СтОит дешевле настоящей. Только пришлось выводы на кнопки переназначить. В корпусе TQFP тоже работает - проверил. Так что можно сэкономить.
Что Вы хотите там найти, чего нет на форуме? Или просто так, понаблюдать за развитием событий? В группу принимаются только те, кто от кого есть польза, то есть идеи, предложения и т.д. От Вас будет польза?
Привет Всем! Я слежу за темой достаточно давно, даже есть собственная версия часов на дисплее (см 3 страницу)
Как и хотел - дописал будильник с мелодией на функции ТОН
Но здесь подобралась команда, которая проект развила до необычных высот! Прямое управление колбой! Я не успеваю у китайцев заказывать комплектующие, как выходит что-то новое!
Но, к сожалению, меня выперли из группы. Я понимаю, что пользы в группе от меня не много, мягко говоря=( но хочется последить за темой! Я хотел бы присоединиться к группе. Хотел бы опять попасть в группу. Идея управления 1 -3 кнопками меня очень привлекает, так как её можно использовать с любым корпусом! А такой функционал какой достигнут в группе мне к сожалению и не снился!
Итак, по часам с будильником, краткое описание моей модификации прошивки.
Первое, что мне не понравилось в исходном коде - хранение констант в ОЗУ и ДЕВЯТЬ КНОПОК управления!
Расположил все текстовые константы в ПЗУ, написал обработку кнопки (жуть как коряво, ну как смог!), для ускорения процессов делаи были убраны и программа была завёрнута в функции. Результат почти понравился, только работа кнопки пока не радует - нет чёткости опознания в режиме двойного клика, но работает.
Товарищ посмотрел и спросил - А будильник как включить? ОПА! А будильника то и нет! Опять сел за книжки и в результате появился будильник на функции ТОНЕ. Естественно, все константы мелодий и длительностей тоже расположились в ПЗУ.
Отлаживал всё, даже звук в PROTEUSе, затем уже заливал в камень.
Вообще. хотелось бы программировать пограмотней, но занимаюсь этим набегами и после перерыва приходится вспоминать азы, а не то что код свой совершенствовать! Стараюсь из-за этого код комментировать побогаче, а то сам заблужусь в том что ваворотил! 8-))
Как то так...
Да! Для генерации текстовых сообщений написал небольшую утилитку:
Набираешь текст, нажимаешь "применить" и копируешь код в скетч.
Если я правильно понял этот вот этот аппарат: https://manualzz.com/doc/52504849/wincor-nixdorf-ba63gv-operating-manual
это графический дисплей, именно с таким тут никто не работал, редкая модель, т.к. например лично я первый раз читаю про такой, не говоря уже о том чтобы работать с ним вживую, из документации понятно, что возможности у него очень неплохие. Например можно выбрать из нескольких размеров символов, и даже загружать свой логотип. Документация довольно подробная, при желании разобраться можно, да и примеров работы в этой теме тоже достаточно. Интерфейс подключения (USB или RS232) роли не играет, т.к. подключение осуществляется через UART,. напрямую к процу.
Т.е. если я правильно понял Вас понял можно сразу к процу цепляться.
Спасибо.
Я пробовал цепляться к rx-tx, но не был уверен в нане. И rx-tx на проце две пары, чем отличаются так и не вычитал. Я думал что как раз rs232 на этой плате и нет.
Смотрите куда подключен выход преобразователя интерфейса (USB -> UART в вашем случае наверно).
ЗЫ: тут после падения радикала все фотки пропали, вот в этой статье есть описание подключения к уарту проца напрямую.
Продолжение темы дисплеев, прямое управление колбой, без использования "мозгов" платы на безе МК ESP32, прошу ознакомиться, протестить, а лучше взять и использовать для чего нибудь интересного) https://cxem.net/mc/mc503.php
Круто! Спасибо! Можно попросить ещё добавить возможность писать сообщения, думаю полезно будет)
Пардон )))) по ошибке создал канал а не группу для обсуждений
Просьба заходить по сылке https://t.me/joinchat/DCfF8RMLuuQ1YzFi
"Срок действия ссылки истек" ))))
Матроскин Привет! Ты по какой ссылке переходишь ? по этой ? https://t.me/joinchat/DCfF8RMLuuQ1YzFi
Привет, все теперь, вошёл)
Кто-то спрашивал про датчик BMP280. Вот, прикрутил. Ну, и добавил пару плюшек в отображении температуры и влажности.
https://youtu.be/-MO7UjDYdd4
А как сюда скетч выложить?
Либо прямо текстом через кнопку {Code}, либо залей куда нибудь. Но наверно лучше текстом, так не потеряется)
Корпус сделаю - покажу.
А откуда в BMP280 влажность? Там вроде только давление и температура.
В коде BME. Там влажность есть.
Ещё вариант под датчик BMP180. Добавлю: подсоединил Ардуино, которая 3,3 вольта и 8 MHz - не работает, хотя переделал на 5 вольт. Проблема решилась заменой кварца на 16 MHz. Часы работают как часы. Спасибо разработчикам и авторам.
Вот, что получилось.
Теперь борюсь с пятивольтовым дисплеем, вот таким.
Борешься с ICD2002F ? Ну ну.... Надоест бороться, посмотри пост #388. Этот дисплей не поддерживает загрузку символов
Естественно, всё прочитал, пытаюсь создать цифры из имеющихся символов (бред, конечно).
Давно валялся без дела такой дисплей, наконец-то нашлось применение. Решил на старости лет начать "здоровый образ жизни", приобрел самогонный аппарат. Так как живу в частном доме, то возникли проблемы с охлаждением. Насосная станция не обеспечивает постоянство давления, а большой объем утилизируемой воды, чреват частой откачкой сливной ямы. Поэтому была собрана система автономного охлаждения и небольшая автоматика. Она позволяет контролировать температуры на входе и выходе радиатора, а так-же поток охлаждающей жидкости. В дальнейшем, по итогам эксплуатации, скорее всего будут добавлены аварийная сигнализация и управление вентилятором радиатора. Скетч собран из нескольких кусков и явно не оптимален, но работает и достаточно хорошо прокомментирован, его легко модифицировать для своих хотелок. Связь с дисплеем по софт - сериалу. Аппаратный остался для программирования, и выведен в отверстие корпуса.
Картинка:
Небольшое видео можно посмотреть здесь: https://youtu.be/g19EroMPwL8
Вот на такой ардуине запустил дисплей. СтОит дешевле настоящей. Только пришлось выводы на кнопки переназначить. В корпусе TQFP тоже работает - проверил. Так что можно сэкономить.
Здравствуйте, можно еще раз ссылку на телеграмм пожалуйста
Старая выдаёт ошибку , что ссылка устарела
Лого
Что Вы хотите там найти, чего нет на форуме? Или просто так, понаблюдать за развитием событий? В группу принимаются только те, кто от кого есть польза, то есть идеи, предложения и т.д. От Вас будет польза?
Хотел попросить скейтч для градусника на этом дисплее
Есть одна очень интересная идея
Привет Всем! Я слежу за темой достаточно давно, даже есть собственная версия часов на дисплее (см 3 страницу)
Как и хотел - дописал будильник с мелодией на функции ТОН
Но здесь подобралась команда, которая проект развила до необычных высот! Прямое управление колбой! Я не успеваю у китайцев заказывать комплектующие, как выходит что-то новое!
Но, к сожалению, меня выперли из группы. Я понимаю, что пользы в группе от меня не много, мягко говоря=( но хочется последить за темой! Я хотел бы присоединиться к группе. Хотел бы опять попасть в группу. Идея управления 1 -3 кнопками меня очень привлекает, так как её можно использовать с любым корпусом! А такой функционал какой достигнут в группе мне к сожалению и не снился!
Кто там, в группе главный?
Прошусь к вам в группу!
Постараюсь быть полезным!
Как и хотел - дописал будильник с мелодией на функции ТОН
Прикольно, ИМХО. странно тут на форуме нет ЛС, пиши на почту posol.kenii@yandex.ru
Принато! =)
Спасиб!
Если кому то ещё интересна версия часов на интерфейсе RS то вот моя версия!
Управление одной кнопкой, есть будильник, мелодия программируется в прошивке.
Описание управления - в коде.
А запили фото/видео, как нибудь, если не сложно. для удовлетворения любопытства)) да и мимопроходящим будет понятней о чем речь в теме идет.
Сделаю, не проблема....
Сейчас нет часов под рукой.
Блин, нарисовалась поездка на несколько дней. Вернусь в воскресенье вечером. В понедельник распишу про свои часики,
а сейчас пока фото моего отладочного стенда, вытащил из под коробок, сдул пыль и включил... Работает!!!
Первичная отладка производится в PROTEUSе.
Но сначала прогоняю здесь до работоспособного состояния
Итак, по часам с будильником, краткое описание моей модификации прошивки.
Первое, что мне не понравилось в исходном коде - хранение констант в ОЗУ и ДЕВЯТЬ КНОПОК управления!
Расположил все текстовые константы в ПЗУ, написал обработку кнопки (жуть как коряво, ну как смог!), для ускорения процессов делаи были убраны и программа была завёрнута в функции. Результат почти понравился, только работа кнопки пока не радует - нет чёткости опознания в режиме двойного клика, но работает.
Товарищ посмотрел и спросил - А будильник как включить? ОПА! А будильника то и нет! Опять сел за книжки и в результате появился будильник на функции ТОНЕ. Естественно, все константы мелодий и длительностей тоже расположились в ПЗУ.
Отлаживал всё, даже звук в PROTEUSе, затем уже заливал в камень.
Вообще. хотелось бы программировать пограмотней, но занимаюсь этим набегами и после перерыва приходится вспоминать азы, а не то что код свой совершенствовать! Стараюсь из-за этого код комментировать побогаче, а то сам заблужусь в том что ваворотил! 8-))
Как то так...
Да! Для генерации текстовых сообщений написал небольшую утилитку:
Набираешь текст, нажимаешь "применить" и копируешь код в скетч.
Никто не реализовывал такие часы на таких же дисплеях, но где стоят USB разъёмы?
Что за дисплей? Модель? маркировка? Документация есть?
1P00A985, Futaba, Wincor nixdorf
Проц df3687.
Если я правильно понял этот вот этот аппарат:
https://manualzz.com/doc/52504849/wincor-nixdorf-ba63gv-operating-manual
это графический дисплей, именно с таким тут никто не работал, редкая модель, т.к. например лично я первый раз читаю про такой, не говоря уже о том чтобы работать с ним вживую, из документации понятно, что возможности у него очень неплохие. Например можно выбрать из нескольких размеров символов, и даже загружать свой логотип. Документация довольно подробная, при желании разобраться можно, да и примеров работы в этой теме тоже достаточно. Интерфейс подключения (USB или RS232) роли не играет, т.к. подключение осуществляется через UART,. напрямую к процу.
Т.е. если я правильно понял Вас понял можно сразу к процу цепляться.
Спасибо.
Я пробовал цепляться к rx-tx, но не был уверен в нане. И rx-tx на проце две пары, чем отличаются так и не вычитал. Я думал что как раз rs232 на этой плате и нет.
Смотрите куда подключен выход преобразователя интерфейса (USB -> UART в вашем случае наверно).
ЗЫ: тут после падения радикала все фотки пропали, вот в этой статье есть описание подключения к уарту проца напрямую.
https://cxem.net/arduino/arduino250.php
А можно фотки этого чуда в студию?
Согласен, прикольный зверь у него колба получается без разделитель что-ли?
Согласен, прикольный зверь у него колба получается без разделитель что-ли?
Согласен, прикольный зверь у него колба получается без разделитель что-ли?
https://www.google.com/search?q=1P00A985&source=lnms&tbm=isch&sa=X&ved=2ahUKEwj3pLvUle_5AhVD6CoKHSToD9wQ_AUoA3oECAEQBQ&biw=1600&bih=789&dpr=1
Я то думал.. обычный 202md25 сто раз уже про такой писали, читайте тему.
Сильно то не пинайте.
Может ли быть такое что rs 232 нет на плате.
Плата с usb разъёмом. Сигнал с usb колодки идёт через usbn9604-2bm сразу на проц df3687. Подозреваю что rs 232 тут отсутствует от слова совсем.
Ну конечно может, а он и не надо, земля и нога rx от проца, лучше отсоединенная от преобразователя, и все, данные по уарту.
Здравствуйте, можно скетч и схему сборки пожалуйста
Здравствуйте, можно пожалуйста скетч и схему сборки
Это то, с чего всё начиналось.
https://drive.google.com/drive/folders/1nfX1-58qgjRTRJZNomgP-VUjyrogzefS?usp=sharing
Сейчас это выглядит так
И устроено совсем по-другому.
Это то, с чего всё начиналось.
https://drive.google.com/drive/folders/1nfX1-58qgjRTRJZNomgP-VUjyrogzefS?usp=sharing
Сейчас это выглядит так
И устроено совсем по-другому.
Большое спасибо
Продолжение темы дисплеев, прямое управление колбой, без использования "мозгов" платы на безе МК ESP32, прошу ознакомиться, протестить, а лучше взять и использовать для чего нибудь интересного)
https://cxem.net/mc/mc503.php