На платформе 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 необходимо установить на небольшой по площади теплоотвод.
Видео
Доброго вечера. Пытаюсь повторить данные часы, с небольшими изменениями. Лампы ИН-12, преобразователь напряжения анодов ламп не зависит от микроконтроллера-генератор отдельный на 555 таймере. регулируемое выходное напряжение 0-210 В. Вместо оптронов применил транзисторные ключи на MPSA92. Встал с работой по причине отсутствия модуля часов реального времени. В наличие есть DS1302. Вопрос возник в правке скетча под этот модуль. С ув. Александр.
DS1302 RTC AT24C32 вот такой модуль.
Здравствуйте! К сожалению у меня нет такого модуля, поэтому изменить скетч я не могу, но Вы можете взять стандартный скетч для Вашего модуля и получить минуты и часы, далее надо просто ставить эти переменные в следующую строку:
times = часы*100+минуты;
А все лишнее касаемо модуля DS3132 убрать:
#include «ds3231.h»
DS3231 clock;RTCDateTime DateTime;
clock.begin();
DateTime=clock.getDateTime();// опрос времени
единственная проблема в том, что такт секунд для мигания ИН-3 я беру с модуля DS3132, я так понимаю что такого выхода у DS1302 нет, поэтому такт секунд придется получать программно.
Такт секунд не критичен.Можно и без него. Попробую найти модуль, использованный Вами. Просто в Запорожье нет нигде. Придётся покупать через сеть.
Есть простая библиотека — iarduino_RTC.h
я могу поправить под нее скетч, в ней используются выходы 6,7,8, но я думаю можно и другие использовать, так как генератор для высоковольтного блока питания Вам не нужен, то этот код я тоже уберу. Если все получится, то придумаю как программно тактировать секунды
Скетч я выложу на форум (forum.rcl-radio.ru) в раздел «Переделки»
http://forum.rcl-radio.ru/viewtopic.php?id=85
Почему то не могу зайти на форум под своей регистрацией на сайте. Ну да ладно. скетч виден-буду пробовать. Спасибо.
Это разные сайты, нужна новая регистрация.
Понял. спасибо. Скетч скомпилировался. Буду пробовать заливать в плату. Разумеется потом возникнет вопрос, как скорректировать начальное время. Но это потом. Сначала закончу физическую часть конструкции. Спасибо за помощь.
развязка анодов через транзисторные ключи
преобразователь напряжения на таймере. Мосфет применил IRF740.
Этот преобразователь свободно запускает стандартную светодиодную лампу до 20 Ватт 230В. Дроссель мотаю на пермалоевом кольце от АТХ блока питания компьютера. Жёлтое кольцо, на нём намотанны дроссели в цепях +3,3: 5 и 12 В. Любой эмалированный провод диаметром 1,8-2 мм. Содержит 80 витков провода(2 слоя по 40 витков) В итоге на выходе почти 215 В постоянки.Удобно брать в машину на рыбалку. От аккумулятора последний раз такая переноска проработала почти 7 часов беспрерывно.
Приветствую. Встал вопрос о ручной корректировке времени в этом проекте. Хочу отправить эти часы в другую страну в подарок, а человек абсолютно далёк от Ардуино. Как бы ввести три кнопки «+», «-«, «коррекция» и переписать скетч?. Заранее благодарен.
Попробуйте внедрить этот код:
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);}
}
Спасибо. Я так понял, на D11 кнопка увеличения часов, а на D12 увеличения мнут.?
Да
Извините, ещё момент уточню. В оригинальной прошивке графу 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;
}
заменить на ту, что Вы предложили, или объединить их?
Вставьте код как есть, удалять или менять ни чего не надо.
В 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);}
Понял, благодарю. Буду пробовать.
Доброго дня. Всё удачно получилось. Благодарю за поддержку.
Доброго дня. Поспешил я, оказывается скетч не «залился». При компиляции выдаёт ошибку строки
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;
}}
У меня компиляция проходит без ошибок
Переустановите библиотеку MsTimer2
Что посоветуете?
Удалите папку с библиотекой и установите по новой — http://rcl-radio.ru/wp-content/uploads/2020/02/MsTimer2.zip
Опубликуйте скетч на форуме, на сайте комментариях код искажается