Nixie Clock (часы на газоразрядных индикаторах)

Года 2 назад, я узнал о замечательных советских газоразрядных индикаторах. До этого,  я конечно видел, что то подобное в старой советской технике, но никогда не задумывался, что такие индикаторы можно применить в быту, довольно таки в многочисленных проектах, в которых нужно выделить эдакую эстетическую изюминку. Свою популярность эти индикаторы вновь приобрели среди радиолюбителей несколько лет назад из за своего антикварного вида и довольно красивого визуального отображения индикации. В интернете уже сейчас можно найти прекрасные реализации часов на советских ИНках, но мне с самого начало хотелось  разобраться с принципами построения таких часов, написать свою прошивку и сделать самодельный корпус из подручных материалов. Не давно я выкроил время и соорудил свои собственные часики на платформе arduino. Самым сложным оказалось достать эти индикаторы. В моем городе я так их и не нашел. Через форум сайта радиокот,  нашел человека, который как раз был не далеко в г. Омске. Купил у него 6 ламп ИН-14 и 12 ламп ИН-12Б, а также 6 высоковольтных дешифратора К155ИД1.

Набросал вот такую схему, которую подглядел на каком то сайте. Здесь мы видим 2 высоковольтных дешефратора К155ИД1, 6 трубок ИН-14, преобразователь напряжения с 12 до 180В для питания анодов колб. Подсветку сделал с возможностью управлять через микроконтроллер, но ума так и не дал. Просто постоянно горит. Пищалку позднее я вообще подключил мимо транзистора напрямую к модулю с атмегой. Почти все компоненты используются в планарном исполнении.

Nixie_clock_shematic

Модуль с атмегой и часами реального времени ds1307 сделал на отдельной плате. Я использовал atmega168PA-AU, но в данном проекте можно смело использовать atmega8PA или atmega88PA (просто зашейте соответствующий bootloader), работающие от внутреннего осцилятора 8MHz.

Nixie_clock_atmega
Схема модуля atmega + ds1307
Nixie_clock_atmega_board
Печатная плата модуля atmega + ds1307

Далее написал вот такую простенькую прошивку с помощью Arduino IDE 1.0.3. Как видим в начале скетча идет определение пинов К155ИД1, анодов и другой периферии  Так, что кто захочет извратится и сделать такую схему на макетке с обычной ардуиной можете переназначить на другие удобные вам порты. Есть 2 режима отображения: время и дата, настройка часов, 1 анимация.  Я немного пытался оптимизировать исходный код, некоторым новичкам может потребоваться время на его осмысление. Советую почитать вот это для начала.

#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;

// К155ИД1 (1)
uint8_t Pin_1_a = 14;
uint8_t Pin_1_b = 16;
uint8_t Pin_1_c = 17;
uint8_t Pin_1_d = 15;
// К155ИД1 (2)
uint8_t Pin_2_a = 5;
uint8_t Pin_2_b = 7;
uint8_t Pin_2_c = 8;
uint8_t Pin_2_d = 6;
// Анодные пины
uint8_t Pin_a_1 = 11;//колбы 1, 4
uint8_t Pin_a_2 = 10;//колбы 2, 5
uint8_t Pin_a_3 = 9; //колбы 3, 6

#define DOT_ON PORTB|=1<<PINB4 // Точки Вкл
#define DOT_OFF PORTB&=~(1<<PINB4) //Точки Выкл

#define LIGHT_ON PORTD|=1<<PIND4 // Подсветка Вкл
#define LIGHT_OFF PORTD&=~(1<<PIND4) //Подсветка Выкл

#define SPEAKER_ON PORTB|=1<<PINB5 // Пищалка Вкл
#define SPEAKER_OFF PORTB&=~(1<<PINB5) //Пищалка Выкл
//Подтверждение настроек
#define TIME_UP (PIND & (1<<PIND3))//Считывание значения кнопки на порту 3
//Перебор настроек
#define TIME_SET (PIND & (1<<PIND2))//Считывание значение кнопки на порту 2

