Часы на ИН-12А (ИН-15А) (LGT8F328)

Используя платформу Arduino можно собрать простые часы на индикаторах тлеющего разряда. Индикаторы на ИН-12А используются для индикации часов и минут, а индикатор ИН-15А используется как разделитель между часами и минутами.

Индикатор ИН-12А(Б)

  • Напряжение источника питания  200 В
  • Напряжение возникновения разряда 170 В
  • Напряжение поддержания разряда 150 В
  • Ток индикации для цифр 2,5 мА
  • Ток индикации для запятой 0,3 мА
  • Постоянный рабочий ток для цифр, мА 2 — 3,5
  • Постоянный рабочий ток для запятой 0,3 — 0,7 мА
  • Импульсный рабочий ток для цифр 1 — 2 мА
  • Импульсный рабочий ток для запятой 0,15 — 0,2 мА
  • Яркость свечения катодов 100 кд/м2
  • Угол обзора, град  ±30

Обозначение вывода ИН-12А(Б)

  • 1 — Анод
  • 2 — Катод «0»
  • 3 — Катод «9»
  • 4 — Катод «8»
  • 5 — Катод «7»
  • 6 — Катод «6»
  • 7 — Катод «5»
  • 8 — Катод «4»
  • 9 — Катод «3»
  • 10 — Катод «2»
  • 11 — Катод «1»
  • 12 — Катод «запятая» (только для ИН-12Б для ИН-12А «неиспользуется»)

ИН-15А предназначен для индикации различных букв и знаков. Индикатор ИН-15А по габаритным размерам и электрическим параметрам сходен с цифровыми индикаторами ИН-12(А,Б) и может использован совместно с ними в единой конструкции.

Обозначение вывода ИН-15А 

  • 1 — Анод
  • 2 — Катод «µ»
  • 3 — Катод «P»
  • 4 — Катод «-«
  • 5 — Катод «+»
  • 6 — Катод «m»
  • 7 — Катод «M»
  • 8 — Катод «K»
  • 9 — Катод «П»
  • 10 — Катод «%»
  • 11 — Катод «n»
  • 12 — не подключен

Как ранее отмечалось, что в качестве разделителя часов и минут используется индикатор ИН-15А в котором используется знаки «-» и «+». Все индикаторы в часах используются в динамической системе индикации, поэтому все одноименные катоды индикаторов (в том числе и ИН-15А) объединены. Всеми катодами индикаторов управляет высоковольтный двоично-десятичный дешифратор  К155ИД1, а каждым анодом индикатора управляет высоковольтный транзисторный оптрон TLP627.

В проекте часов используется микроконтроллер LGT8F328p, как его использовать в среде программирования Arduino IDE рассказано в — http://rcl-radio.ru/?p=129966. (Возможна замена на Arduino Nano).

Схема часов

Для нормальной работы индикаторов необходимо напряжение порядка 170 В, поэтому в часах используется высоковольтный преобразователь. В преобразователе используется транзистор IRF740 который необходимо установить на небольшой радиатор, дроссель L1 высоковольтного преобразователя состоит из ферритового сердечника (гантельный сердечник) на который до заполнения намотан провод диаметром 0,27…0,32 мм.

Управление высоковольтным преобразователем осуществляется при помощи таймера контроллера, а точнее ШИМ сигналом (выход D9). Изменяя скважность ШИМ сигнала можно регулировать выходное напряжение высоковольтного преобразователя.

Для изменения выходного напряжения преобразователя необходимо изменить значение регистра:

OCR1A = 350;

Значение регистра OCR1A (9 бит 0-511) желательно выбирать в диапазоне от 150 до 400.

После загрузки скетча измерьте напряжение на конденсаторе С3, если оно меньше 170 В, то увеличьте значение регистра OCR1A, если напряжение больше 170 В, то соответственно уменьшите значение регистра OCR1A.

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

Время задержки включения (мкс) указано в строке:

#define BR      300  // 400-3000 яркость

Если после запуска часов наблюдается паразитная засветка, то рекомендую увеличить значение BR, так же следует учитывать, что при увеличении BR будет уменьшаться яркость свечения индикаторов.

Скетч

// LGT8F328

#define AN1     2
#define AN2     3
#define AN3     4
#define AN4     5
#define AN5     6

#define ID1     11
#define ID2     10
#define ID4     7
#define ID8     8

#define SET     A0 // BUTTON SET
#define UP      A2 // BUTTON +++
#define DW      A1 // BUTTON ---

