воскресенье, 2 февраля 2014 г.

Бинарные часы

Настоящие бинарные часы показывают время числами двоичной системы счисления. Это необычно и по своему привлекательно. Их не сложно сделать на основе Arduino UNO. Собственно, про это и статья.


На рисунке показан внешний вид бинарных светодиодных часов


Я нашел очень красивую реализацию таких часов на youtube: Binary clock driven by Arduino

О том как определить время по таким часам можно узнать из другого видео: mBINclock

Вот только ролик англоязычный. Поэтому лучше я скажу ещё пару слов об этом.

Итак, чтобы узнать время необходимо перевести двоичное число в десятичную форму. Для этого каждую цифру двоичного числа нужно умножить на соответствующее ей магическое число из специальной последовательности. Затем необходимо сложить результаты. В итоге получится обычное десятичное число. Вот эти магические числа: 128, 64, 32, 16, 8, 4, 2, 1. Я привел последовательность для одного байта (восемь бит). Но эту последовательность легко продолжить. Каждое последующее число больше предыдущего ровно в два раза. Так можно перевести в десятичный вид любое двоичное число. Правда, для чисел бинарных часов нужно не больше шести бит :-)

Приведу несколько примеров

000101
0*32 + 0*16 + 0*8 + 1*4 + 0*2 + 1*1 = 5

010111
0*32 + 1*16 + 0*8 + 1*4 + 1*2 + 1*1 = 23

101000
1*32 + 0*16 + 1*8 + 0*4 + 0*2 + 0*1 = 40

111010
1*32 + 1*16 + 1*8 + 0*4 + 1*2 + 0*1 = 58

Думаю теории достаточно. Пора перейти к описанию устройства.

Для этих часов нужно 17 светодиодов и 17 ограничительных резисторов для них. Резисторы лучше взять на 680Ом - 1КОм и 0.25Вт. Светодиоды подключаются к выводам ардуино анодом. Катоды подключается к GND через ограничительные резисторы.


Еще для проекта необходимо три кнопочки без фиксации и три подтягивающих резистора. Прекрасно подойдут резисторы в 10КОм и 0.25Вт.


Все как в моей статье про светодиод, кнопку и ардуино.

Скетч для Arduino UNO

////////////////////////
//
// Arduino UNO
//
////////////////////////
//
// Sketch: binary clock
//

// Arduino --- Led
//
// D13 --- Led 12
// D12 --- Led 11
// D11 --- Led 10
// D10 --- Led 9
// D9 --- Led 8
// D8 --- Led 7
//
// D4 --- Led 17
// D3 --- Led 16
// D2 --- Led 15
// D1 --- Led 14
// D0 --- Led 13
//
// A5 --- Led 6
// A4 --- Led 5
// A3 --- Led 4
// A2 --- Led 3
// A1 --- Led 2
// A0 --- Led 1

// Arduino --- Button
//
// D7 --- Button 3
// D6 --- Button 2
// D5 --- Button 1

unsigned long int t1 = 0;
unsigned long int t2 = 1000;

unsigned char s = 0;
unsigned char m = 0;
unsigned char h = 0;

void setup()
{
    DDRD = 0b00011111;
    PORTD = 0b00000000;

    DDRB = 0b00111111;
    PORTB = 0b00000000;

    DDRC = 0b00111111;
    PORTC = 0b00000000;
}

void loop()
{
    t1 = millis();

    if ( (t1 / 1000) == (t2 / 1000) )
    {
        t2 += 1000;

        s += 1;

        if ( !(PIND & (1 << 5)) ) { s = 0; }
        if ( !(PIND & (1 << 6)) ) { m += 1; s = 0; }
        if ( !(PIND & (1 << 7)) ) { h += 1; s = 0; }

        if( s >= 60 ) { s = 0; m += 1; }
        if( m >= 60 ) { m = 0; h += 1; }
        if( h >= 24 ) { h = 0; }

        PORTD = h;
        PORTB = m;
        PORTC = s;
    }
}

//
// End
//
////////////////////////

Управление часиками осуществляется тремя кнопками. Третьей кнопкой устанавливаются часы. Второй кнопкой устанавливаются минуты. Чтобы изменить время нужно нажать и держать кнопку. Тогда связанная с этой кнопкой величина будет увеличиваться на единицу за секунду. Когда будет достигнуто необходимое значение, кнопку нужно отпустить. Первая кнопка предназначена для управления секундами. Если ее нажать, то секунды сбрасываются в ноль. Пока она нажата часы стоят. Если кнопку отпустить, часы пойдут.