static const uint8_t bits[2][4] =
{
{Pin_1_d, Pin_1_c, Pin_1_b, Pin_1_a},// К155ИД1 (1)
{Pin_2_d, Pin_2_c, Pin_2_b, Pin_2_a }// К155ИД1 (2)
};

uint8_t mode = 0;

//Массив для управления анодами ламп
static const uint8_t anods[3] = {Pin_a_1, Pin_a_2, Pin_a_3};

//Массив с помощью которого дешефратору задаются цифры
static const uint8_t numbers[11][4] =
{
{ 0, 0, 0, 1 }, //0
{ 0, 0, 0, 0 }, //1
{ 1, 0, 0, 1 }, //2
{ 1, 0, 0, 0 }, //3
{ 0, 1, 1, 1 }, //4
{ 0, 1, 1, 0 }, //5
{ 0, 1, 0, 1 }, //6
{ 0, 1, 0, 0 }, //7
{ 0, 0, 1, 1 }, //8
{ 0, 0, 1, 0 }, //9
{ 1, 1, 0, 1 } //Чисто
};

// Массив для анимации, перебор всех цифр в колбе
static const uint8_t nixie_level[10] = {
1, 2, 6, 7, 5, 0, 4, 9, 8, 3
};
//Массив для 6 колб
int NumberArray[6]={0,0,0,0,0,0};

uint8_t Mins = 0;
uint8_t Seconds = 0;
uint8_t j=0, z=0;
uint8_t timeset = 0;
boolean ok =false;
boolean up =false;
boolean animate =false;
boolean sec=true;

void setup()
{
Wire.begin();//Инициализация шины I2C
RTC.begin();//Инициализация микросхемы часиков ds1307
DDRD = B11110010; // назначаем выводы 1,4,5,6,7 как выходы, вывод 0,2,3 - входы
DDRB = DDRB | B00111111; // назначаем выводы 8,9,10,11,12,13 как выходы
DDRC = DDRC | B00001111; // назначаем выводы 14,15,16,17 как выходы
PORTD = B00001100; //Подтягивающие резисторы для кнопок на портах 2, 3.
LIGHT_ON;// Включаем подсветку ламп. Ума не дал этой функции :)
}

static void setNixieNum(uint8_t tube, uint8_t num) {

for(uint8_t i=0; i<4; i++)
{
digitalWrite(bits[tube][i], LOW);//боримся против глюков - обнуляем
if (!animate) digitalWrite(bits[tube][i], numbers[num][i]);
if (animate) digitalWrite(bits[tube][i], numbers[nixie_level[j]][i]);
}

}

void DisplayNumberSet(uint8_t anod, uint8_t num1, uint8_t num2 ) {
setNixieNum(0, num1);
setNixieNum(1, num2);
digitalWrite(anods[anod], HIGH);
delay(3);
digitalWrite(anods[anod], LOW);
}