#define BR      300  // 400-3000 яркость

#include <Wire.h> 
#include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip
  DS3231 clock;
  RTCDateTime DateTime;
  int an, segm,i;
  byte a[5];
  int dp,h,m,set,tic;
  unsigned long times0;
  bool x;

void setup() {
  Wire.begin();clock.begin();
  Serial.begin(9600);
  Serial.println("ok");
  pinMode(9,OUTPUT);// PWM TIMER_1
  pinMode(AN1,OUTPUT);pinMode(AN2,OUTPUT);pinMode(AN3,OUTPUT);pinMode(AN4,OUTPUT);pinMode(AN5,OUTPUT);
  pinMode(ID1,OUTPUT);pinMode(ID2,OUTPUT);pinMode(ID4,OUTPUT);pinMode(ID8,OUTPUT);
  pinMode(SET,INPUT_PULLUP);pinMode(UP,INPUT_PULLUP);pinMode(DW,INPUT_PULLUP);
  
 //  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  cli();
  //TIMER_1 PWM +170V
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  TCCR1A |= (1<<COM1A1);
  TCCR1B |= (1<<WGM12);
  TCCR1A |= (1<<WGM11);
  TCCR1B |= (1 << CS10); 
  ICR1 = 511; 
  OCR1A = 350;
  //TIMER_2
  TCCR2A = 0;
  TCCR2B = 0;
  TCNT2 = 0;
  OCR2A = 120;
  TCCR2A |= (1 << WGM21);
  TCCR2B |= (1 << CS22) | (1 << CS21) | (1 << CS20);
  TIMSK2 |= (1 << OCIE2A);
  sei();
  }
  
void loop() { 
  DateTime=clock.getDateTime();// опрос времени
  h = DateTime.hour;
  m = DateTime.minute;

  if(digitalRead(SET)==LOW){set++;if(set>2){set=0;}delay(200);}

  if(set==1){
  if(digitalRead(UP)==LOW){x=1;tic=0;h++;if(h>23){h=23;}delay(200);}
  if(digitalRead(DW)==LOW){x=1;tic=0;h--;if(h<0){h=0;}delay(200);}
  if(tic==0){a[0]=h/10%10;}else{a[0]=10;}
  if(tic==0){a[1]=h%10;}else{a[1]=10;}
  a[2]=7;
  a[3]=m/10%10;
  a[4]=m%10;
  }

  if(set==2){
  if(digitalRead(UP)==LOW){x=1;tic=0;m++;if(m>59){m=59;}delay(200);}
  if(digitalRead(DW)==LOW){x=1;tic=0;m--;if(m<0){m=0;}delay(200);}
  a[0]=h/10%10;
  a[1]=h%10;
  a[2]=7;
  if(tic==0){a[3]=m/10%10;}else{a[3]=10;}
  if(tic==0){a[4]=m%10;}else{a[4]=10;}
  }

  if(x==1){x=0;clock.setDateTime(2024, 1, 1, h, m, 0);}

  if(set==0){
  if(millis()-times0<500){dp=8;}
  if(millis()-times0>=500){dp=10;}
  if(millis()-times0>1000){times0=millis();}
  a[0]=h/10;
  a[1]=h%10;
  a[2]=dp;
  a[3]=m/10%10;
  a[4]=m%10;
  }
  
  tic++;
  if(tic>1){tic=0;}
  delay(100);
}

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

ISR(TIMER2_COMPA_vect) {
  switch(i){
    case 0: segm=a[0]; an=0;cl();delayMicroseconds(BR); anod(); segment();break;
    case 1: segm=a[1]; an=1;cl();delayMicroseconds(BR); anod(); segment();break;
    case 2: segm=a[2]; an=2;cl();delayMicroseconds(BR); anod(); segment();break;
    case 3: segm=a[3]; an=3;cl();delayMicroseconds(BR); anod(); segment();break;
    case 4: segm=a[4]; an=4;cl();delayMicroseconds(BR); anod(); segment();break;
    }
    i++;if(i>4){i=0;}}

void cl(){digitalWrite(AN1,LOW);digitalWrite(AN2,LOW);digitalWrite(AN3,LOW);digitalWrite(AN4,LOW);digitalWrite(AN5,LOW);
          digitalWrite(ID1,HIGH);digitalWrite(ID2,HIGH);digitalWrite(ID4,HIGH);digitalWrite(ID8,HIGH);
          }

Форум — http://forum.rcl-radio.ru/viewtopic.php?pid=10744#p10744

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

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