Найти в Дзене

Часы на ИВ-16. Паяем и программируем.

Всем привет! Продолжаю статьи по сборке простеньких часов на ИВ-16. На этот раз, собираю плату индикации и проверяю все в порядке. Пайка SMD микросхем в формате SOP-16 потребовала немалой толики терпения и усердия. Тот еще геморрой, я вам скажу! Но вроде все удалось спаять без соплей. Тестировал по очереди, сначала припаял один комплект регистр+драйвер (сборка Дарлингтона). Включил, вроде чего-то кажет. Коды сегментов я еще к тому времени не подобрал, поэтому наблюдал некие случайные штуки. Запаяв таким макаром все, что было нужно, написал простенькую программу для вывода последовательности цифр, чтобы проследить нет ли залипух. И они конечно же нашлись. Одна лампа показывала сразу несколько сегментов. Подрезали и все наладилось. Проверил сколько эта штука потребляет во время свечения всех сегментов - оказалось около 320 мА. И это пока без всяких других элементов типа микросхемы часов DS3231 и быть может подсветки. Может будет еще будильник, но мне что-то очень лень это все пихать, есл

Всем привет!

Продолжаю статьи по сборке простеньких часов на ИВ-16. На этот раз, собираю плату индикации и проверяю все в порядке.

Пайка SMD микросхем в формате SOP-16 потребовала немалой толики терпения и усердия. Тот еще геморрой, я вам скажу! Но вроде все удалось спаять без соплей.

Тестировал по очереди, сначала припаял один комплект регистр+драйвер (сборка Дарлингтона). Включил, вроде чего-то кажет. Коды сегментов я еще к тому времени не подобрал, поэтому наблюдал некие случайные штуки.

Запаяв таким макаром все, что было нужно, написал простенькую программу для вывода последовательности цифр, чтобы проследить нет ли залипух. И они конечно же нашлись. Одна лампа показывала сразу несколько сегментов. Подрезали и все наладилось.

Проверил сколько эта штука потребляет во время свечения всех сегментов - оказалось около 320 мА. И это пока без всяких других элементов типа микросхемы часов DS3231 и быть может подсветки. Может будет еще будильник, но мне что-то очень лень это все пихать, если честно.

Ток потребления при 5 В питании
Ток потребления при 5 В питании

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

Что качается программы для управления. Тут все довольно просто и без всяких извращенств (хотя по любому будут кидать тапками бородатые дяди).

Сначала заводим массив на 4 элемента для хранения чисел на вывод. Затем производим разбиение требуемого числа на единицы, десятки, сотни и тысячи. Ну и помещаем эти результаты в массив. Выводим 4 раза получившийся результат через команду shiftOut (). Этот процесс заворачиваем в функцию, для удобства пользования. Вот такой код получился.

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);
}
}

Самое главное это подобрать правильные коды в двоичном виде для вывода цифр. Чтобы нужные сегменты загорались и формировали цифру, а не ерунду. Я это делал путем экспериментов. Вычисли какие биты в двоичном числе, что зажигают и затем все стало намного проще. Для моей разводки платы коды получились вот такие:

byte digits [10] = {
0b11011110, //0
0b00000110, //1
0b11101010, //2
0b01101110, //3
0b00110110, //4
0b01111100, //5
0b11111100, //6
0b00001110, //7
0b11111110, //8
0b01111110 //9
};

В основной программе происходит простое приращение числа на единицу раз в секунду. Все это позволяет протестировать работу платы индикации и правильность логики программы. Ну а с микросхемой часов программа конечно будет другая, но принцип вывода индикации не изменится.

Полный код программы проверки вывода цифр привожу ниже.

#define DATA_PIN 8
#define CLOC_PIN 10
#define LATCH_PIN 9
#define kol_seg 4

byte itog [kol_seg] = {0, 0, 0, 0};
int val = 0;
unsigned long predMillis = 0;
const int interval = 1000;

byte digits [10] = {
0b11011110, //0
0b00000110, //1
0b11101010, //2
0b01101110, //3
0b00110110, //4
0b01111100, //5
0b11111100, //6
0b00001110, //7
0b11111110, //8
0b01111110 //9
};

void setup() {
//Serial.begin (9600);
pinMode (DATA_PIN, OUTPUT);
pinMode (CLOC_PIN , OUTPUT);
pinMode (LATCH_PIN, OUTPUT);
}

void loop() {
if (millis () - predMillis >= interval) {
predMillis += interval;
val ++;
if (val > 9999)val = 0;
showDigit (val);
}
}

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);
}
}

В следующий раз мы подключим микросхему часов реального времени DS3132 и выведем часы и минуты, а также раз в 30 секунд будет выводиться температура. Думаю это будет интересно.

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