void loop() {
///Счетчик для анимации///
if (z==8)
{
j++;
z=0;
}
if (j==10) {animate=false; j=0; z=0;}
if (animate) z++;
///////////////////
DateTime now = RTC.now();
Seconds = now.second();
Mins=now.minute();
//Режимы часов Время, дата
switch(mode)
{
case 0:
NumberArray[0] = now.hour() / 10; //Первый знак часа
NumberArray[1] = now.hour() % 10; //Второй знак часа
NumberArray[2] = Mins / 10; //Первый знак минут
NumberArray[3] = Mins % 10; //Второй знак минут
NumberArray[4] = Seconds / 10; //Первый знак секунд
NumberArray[5] = Seconds % 10; //Второй знак секунд
//Вырубаем точки
if (timeset==0)
{
DOT_OFF;
}
break;
case 1:
NumberArray[0] = now.day() / 10; //Первый знак дня
NumberArray[1] = now.day() % 10; //Второй знак дня
NumberArray[2] = now.month() / 10; //Первый знак месяца
NumberArray[3] = now.month() % 10; //Второй знак месяца
NumberArray[4] = (now.year() / 10) % 10;//Первый знак года
NumberArray[5] = now.year() % 10; //Второй знак года
//Если не в настройках то мигаем всеми точками
if (timeset==0)
{
//Если знак секунды четный то включаем иначе выкл
if ((Seconds % 10)%2==0)
{
DOT_ON;
}
else
{
DOT_OFF;
}
}
break;
}

if (timeset==0){
//Каждые пол часа пищим
if ((Mins == 0)&&sec||(Mins == 30)&&sec)
{
playTone(200, 2500);
sec=false;
}
if ((Mins == 1)&&!sec||(Mins == 31)&&!sec)
{
sec=true;
}
//Каждые 55 секунд включаем время
if (Seconds==55)
{
mode=0;
animate=true;
}
//Включаем дату на 48 секунду
if (Seconds==48)
{
mode=1;
animate=true;
}
//Переключаем режимы
if (!TIME_UP&&!up)
{
up=true;
animate=true;
playTone(80, 2800);
mode++;
mode %= 2;
}
if (TIME_UP&&up)
{
up=false;
}
}
/**********Установка времени**********************/
//Перебор настоек
if (!TIME_SET&&!ok) {
ok=true;
timeset++;
if (timeset>=7)
{
timeset=0;
mode=0;
}
playTone(80, 2800);
}
if (TIME_SET&&ok) {
ok=false;
}

switch (timeset)
{
//Установка часов
case 1:
DOT_ON;
mode=0;
NumberArray[2] = 10;
NumberArray[3] = 10;
NumberArray[4] = 10;
NumberArray[5] = 10;
if (!TIME_UP&&!up)
{
up=true;
DateTime adjust (now.unixtime() + 3600); // + 1 Час
RTC.adjust(adjust);
playTone(80, 2800);
}
if (TIME_UP&&up) up=false;
break;
//Установка минут
case 2:
NumberArray[0] = 10;
NumberArray[1] = 10;
NumberArray[4] = 10;
NumberArray[5] = 10;
if (!TIME_UP&&!up)
{
up=true;
DateTime adjust (now.unixtime() + 60); // + 1 минута
RTC.adjust(adjust);
playTone(80, 2800);
}
if (TIME_UP&&up) up=false;
break;
//Установка секунд
case 3:
NumberArray[0] = 10;
NumberArray[1] = 10;
NumberArray[2] = 10;
NumberArray[3] = 10;
if (!TIME_UP&&!up)
{
up=true;
DateTime adjust (now.unixtime() + 1); //+ 1 секунда
RTC.adjust(adjust);
playTone(80, 2800);
}
if (TIME_UP&&up) up=false;
break;
//Установка дня
case 4:
mode=1;
NumberArray[2] = 10;
NumberArray[3] = 10;
NumberArray[4] = 10;
NumberArray[5] = 10;
if (!TIME_UP&&!up)
{
up=true;
DateTime adjust (now.unixtime() + 86400L); //+ 1 день
RTC.adjust(adjust);
playTone(80, 2800);
}
if (TIME_UP&&up) up=false;
break;
// Установка месяца
case 5:
mode=1;
NumberArray[0] = 10;
NumberArray[1] = 10;
NumberArray[4] = 10;
NumberArray[5] = 10;
if (!TIME_UP&&!up)
{
up=true;
DateTime adjust (now.unixtime() + (86400L*31)); //+ 1 месяц
RTC.adjust(adjust);
playTone(80, 2800);
}
if (TIME_UP&&up) up=false;
break;
//Установка года
case 6:
mode=1;
NumberArray[0] = 10;
NumberArray[1] = 10;
NumberArray[2] = 10;
NumberArray[3] = 10;
if (!TIME_UP&&!up)
{
up=true;
DateTime adjust (now.unixtime() + (86400L*365)); //+ 1 год
RTC.adjust(adjust);
playTone(80, 2800);
}
if (TIME_UP&&up) up=false;
break;
}
// Вывод данных на ИН-14.
DisplayNumberString( NumberArray );
}
//Функция "пищалки"
void playTone(long duration, int freq) {
duration *= 1000;
int period = (1.0 / freq) * 1000000;
long elapsed_time = 0;
while (elapsed_time < duration) {
SPEAKER_ON;
delayMicroseconds(period / 2);
SPEAKER_OFF;
delayMicroseconds(period / 2);
elapsed_time += (period);
}
}
void DisplayNumberString( int* array ) {

DisplayNumberSet(0,array[0],array[3]);

DisplayNumberSet(1,array[1],array[4]);

DisplayNumberSet(2,array[2],array[5]);
}
Прошивка и схемы

  Nixie_clock.zip (165,1 КиБ, 5 037 загрузок)


