Добавить в корзинуПозвонить
Найти в Дзене

Часы на ИВ-16. Результаты

Всем привет! Недавно публиковал свои разработки по часам на ИВ-16. И еще вот тут. Там я печатал корпус и пробовал варианты программы для отображения цифр. В принципе получилось более-менее нормально. Принтер конечно подводил несколько раз, но все получилось. Что хотелось бы поправить в конструктиве и в плане схемотехники. Самое бесячее это провода которые я напаивал на плату Ардуино. Тут 100 % нужна нормальная плата со всеми вытекающими. Второе это датчик температуры. Оказалось, что лампы и драйвера довольно ощутимо нагреваются. Не до красна конечно, но градусов до 40 наверное есть. А в коробке так вообще как в бане. Поэтому термодатчик в микросхеме использовать не выйдет. Нужно что-то небольшое и вынесенное за пределы корпуса. Еще хотелось бы какой-нибудь индикатор секунд. Ну хотя бы светодиод, который будет неспешно пульсировать. А то выглядит это как-то мёртво. Да и вообще хотелось бы какой-нибудь еще красоты. В плане анимации переходов между часами и градусами тоже желательно что

Всем привет!

Недавно публиковал свои разработки по часам на ИВ-16.

И еще вот тут.

Всем привет! Короткий очерк про корпус для часов на ИВ-16. После долгих мучений с принтером, удалось отпечатать необходимые детали для корпуса. Подогнал кнопки так чтобы нажим был нормальный, без заеданий. Сделал стенку которое закрывает углубление для индикаторов. Ну и самое главное - распечатал заднюю крышку. Места в корпусе конечно полно, можно было спроектировать немного по другому. На зовем…
Роботехника из Селиваново21 марта 2024

Там я печатал корпус и пробовал варианты программы для отображения цифр. В принципе получилось более-менее нормально. Принтер конечно подводил несколько раз, но все получилось.

Что хотелось бы поправить в конструктиве и в плане схемотехники.

Самое бесячее это провода которые я напаивал на плату Ардуино. Тут 100 % нужна нормальная плата со всеми вытекающими.

Второе это датчик температуры. Оказалось, что лампы и драйвера довольно ощутимо нагреваются. Не до красна конечно, но градусов до 40 наверное есть. А в коробке так вообще как в бане. Поэтому термодатчик в микросхеме использовать не выйдет. Нужно что-то небольшое и вынесенное за пределы корпуса.

Плата индикации индикаторов ИВ-16
Плата индикации индикаторов ИВ-16

Еще хотелось бы какой-нибудь индикатор секунд. Ну хотя бы светодиод, который будет неспешно пульсировать. А то выглядит это как-то мёртво. Да и вообще хотелось бы какой-нибудь еще красоты.

В плане анимации переходов между часами и градусами тоже желательно что-то придумать. Хотя бы бегущую строку сделать. Ну или еще что-то придумать для эффектности.

Было бы неплохо развести управление яркостью каждого разряда отдельно. Так появиться возможность реагировать на внешнее освещение, да и в плане управления анимациями будет проще. Сейчас я гашу разряды за счет вывода на сегменты "нулей". Для выбора того, что будем гасить применяю маску.

Не знаю есть ли смысл выкладывать программу. Я вообще не разу не программист, поэтому мой код, скорей всего, будет вообще ни разу не эффективный. Ожидаю кидание тапками) К тому же программа привязана к моей схеме разводки. Если у вас другая схема подключения или вообще вы сделали схему иначе, то нужно менять программу.

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

#include <buildTime.h>
#include <microDS3231.h>
MicroDS3231 rtc;

#define DATA_PIN 8
#define CLOC_PIN 10
#define LATCH_PIN 9
#define kol_seg 4 // количество разрядов
#define TEMP_INTERVAL 20 // время между показом температуры и времени
#define MAIN_INTERVAL 1000 //основной интервал - раз в секунду

byte count = 0;// счетчик для перехода в режим температуры
boolean tempFlag = false; // флаг перехода в режим температуры

byte itog [kol_seg] = {0, 0, 0, 0};
unsigned long predMillis = 0;

byte digits [10] = {
0b11011110, //0
0b00000110, //1
0b11101010, //2
0b01101110, //3
0b00110110, //4
0b01111100, //5
0b11111100, //6
0b00001110, //7
0b11111110, //8
0b01111110 //9
}; // коды для получения цифр

const byte celci = 0b11011000; // символ Цельсия
const byte space = 0b00000000; // вывод пробела или ничего

void setup() {

//rtc.setTime(COMPILE_TIME); // установка времени с устройства (ноутбук или ПК)
pinMode (DATA_PIN, OUTPUT);
pinMode (CLOC_PIN , OUTPUT);
pinMode (LATCH_PIN, OUTPUT);
}

void loop() {

if (millis () - predMillis >= MAIN_INTERVAL) {
predMillis += MAIN_INTERVAL;
count++;
if (count == TEMP_INTERVAL) {
tempFlag = true;
}

if (count == TEMP_INTERVAL + 5) {
tempFlag = false;
count = 0;
}

if (!tempFlag) {
DateTime now = rtc.getTime();
int val = now.hour * 100 + now.minute;
showDigit (val);
}
else {
showTemp ();

}
}
}

void showDigit (int ch) { // дробим число на цифры
itog [0] = ch % 10; // единицы
itog [1] = (ch % 100) / 10; // десятки
itog [2] = (ch % 1000) / 100; // сотни
itog [3] = ch / 1000; // тысячи

for (byte i = 0; i < kol_seg; i++) {
digitalWrite (LATCH_PIN, LOW);
shiftOut (DATA_PIN, CLOC_PIN, MSBFIRST, digits [itog [i]] );
digitalWrite (LATCH_PIN, HIGH);
}
}

void showTemp (void) {

itog [2] = rtc.getTemperature() % 10; // единицы
itog [3] = (rtc.getTemperature() % 100) / 10; // десятки
itog [1] = 11; // space
itog [0] = 10; // celci

digitalWrite (LATCH_PIN, LOW);
for (byte i = 0; i < kol_seg; i++) {
shiftOut (DATA_PIN, CLOC_PIN, MSBFIRST, digits [itog [i]]);
}
digitalWrite (LATCH_PIN, HIGH);
}

Если у вас есть какие-нибудь еще идеи в плане реализации, то милости прошу в комментарии.

На этом не прощаюсь!