Ретро часы на ИН-16 (Arduino)

На платформе Arduino можно собрать простые часы на газоразрядных индикаторах типа ИН-16 (ИН-14, ИН-18 и др.). ИН-16 представляет собой индикатор тлеющего разряда имеющий десять катодов выполненных в виде цифр и два катода для запятых. Ток индикации 2 мА, напряжение возникновения тлеющего разряда не более 170 В, яркость свечения 150 кд/м².

Назначение выводов:

  • 1 — анод
  • 2 — цифра 1
  • 3 — цифра 7
  • 4 — цифра 3
  • 5 — знак «запятая»
  • 6 — цифра 4
  • 7 — цифра 5
  •  8 — цифра 6
  • 9 — цифра 2
  • 10 — знак «запятая»
  • 11 — цифра 8
  • 12 — цифра 9
  • 13 — цифра 0

Управление цифрами газоразрядных индикаторов осуществляется при помощи высоковольтного двоично-десятичного дешифратора  К155ИД1 (динамическая индикация), управление анодами осуществляется при помощи высоковольтных транзисторных оптронов (TLP627) со схемой Дарлингтона на выходе. Плата Arduino коммутирует управление газоразрядных индикаторов и управляет работой высоковольтного DC-DC преобразователя. В схеме используются часы реального времени DS3231, выход SQW через высоковольтный оптрон управляет индикатором секунд (ИН-3).

В схеме используется стабилизатор типа 7805 для питания платы Arduino, но можно исключить этот элемент и напряжение +9 В подавать на встроенный в Arduino стабилизатор (вход VIN).

Настройка времени по времени компиляции:
// clock.setDateTime(__DATE__, __TIME__);
раскомментировать, залить скетч, закомментировать и по новой залить скетч


Библиотеки

http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip

http://forum.rcl-radio.ru/misc.php?action=pan_download&item=58&download=1

#include <MsTimer2.h>
#include <Wire.h> 
#include <DS3231.h>
  DS3231 clock;RTCDateTime DateTime;
  int an, segm,times,i;
  byte a[4];
 
void setup(){  Wire.begin();clock.begin();MsTimer2::set(4, to_Timer);MsTimer2::start();
  // clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
 pinMode(2,OUTPUT); // D2 === H1
 pinMode(3,OUTPUT); // D3 === H2
 pinMode(4,OUTPUT); // D4 === H3
 pinMode(5,OUTPUT); // D5 === H4
 pinMode(6,OUTPUT);  // D6  === A0 3 ид1 
 pinMode(7,OUTPUT);  // D7  === A1 6 ид1
 pinMode(8,OUTPUT);  // D8  === A2 7 ид1
 pinMode(10,OUTPUT); // D10 === A3 4 ид1
 pinMode(9,OUTPUT);  // ВЫХОД СИГНАЛА ГЕНЕРАТОРА 16-30 кГц для высоковольтного источника питания
  TCCR1A = 0x40;TCCR1B = 0x09;OCR1A = 400;//270=30кГц, 300=26кГц, 400=20кГц, 500=16кГц - изменение яркости индикаторов
clock.setOutput(DS3231_1HZ);
}
 
void loop(){ 
  DateTime=clock.getDateTime();// опрос времени
  times = DateTime.hour*100+DateTime.minute;
  a[0]=times/1000;
  a[1]=times/100%10;
  a[2]=times/10%10;
  a[3]=times%10%10;
  }
 
void to_Timer(){
  switch(i){
    case 0: segm=a[0]; an=0; anod(); segment();delay(1);break;
    case 1: segm=a[1]; an=1; anod(); segment();delay(1);break;
    case 2: segm=a[2]; an=2; anod(); segment();delay(1);break;
    case 3: segm=a[3]; an=3; anod(); segment();delay(1);break;}i++;if(i>3){i=0;}}
 
 