Полностью собранные часы. Платы спаяны землями.

Ну и последняя часть часиков это конечно внешний вид — корпус. Я его сделал из остатка сосновой плахи пятерки. В принципе никаких специальных навыков я не имею. Бывало на школьных уроках труда делал указки и на токарном станке скалку точил, но это было уже больше 12 лет назад. Просто нужно терпением запастись и несколькими инструментами. Итак понадобятся: лобзик или ножовка, стамеска, напильник, мелкая шкурка,  морилка на алкидной основе дубового или другого цвета, деревяха подходящего размера. Подробный фото отчет изготовления корпуса я не запечатлел,  так как изготавливал его на одном дыхании. Вкратце на словах несколько этапов:

1) Ножовкой или лобзиком облагораживаем наш без форменный кусок дерева до состояния прямоугольника близкого к идеальному :).
2) Cтамеской снизу выдалбливаем прямоугольник меньшего размера.
3) Cверху где лампы будут торчать, выдалбливаем, выпиливаем длинный и узкий овал по размеру ламп.
4) Шкурим, придаем углам овальности.
5) Делаем 6 отверстий для дна из простой деревоплиты или фанеры тонкой.
6) Покрываем корпус морилкой на 2 раза.

Вообще если у вам нет времени на это безумие я советую добежать до ближайшей столярки и вам за не большую плату из палена  на фрейзере сделают необходимые преобразования.

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

Как обычно в заключении выкладываю видео работы готовых часиков.


IMAG0007

