Используя платформу Arduino можно собрать простые часы на индикаторах тлеющего разряда. Индикаторы на ИН-12А используются для индикации часов и минут, а индикатор ИН-15А используется как разделитель между часами и минутами.
- Напряжение источника питания 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(А,Б) и может использован совместно с ними в единой конструкции.
- 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