void segment(){
  switch(segm){                                                                 
    case 0: digitalWrite(10,LOW);digitalWrite(8,LOW);digitalWrite(7,LOW);digitalWrite(6,LOW);break;     // DEC 0 = 0b0000
    case 1: digitalWrite(10,LOW);digitalWrite(8,LOW);digitalWrite(7,LOW);digitalWrite(6,HIGH);break;    // DEC 1 = 0b0001
    case 2: digitalWrite(10,LOW);digitalWrite(8,LOW);digitalWrite(7,HIGH);digitalWrite(6,LOW);break;    // DEC 2 = 0b0010
    case 3: digitalWrite(10,LOW);digitalWrite(8,LOW);digitalWrite(7,HIGH);digitalWrite(6,HIGH);break;   // DEC 3 = 0b0011
    case 4: digitalWrite(10,LOW);digitalWrite(8,HIGH);digitalWrite(7,LOW);digitalWrite(6,LOW);break;    // DEC 4 = 0b0100
    case 5: digitalWrite(10,LOW);digitalWrite(8,HIGH);digitalWrite(7,LOW);digitalWrite(6,HIGH);break;   // DEC 5 = 0b0101
    case 6: digitalWrite(10,LOW);digitalWrite(8,HIGH);digitalWrite(7,HIGH);digitalWrite(6,LOW);break;   // DEC 6 = 0b0110
    case 7: digitalWrite(10,LOW);digitalWrite(8,HIGH);digitalWrite(7,HIGH);digitalWrite(6,HIGH);break;  // DEC 7 = 0b0111
    case 8: digitalWrite(10,HIGH);digitalWrite(8,LOW);digitalWrite(7,LOW);digitalWrite(6,LOW);break;    // DEC 8 = 0b1000
    case 9: digitalWrite(10,HIGH);digitalWrite(8,LOW);digitalWrite(7,LOW);digitalWrite(6,HIGH);break;   // DEC 9 = 0b0110
  }}
void anod(){
  switch(an){                                                             
    case 0: digitalWrite(2,HIGH);digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(5,LOW);break;    
    case 1: digitalWrite(2,LOW);digitalWrite(3,HIGH);digitalWrite(4,LOW);digitalWrite(5,LOW);break;   
    case 2: digitalWrite(2,LOW);digitalWrite(3,LOW);digitalWrite(4,HIGH);digitalWrite(5,LOW);break;   
    case 3: digitalWrite(2,LOW);digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(5,HIGH);break;   
  }}

После сборки часов необходимо подобрать оптимальную частоту генератора для высоковольтного преобразователя, чтобы выходное напряжение преобразователя находилось в пределах от 160 до 170 В:

TCCR1A = 0x40;TCCR1B = 0x09;OCR1A = 400;

270=30 кГц, 300=26 кГц, 400=20 кГц, 500=16 кГц — изменение яркости индикаторов

*Чем выше частота тем меньше выходное напряжение преобразователя

MOSFET транзистор IRF740 необходимо установить на небольшой по площади теплоотвод.

Видео

Форум — http://forum.rcl-radio.ru/viewtopic.php?id=83