комментариев 58

  1. Herkes merhaba Bazıları para çekmiyor Paramı geri alamadım Ama sonunda gerçek bir site buldum — 1xbet yeni adresi 2025 Her gün yeni bonus kampanyaları Neyse, linkte tüm bilgiler var — bahis siteler 1xbet [url=https://1xbet-owt.com]bahis siteler 1xbet[/url] Tek doğru adres 1xbet Bahis yapan herkese gönder

  2. Hi, folks, I’ve been browsing this cool thread for a while, and I finally wanted to share some of my insights. As a side note, I’ve noticed that plenty of punters usually ignore the importance of good limits, which totally changes the gaming success. In addition, platforms lately are becoming way more unpredictable, and thus you really have to stay sharp. Anyway, I ran into an helpful source [url=https://facebook.com/groups/4259868154262768]spinbetter kasyno[/url], as it shares some fantastic data for maximize the fun. It’s also true that recovering losses is the fastest route to lose it all, which is why you should remember when to stop. What do you think on this? Let’s hear your thoughts in the comments!

  3. Hey, everyone, I’ve been cruising the blog recently, and I finally needed to share a few ideas. For starters, from my experience a lot of bettors often forget about proper money discipline, and this absolutely makes or breaks your long-term results. Plus, platforms right now seem way more unpredictable, therefore you really need to be smart. Moving on, I stumbled upon an amazing guide [url=https://tiktok.com/@spinbetter_app?lang=de-DE]spinbetter casino[/url], as it shares very reliable insights for improve the fun. It’s also clear that running after bad runs is a surefire method to lose your balance, so please remember when to call it a day. Do you agree with this, or is there a different approach? Share your feedback in the comments!

  4. If you ask me, I have been watching this interesting blog recently, and I felt like to drop some of my views. First off, from my experience many players frequently ignore the importance of solid limits, and this absolutely determines the long-term results. Also, platforms lately seem much more unpredictable, and thus you absolutely need to watch out. That aside, you should check [url=https://telegra.ph/Lenvie-de-surpasser-et-luniver-07-08]https://telegra.ph/Lenvie-de-surpasser-et-luniver-07-08[/url], which provides very reliable strategies for boost the fun. Another thing is, I feel that running after money lost is a surefire way to lose everything, which is why you should learn when to stop. What are your takes about that? Let’s hear your thoughts in the comments!

  5. Yo, everyone, I have been watching the thread recently, and I decided to post a few ideas. As a side note, from my experience most punters usually overlook how crucial it is to have strict money discipline, and this really changes the betting success. In addition, casinos these days get incredibly risky, so one ought to watch out. That aside, you should check [url=https://t.me/epicbet_bonus]epicbet bonus[/url], which gives very reliable data for maximize your odds. It’s also clear that chasing money lost is a surefire method to go broke, which is why you should remember when to stop. What do you think about that? Share your feedback in the comments!

  6. Listen, everyone, I’ve been cruising this interesting blog for a few weeks, and I finally felt like to drop a few points. To begin with, it looks like that many gamblers usually miss the importance of solid money discipline, which totally defines the gaming journey. Plus, platforms nowadays seem incredibly volatile, so one have to watch out. By the way, I ran into this useful guide [url=https://telegra.ph/Lintegration-parfaite-au-jeu-e-07-08]https://telegra.ph/Lintegration-parfaite-au-jeu-e-07-08[/url], as it shares very decent strategies for maximize your chances. I must add, I firmly believe that trying to recover money lost is a surefire way to lose it all, which is why you should remember when to stop. Do you concur with my perspective, or do you have a different strategy? Let’s talk here!

  7. Эффективное управление бизнесом невозможно ohne качественное [url=https://buhgalter-dlya-biznesa.ru/]бухгалтер для бизнеса[/url], обеспечивающее прозрачность и соблюдение всех налоговых требований.
    Эффективное управление бухгалтерией обеспечивает стабильность бизнеса.
    Без грамотной бухгалтерии невозможно обеспечить законность и легальность бизнеса.

    Основой любой бухгалтерии является аккуратная документация.
    Каждое финансовое действие должно быть зафиксировано правильно и в срок .
    Автоматизация процессов помогает снизить вероятность ошибок .

    Финансовая отчетность является ключевым элементом бухгалтерии .
    Отчеты должны быть подготовлены строго по установленной форме и в установленные сроки .
    Финансовая аналитика помогает определить наиболее прибыльные направления бизнеса .

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

    Постоянное повышение квалификации бухгалтерского персонала обеспечивает качество работы .
    Использование современных обучающих платформ и курсов помогает держать команду в курсе новшеств .
    Важно создать внутри компании культуру точности и ответственности — это залог правильной работы бухгалтерии .

  8. Салют, народ То вообще доступ закрывают Денег слил на всяком говне Короче, нашел наконец толковое казино — вавада с быстрыми выплатами Фриспины и акции каждый день В общем, вся инфа вот здесь — вавада [url=https://cleansheet.ru]вавада[/url] Не ведитесь на лохотроны Перешлите тому кто тоже ищет нормальное казино

  9. Hi, guys, I have been following the thread recently, and I needed to post some of my views. First off, from my experience plenty of players usually forget how crucial it is to have good budget control, which absolutely changes the gaming experience. In addition, platforms nowadays look incredibly risky, therefore one have to stay sharp. Anyway, I stumbled upon this helpful source [url=https://telegra.ph/Lobscurcissement-et-la-clarte-07-08]https://telegra.ph/Lobscurcissement-et-la-clarte-07-08[/url], which offers some cool insights for increase your winning potential. Another thing is, I feel that recovering losses is a surefire way to go broke, so always learn when to quit. What do you think on this? Share your experience in the comments!

  10. Ребята кто хочет заработать Замучился я уже искать нормальную работу Объехал кучу сайтов Короче, реально рабочий вариант — вакансии в Казахстане с ежедневной оплатой Зарплаты реальные В общем, там все вакансии — трудоустройство в казахстане [url=https://vakansii.trudvsem.kz]https://vakansii.trudvsem.kz[/url] Найдите нормальную работу Перешлите тому кто ищет работу

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.