Comments

  1. Доброго вечера. Пытаюсь повторить данные часы, с небольшими изменениями. Лампы ИН-12, преобразователь напряжения анодов ламп не зависит от микроконтроллера-генератор отдельный на 555 таймере. регулируемое выходное напряжение 0-210 В. Вместо оптронов применил транзисторные ключи на MPSA92. Встал с работой по причине отсутствия модуля часов реального времени. В наличие есть DS1302. Вопрос возник в правке скетча под этот модуль. С ув. Александр.

    1. Здравствуйте! К сожалению у меня нет такого модуля, поэтому изменить скетч я не могу, но Вы можете взять стандартный скетч для Вашего модуля и получить минуты и часы, далее надо просто ставить эти переменные в следующую строку:

      times = часы*100+минуты;

      А все лишнее касаемо модуля DS3132 убрать:
      #include «ds3231.h»
      DS3231 clock;RTCDateTime DateTime;

      clock.begin();

      DateTime=clock.getDateTime();// опрос времени

      единственная проблема в том, что такт секунд для мигания ИН-3 я беру с модуля DS3132, я так понимаю что такого выхода у DS1302 нет, поэтому такт секунд придется получать программно.

        1. Есть простая библиотека — iarduino_RTC.h
          я могу поправить под нее скетч, в ней используются выходы 6,7,8, но я думаю можно и другие использовать, так как генератор для высоковольтного блока питания Вам не нужен, то этот код я тоже уберу. Если все получится, то придумаю как программно тактировать секунды
          Скетч я выложу на форум (forum.rcl-radio.ru) в раздел «Переделки»

              1. Понял. спасибо. Скетч скомпилировался. Буду пробовать заливать в плату. Разумеется потом возникнет вопрос, как скорректировать начальное время. Но это потом. Сначала закончу физическую часть конструкции. Спасибо за помощь.

    1. Этот преобразователь свободно запускает стандартную светодиодную лампу до 20 Ватт 230В. Дроссель мотаю на пермалоевом кольце от АТХ блока питания компьютера. Жёлтое кольцо, на нём намотанны дроссели в цепях +3,3: 5 и 12 В. Любой эмалированный провод диаметром 1,8-2 мм. Содержит 80 витков провода(2 слоя по 40 витков) В итоге на выходе почти 215 В постоянки.Удобно брать в машину на рыбалку. От аккумулятора последний раз такая переноска проработала почти 7 часов беспрерывно.

  2. Приветствую. Встал вопрос о ручной корректировке времени в этом проекте. Хочу отправить эти часы в другую страну в подарок, а человек абсолютно далёк от Ардуино. Как бы ввести три кнопки «+», «-«, «коррекция» и переписать скетч?. Заранее благодарен.

    1. Попробуйте внедрить этот код:

      int h,m,x;

      void setup() {
      pinMode(11,INPUT);
      pinMode(12,INPUT);

      DateTime=clock.getDateTime();// опрос времени
      h = DateTime.hour;
      m = DateTime.minute;
      }

      void loop() {
      if(digitalRead(11)==HIGH){x=1;h++;if(h>23){h=0;}delay(200);}
      if(digitalRead(12)==HIGH){x=1;m++;if(m>59){m=0;}delay(200);}

      if(x==1){x=0;setDateTime(2020, 1, 28, h, m, 0);}
      }

  3. Извините, ещё момент уточню. В оригинальной прошивке графу void loop(){
    DateTime=clock.getDateTime();// опрос времени
    times = DateTime.hour*100+DateTime.minute;
    a[0]=times/1000;
    a[1]=times/100%10;
    a[2]=times/10%10;
    a[3]=times%10%10;
    }
    заменить на ту, что Вы предложили, или объединить их?

    1. Вставьте код как есть, удалять или менять ни чего не надо.
      В setup() в самый конец
      pinMode(11,INPUT);
      pinMode(12,INPUT);

      DateTime=clock.getDateTime();// опрос времени
      h = DateTime.hour;
      m = DateTime.minute;

      В loop() в самое начало

      if(digitalRead(11)==HIGH){x=1;h++;if(h>23){h=0;}delay(200);}
      if(digitalRead(12)==HIGH){x=1;m++;if(m>59){m=0;}delay(200);}

      if(x==1){x=0;setDateTime(2020, 1, 28, h, m, 0);}

  4. Доброго дня. Поспешил я, оказывается скетч не «залился». При компиляции выдаёт ошибку строки
    void setup(){ Wire.begin();clock.begin();MsTimer2::set(4, to_Timer);MsTimer2::start();

    : error: ‘to_Timer’ was not declared in this scope

    Вот весь скетч с Вашей правкой (как я его понял)
    #include
    #include
    #include
    DS3231 clock;RTCDateTime DateTime;
    int an, segm,times,i;
    byte a[4];
    int h,m,x;
    void setup(){ Wire.begin();clock.begin();MsTimer2::set(4, to_Timer);MsTimer2::start();
    // clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
    pinMode(2,OUTPUT); // D2 === H1
    pinMode(3,OUTPUT); // D3 === H2
    pinMode(4,OUTPUT); // D4 === H3
    pinMode(5,OUTPUT); // D5 === H4
    pinMode(6,OUTPUT); // D6 === A0 3 ид1
    pinMode(7,OUTPUT); // D7 === A1 6 ид1
    pinMode(8,OUTPUT); // D8 === A2 7 ид1
    pinMode(10,OUTPUT); // D10 === A3 4 ид1
    pinMode(9,OUTPUT); // ВЫХОД СИГНАЛА ГЕНЕРАТОРА 16-30 кГц для высоковольтного источника питания
    TCCR1A = 0x40;TCCR1B = 0x09;OCR1A = 400;//270=30кГц, 300=26кГц, 400=20кГц, 500=16кГц — изменение яркости индикаторов
    pinMode(11,INPUT);
    pinMode(12,INPUT);

    DateTime=clock.getDateTime();// опрос времени
    h = DateTime.hour;
    m = DateTime.minute;
    }

    void loop(){
    if(digitalRead(11)==HIGH){x=1;h++;if(h>23){h=0;}delay(200);}
    if(digitalRead(12)==HIGH){x=1;m++;if(m>59){m=0;}delay(200);}

    if(x==1){x=0;setDateTime(2020, 1, 28, h, m, 0);}
    }
    DateTime=clock.getDateTime();// опрос времени
    times = DateTime.hour*100+DateTime.minute;
    a[0]=times/1000;
    a[1]=times/100%10;
    a[2]=times/10%10;
    a[3]=times%10%10;
    }

    void to_Timer(){
    switch(i){
    case 0: segm=a[0]; an=0; anod(); segment();delay(1);break;
    case 1: segm=a[1]; an=1; anod(); segment();delay(1);break;
    case 2: segm=a[2]; an=2; anod(); segment();delay(1);break;
    case 3: segm=a[3]; an=3; anod(); segment();delay(1);break;}i++;if(i>3){i=0;}}

    void segment(){
    switch(segm){
    case 0: digitalWrite(10,LOW);digitalWrite(8,LOW);digitalWrite(7,LOW);digitalWrite(6,LOW);break; // DEC 0 = 0b0000
    case 1: digitalWrite(10,LOW);digitalWrite(8,LOW);digitalWrite(7,LOW);digitalWrite(6,HIGH);break; // DEC 1 = 0b0001
    case 2: digitalWrite(10,LOW);digitalWrite(8,LOW);digitalWrite(7,HIGH);digitalWrite(6,LOW);break; // DEC 2 = 0b0010
    case 3: digitalWrite(10,LOW);digitalWrite(8,LOW);digitalWrite(7,HIGH);digitalWrite(6,HIGH);break; // DEC 3 = 0b0011
    case 4: digitalWrite(10,LOW);digitalWrite(8,HIGH);digitalWrite(7,LOW);digitalWrite(6,LOW);break; // DEC 4 = 0b0100
    case 5: digitalWrite(10,LOW);digitalWrite(8,HIGH);digitalWrite(7,LOW);digitalWrite(6,HIGH);break; // DEC 5 = 0b0101
    case 6: digitalWrite(10,LOW);digitalWrite(8,HIGH);digitalWrite(7,HIGH);digitalWrite(6,LOW);break; // DEC 6 = 0b0110
    case 7: digitalWrite(10,LOW);digitalWrite(8,HIGH);digitalWrite(7,HIGH);digitalWrite(6,HIGH);break; // DEC 7 = 0b0111
    case 8: digitalWrite(10,HIGH);digitalWrite(8,LOW);digitalWrite(7,LOW);digitalWrite(6,LOW);break; // DEC 8 = 0b1000
    case 9: digitalWrite(10,HIGH);digitalWrite(8,LOW);digitalWrite(7,LOW);digitalWrite(6,HIGH);break; // DEC 9 = 0b0110
    }}
    void anod(){
    switch(an){
    case 0: digitalWrite(2,HIGH);digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(5,LOW);break;
    case 1: digitalWrite(2,LOW);digitalWrite(3,HIGH);digitalWrite(4,LOW);digitalWrite(5,LOW);break;
    case 2: digitalWrite(2,LOW);digitalWrite(3,LOW);digitalWrite(4,HIGH);digitalWrite(5,LOW);break;
    case 3: digitalWrite(2,LOW);digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(5,HIGH);break;
    }}

Добавить комментарий

Войти с помощью: