101

Re: Ретро часы на ИВ-6

Кнопки настройки как и куда подкючить,  есть схема

102

Re: Ретро часы на ИВ-6

Вот номера выводов:
A1 SET
A2+/sec
A3 -/temp

http://forum.rcl-radio.ru/uploads/images/2020/06/2dfd09bdf7ab659365c006b87b1dc3ea.png

103 (2020-10-05 19:40:03 отредактировано AlexandrS)

Re: Ретро часы на ИВ-6

Собрал эти часы на плате с использованием ULN2003A и резисторных сборок. Накалы ламп соединил последовательно и подключил на стабилизатор 3,3 вольта. Работают отлично от 5 вольт. Только есть трудность с редактированием прошивки так как я поменял схему. Сделал возможность отключения преобразователя, подсветки и накала, а кнопки подключил через резисторы и на один пин. Может кто помочь с прошивкой?
http://forum.rcl-radio.ru/uploads/images/2020/10/5c3145916caa29e2c4c81ef050d1d0e3.jpg
Схема кнопок
http://forum.rcl-radio.ru/uploads/images/2020/10/181f9faab5cef156c172f8d2ea0313d1.jpg
Кнопки подключил на A3
Включение подсветки на A1 (при 5 вольтах на A1 подсветка гаснет)
Включение нитей накала A2 (при 5 вольтах на A2 накалы ламп отключается)
Отключение преобразователя на A0 (при 0 вольт преобразователь отключается)

104

Re: Ретро часы на ИВ-6

Опубликуйте скетч и опишите в чем нужна помощь.

105 (2020-10-05 20:01:31 отредактировано AlexandrS)

Re: Ретро часы на ИВ-6

В скетче я только добавил строки для включения преобразователя, подсветки и накала ламп для проверки. Хотелось иметь возможность корректировки времени с кнопок и возможность отключения подсветки и преобразователя вместе с накалом ламп.
Кнопки
+/sec (Кнопка 1)
-/temp (Кнопка 2)
set и отключение подсветки по первому нажатию-удержанию и по второму отключение ламп полностью (Кнопка 3)
Открыл монитор порта и узнал значения приходящее при нажатии кнопок:
SW1 - 709...711
SW2 - 837...840
SW3 - 1022...1023
Скетч

#include <MsTimer2.h>  // https://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <Wire.h> 
#include <DS3231.h>
DS3231 clock;RTCDateTime DateTime;
  int an, segm,times,i;
  int sps = A0;
  int heat = A2;
  int led = A1;
  byte a[4];
 
void setup(){  Wire.begin();clock.begin();
MsTimer2::set(5, to_Timer);MsTimer2::start();
 // clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
 pinMode(9,OUTPUT);  // D9  === A0
 pinMode(10,OUTPUT); // D10 === A1
 pinMode(11,OUTPUT); // D11 === A2
 pinMode(12,OUTPUT); // D12 === A3
 pinMode(2,OUTPUT);  // D2  === a
 pinMode(3,OUTPUT);  // D3  === b
 pinMode(4,OUTPUT);  // D4  === c
 pinMode(5,OUTPUT);  // D5  === d
 pinMode(6,OUTPUT);  // D6  === e
 pinMode(7,OUTPUT);  // D7  === f
 pinMode(8,OUTPUT);  // D8  === g
clock.setOutput(DS3231_1HZ);
pinMode(sps,OUTPUT);
pinMode(heat,OUTPUT);
pinMode(led,OUTPUT);
digitalWrite(sps,HIGH); //Включил преобразователь
digitalWrite(heat,LOW); //Включил накал ламп
digitalWrite(led,LOW); //Включил подсветку ламп
}
 
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;
 }// loop
 
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){                                                                 
             //  A       B       C       D       E       F       G  
    case 0: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,1);break;// 0 
    case 1: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 1
    case 2: ch(2,0);ch(3,0);ch(4,1);ch(5,0);ch(6,0);ch(7,1);ch(8,0);break;// 2
    case 3: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,1);ch(8,0);break;// 3   
    case 4: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,0);ch(8,0);break;// 4 
    case 5: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 5 
    case 6: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 6 
    case 7: ch(2,0);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 7 
    case 8: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 8
    case 9: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 9  
  }}
void anod(){
  switch(an){                                                             
    case 0:ch(9,0);ch(10,1);ch(11,1);ch(12,1);break;  
    case 1:ch(9,1);ch(10,0);ch(11,1);ch(12,1);break; 
    case 2:ch(9,1);ch(10,1);ch(11,0);ch(12,1);break;
    case 3:ch(9,1);ch(10,1);ch(11,1);ch(12,0);break;
  }}
 
  void ch(int pin, int logic){digitalWrite(pin,logic);}

106

Re: Ретро часы на ИВ-6

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

107

Re: Ретро часы на ИВ-6

Подсветка и накал включается через транзисторы
http://forum.rcl-radio.ru/uploads/images/2020/10/259580af5e0aacb4ba81abb2ea7743a3.jpg
Преобразователь я собрал на 555 таймере и отключаю его через RESET
http://forum.rcl-radio.ru/uploads/images/2020/10/64aae95e8a8888c3290688a558111840.jpg

108

Re: Ретро часы на ИВ-6

Тестируйте:

#include <MsTimer2.h>  // https://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <Wire.h> 
#include <DS3231.h>
DS3231 clock;RTCDateTime DateTime;
  int an, segm,times,i, u_d;
  bool svet,nakal,gener;
  byte a[4];
 
void setup(){  Wire.begin();clock.begin();
MsTimer2::set(5, to_Timer);MsTimer2::start();
 // clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
 pinMode(9,OUTPUT);  // D9  === A0
 pinMode(10,OUTPUT); // D10 === A1
 pinMode(11,OUTPUT); // D11 === A2
 pinMode(12,OUTPUT); // D12 === A3
 pinMode(2,OUTPUT);  // D2  === a
 pinMode(3,OUTPUT);  // D3  === b
 pinMode(4,OUTPUT);  // D4  === c
 pinMode(5,OUTPUT);  // D5  === d
 pinMode(6,OUTPUT);  // D6  === e
 pinMode(7,OUTPUT);  // D7  === f
 pinMode(8,OUTPUT);  // D8  === g
clock.setOutput(DS3231_1HZ);
pinMode(A0,OUTPUT);
pinMode(A1,OUTPUT);
pinMode(A2,OUTPUT);
pinMode(A3,INPUT);
digitalWrite(A0,HIGH);//Включил преобразователь
digitalWrite(A2,LOW); //Включил накал ламп
digitalWrite(A1,LOW); //Включил подсветку ламп
}
 
void loop(){ 
  u_d = analogRead(A3);
  if((u_d>500 && u_d<750) && nakal == 0){nakal=1;digitalWrite(A2,HIGH);delay(200);}
  if((u_d>500 && u_d<750) && nakal == 1){nakal=0;digitalWrite(A2,LOW);delay(200);}

  if((u_d>750 && u_d<950) && svet == 0){svet=1;digitalWrite(A1,LOW);delay(200);}
  if((u_d>750 && u_d<950) && svet == 1){svet=0;digitalWrite(A1,HIGH);delay(200);}

  if(u_d>950 && gener == 0){gener=1;digitalWrite(A0,LOW);delay(200);}
  if(u_d>950 && gener == 1){gener=0;digitalWrite(A0,HIGH);delay(200);}
  
  
  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;
 }// loop
 
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){                                                                 
             //  A       B       C       D       E       F       G  
    case 0: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,1);break;// 0 
    case 1: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 1
    case 2: ch(2,0);ch(3,0);ch(4,1);ch(5,0);ch(6,0);ch(7,1);ch(8,0);break;// 2
    case 3: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,1);ch(8,0);break;// 3   
    case 4: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,0);ch(8,0);break;// 4 
    case 5: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 5 
    case 6: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 6 
    case 7: ch(2,0);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 7 
    case 8: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 8
    case 9: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 9  
  }}
void anod(){
  switch(an){                                                             
    case 0:ch(9,0);ch(10,1);ch(11,1);ch(12,1);break;  
    case 1:ch(9,1);ch(10,0);ch(11,1);ch(12,1);break; 
    case 2:ch(9,1);ch(10,1);ch(11,0);ch(12,1);break;
    case 3:ch(9,1);ch(10,1);ch(11,1);ch(12,0);break;
  }}
 
  void ch(int pin, int logic){digitalWrite(pin,logic);}

109 (2020-10-06 00:03:57 отредактировано AlexandrS)

Re: Ретро часы на ИВ-6

Протестировал. При включении все работает, но при нажатии на кнопки всё просто мигает, а подсветка гаснет после первого нажатия и далее при нажатии зажигается и сама гаснет.
Я пробовал разобраться со скетчем для коррекции времени с кнопок и в итоге отображается какая-то каша из непонятных цифр, а второй индикатор вообще не зажигается.

#include <MsTimer2.h>
#include <Wire.h> 
#include <DS3231.h>
  DS3231 clock;RTCDateTime DateTime;
  int an, segm,times,i;
  byte a[4];
  int menu,year,month,day,hour,minute,w,w2;
 
void setup(){  Wire.begin();clock.begin();MsTimer2::set(2, to_Timer);MsTimer2::start();Serial.begin(9600);
  // clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
 pinMode(9,OUTPUT);  // D9  === A0
 pinMode(10,OUTPUT); // D10 === A1
 pinMode(11,OUTPUT); // D11 === A2
 pinMode(12,OUTPUT); // D12 === A3
 pinMode(2,OUTPUT);  // D2  === a
 pinMode(3,OUTPUT);  // D3  === b
 pinMode(4,OUTPUT);  // D4  === c
 pinMode(5,OUTPUT);  // D5  === d
 pinMode(6,OUTPUT);  // D6  === e
 pinMode(7,OUTPUT);  // D7  === f
 pinMode(8,OUTPUT);  // D8  === g
 pinMode(13,OUTPUT);// D13  === dp
 pinMode(A6,INPUT); // SQW
 /////управление питанием/////
 pinMode(A0,OUTPUT);
 pinMode(A2,OUTPUT);
 pinMode(A1,OUTPUT);
 digitalWrite(A0,HIGH); //Включил преобразователь
 digitalWrite(A2,LOW); //Включил накал ламп
 digitalWrite(A1,HIGH); //Включил подсветку ламп
 ///// BUTTON //////
// pinMode(A1,INPUT); // SET
// pinMode(A2,INPUT); // +/sec
// pinMode(A3,INPUT); // -/temp
 pinMode(A3,INPUT);
/*SW1 - 709...711 --- 700<analogRead(A3)<720 вместо A1
  SW2 - 837...840 --- 830<analogRead(A3)<850 вместо A2
  SW3 - 1022...1023 --- analogRead(A3)>1000 вместо A3*/
 ////  текущее время перенос в переменные коррекции времени
 DateTime=clock.getDateTime();// опрос времени
 year = DateTime.year;
 month = DateTime.month;
 day = DateTime.day;
 hour = DateTime.hour;
 minute = DateTime.minute;
}
void loop(){ DateTime=clock.getDateTime();// опрос времени
  if(700<analogRead(A3)<720){menu++;delay(200);if(menu>5){menu=0;w=1;}}

/////////// ВРЕМЯ /////////////  
  if(menu==0&&w2==0){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;
   if(analogRead(A6)>900){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}// dp
  }
  w2=0;
////// вывод секунд - нажать и удерживать кнопку +/sec /////////////////////////////////////
  if(830<analogRead(A3)<850&&menu==0){w2=1;times = DateTime.second;digitalWrite(13,HIGH);
  a[0]=11;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}

////// вывод температуры - нажать и удерживать кнопку -/temp /////////////////////////////////////
  if(analogRead(A3)>1000&&menu==0){w2=1;times = int(clock.readTemperature());digitalWrite(13,HIGH);
  a[0]=12;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}  
  

///////// коррекция минут /////////////////
  if(menu==1){
    if(830<analogRead(A3)<850){minute++;delay(300);if(minute>59){minute=0;}}
    if(analogRead(A3)>1000){minute--;delay(300);if(minute<0){minute=0;}}
    times=minute;
  a[0]=1;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}

///////// коррекция часов /////////////////
  if(menu==2){
    if(830<analogRead(A3)<850){hour++;delay(300);if(hour>23){hour=0;}}
    if(analogRead(A3)>1000){hour--;delay(300);if(hour<0){hour=0;}}
    times=hour;
  a[0]=2;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}

///////// коррекция дата /////////////////
  if(menu==3){
    if(830<analogRead(A3)<850){day++;delay(300);if(day>31){day=0;}}
    if(analogRead(A3)>1000){day--;delay(300);if(day<0){day=0;}}
    times=day;
  a[0]=3;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}

///////// коррекция месяц /////////////////
  if(menu==4){
    if(830<analogRead(A3)<850){month++;delay(300);if(month>12){month=0;}}
    if(analogRead(A3)>1000){month--;delay(300);if(month<0){month=0;}}
    times=month;
  a[0]=4;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}

///////// коррекция год /////////////////
  if(menu==5){
    if(830<analogRead(A3)<850){year++;delay(300);if(year>99){year=19;}}
    if(analogRead(A3)>1000){year--;delay(300);if(year<19){year=19;}}
    times=year;
  a[0]=5;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}
  
if(w==1){clock.setDateTime(year+2000, month, day, hour, minute, 59 );// год (19),месяц(11),день(15),час(23),минуты(32),секунды
 w=0;}

  } // loop
 
void to_Timer(){
  switch(i){
    case 0: cl();segm=a[0]; an=0; anod(); segment();break;
    case 1: cl();segm=a[1]; an=1; anod(); segment();break;
    case 2: cl();segm=a[2]; an=2; anod(); segment();break;
    case 3: cl();segm=a[3]; an=3; anod(); segment();break;
    }i++;if(i>3){i=0;}}
 
 
void segment(){
  switch(segm){                                                                 
             //  A       B       C       D       E       F       G  
    case 0: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,1);break;// 0 
    case 1: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 1
    case 2: ch(2,0);ch(3,0);ch(4,1);ch(5,0);ch(6,0);ch(7,1);ch(8,0);break;// 2
    case 3: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,1);ch(8,0);break;// 3   
    case 4: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,0);ch(8,0);break;// 4 
    case 5: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 5 
    case 6: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 6 
    case 7: ch(2,0);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 7 
    case 8: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 8
    case 9: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 9  
    case 10:ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// ПУСТО  
    case 11:ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// S 
    case 12:ch(2,1);ch(3,1);ch(4,1);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// t  
  }}
void anod(){
  switch(an){                                                             
    case 0:ch(9,0);ch(10,1);ch(11,1);ch(12,1);break;  
    case 1:ch(9,1);ch(10,0);ch(11,1);ch(12,1);break; 
    case 2:ch(9,1);ch(10,1);ch(11,0);ch(12,1);break;
    case 3:ch(9,1);ch(10,1);ch(11,1);ch(12,0);break;
  }}

void cl(){
     segm=10; an=0; segment(); anod(); an=1; segment(); anod();  an=2; segment(); anod();  an=3; segment();anod(); 
  } 

  void ch(int pin, int logic){digitalWrite(pin,logic);}

110

Re: Ретро часы на ИВ-6

Я увеличил задержку после нажатия кнопок. Одиночное кратковременное нажатие.

#include <MsTimer2.h>  // https://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <Wire.h> 
#include <DS3231.h>
DS3231 clock;RTCDateTime DateTime;
  int an, segm,times,i, u_d;
  bool svet,nakal,gener;
  byte a[4];
 
void setup(){  Wire.begin();clock.begin();
MsTimer2::set(5, to_Timer);MsTimer2::start();
 // clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
 pinMode(9,OUTPUT);  // D9  === A0
 pinMode(10,OUTPUT); // D10 === A1
 pinMode(11,OUTPUT); // D11 === A2
 pinMode(12,OUTPUT); // D12 === A3
 pinMode(2,OUTPUT);  // D2  === a
 pinMode(3,OUTPUT);  // D3  === b
 pinMode(4,OUTPUT);  // D4  === c
 pinMode(5,OUTPUT);  // D5  === d
 pinMode(6,OUTPUT);  // D6  === e
 pinMode(7,OUTPUT);  // D7  === f
 pinMode(8,OUTPUT);  // D8  === g
clock.setOutput(DS3231_1HZ);
pinMode(A0,OUTPUT);
pinMode(A1,OUTPUT);
pinMode(A2,OUTPUT);
pinMode(A3,INPUT);
digitalWrite(A0,HIGH);//Включил преобразователь
digitalWrite(A2,LOW); //Включил накал ламп
digitalWrite(A1,LOW); //Включил подсветку ламп
}
 
void loop(){ 
  u_d = analogRead(A3);
  if((u_d>500 && u_d<750) && nakal == 0){nakal=1;digitalWrite(A2,HIGH);delay(500);}
  if((u_d>500 && u_d<750) && nakal == 1){nakal=0;digitalWrite(A2,LOW);delay(500);}

  if((u_d>750 && u_d<950) && svet == 0){svet=1;digitalWrite(A1,LOW);delay(500);}
  if((u_d>750 && u_d<950) && svet == 1){svet=0;digitalWrite(A1,HIGH);delay(500);}

  if(u_d>950 && gener == 0){gener=1;digitalWrite(A0,LOW);delay(500);}
  if(u_d>950 && gener == 1){gener=0;digitalWrite(A0,HIGH);delay(500);}
  
  
  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;
 }// loop
 
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){                                                                 
             //  A       B       C       D       E       F       G  
    case 0: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,1);break;// 0 
    case 1: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 1
    case 2: ch(2,0);ch(3,0);ch(4,1);ch(5,0);ch(6,0);ch(7,1);ch(8,0);break;// 2
    case 3: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,1);ch(8,0);break;// 3   
    case 4: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,0);ch(8,0);break;// 4 
    case 5: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 5 
    case 6: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 6 
    case 7: ch(2,0);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 7 
    case 8: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 8
    case 9: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 9  
  }}
void anod(){
  switch(an){                                                             
    case 0:ch(9,0);ch(10,1);ch(11,1);ch(12,1);break;  
    case 1:ch(9,1);ch(10,0);ch(11,1);ch(12,1);break; 
    case 2:ch(9,1);ch(10,1);ch(11,0);ch(12,1);break;
    case 3:ch(9,1);ch(10,1);ch(11,1);ch(12,0);break;
  }}
 
  void ch(int pin, int logic){digitalWrite(pin,logic);}

111

Re: Ретро часы на ИВ-6

Кнопки с делителем напряжения не самый лучший вариант, проще применять отдельные пины для каждой кнопки

112 (2020-10-06 00:42:07 отредактировано AlexandrS)

Re: Ретро часы на ИВ-6

Немного изменил скетч и корректировка времени заработала.

#include <MsTimer2.h>
#include <Wire.h> 
#include <DS3231.h>
  DS3231 clock;RTCDateTime DateTime;
  int an, segm,times, i, u_d;
  byte a[4];
  int menu,year,month,day,hour,minute,w,w2;
 
void setup(){  Wire.begin();clock.begin();MsTimer2::set(2, to_Timer);MsTimer2::start();Serial.begin(9600);
  // clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
 pinMode(9,OUTPUT);  // D9  === A0
 pinMode(10,OUTPUT); // D10 === A1
 pinMode(11,OUTPUT); // D11 === A2
 pinMode(12,OUTPUT); // D12 === A3
 pinMode(2,OUTPUT);  // D2  === a
 pinMode(3,OUTPUT);  // D3  === b
 pinMode(4,OUTPUT);  // D4  === c
 pinMode(5,OUTPUT);  // D5  === d
 pinMode(6,OUTPUT);  // D6  === e
 pinMode(7,OUTPUT);  // D7  === f
 pinMode(8,OUTPUT);  // D8  === g
 pinMode(13,OUTPUT);// D13  === dp
 pinMode(A6,INPUT); // SQW
 /////управление питанием/////
 pinMode(A0,OUTPUT);
 pinMode(A2,OUTPUT);
 pinMode(A1,OUTPUT);
 digitalWrite(A0,HIGH); //Включил преобразователь
 digitalWrite(A2,LOW); //Включил накал ламп
 digitalWrite(A1,LOW); //Включил подсветку ламп
 ///// BUTTON //////
// pinMode(A1,INPUT); // SET
// pinMode(A2,INPUT); // +/sec
// pinMode(A3,INPUT); // -/temp
 pinMode(A3,INPUT);
/*SW1 - 709...711 --- 700<u_d && u_d<720 вместо A1
  SW2 - 837...840 --- 830<u_d && u_d<850 вместо A2
  SW3 - 1022...1023 --- u_d>1000 вместо A3*/
 ////  текущее время перенос в переменные коррекции времени
 DateTime=clock.getDateTime();// опрос времени
 year = DateTime.year;
 month = DateTime.month;
 day = DateTime.day;
 hour = DateTime.hour;
 minute = DateTime.minute;
}
void loop(){ DateTime=clock.getDateTime();// опрос времени
  u_d = analogRead(A3);
  if(700<u_d && u_d<720){menu++;delay(200);if(menu>5){menu=0;w=1;}}

/////////// ВРЕМЯ /////////////  
  if(menu==0&&w2==0){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;
   if(analogRead(A6)>900){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}// dp
  }
  w2=0;
////// вывод секунд - нажать и удерживать кнопку +/sec /////////////////////////////////////
  if(830<u_d && u_d<850&&menu==0){w2=1;times = DateTime.second;digitalWrite(13,HIGH);
  a[0]=11;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}

////// вывод температуры - нажать и удерживать кнопку -/temp /////////////////////////////////////
  if(u_d>1000&&menu==0){w2=1;times = int(clock.readTemperature());digitalWrite(13,HIGH);
  a[0]=12;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}  
  

///////// коррекция минут /////////////////
  if(menu==1){
    if(830<u_d && u_d<850){minute++;delay(300);if(minute>59){minute=0;}}
    if(u_d>1000){minute--;delay(300);if(minute<0){minute=0;}}
    times=minute;
  a[0]=1;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}

///////// коррекция часов /////////////////
  if(menu==2){
    if(830<u_d && u_d<850){hour++;delay(300);if(hour>23){hour=0;}}
    if(u_d>1000){hour--;delay(300);if(hour<0){hour=0;}}
    times=hour;
  a[0]=2;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}

///////// коррекция дата /////////////////
  if(menu==3){
    if(830<u_d && u_d<850){day++;delay(300);if(day>31){day=0;}}
    if(u_d>1000){day--;delay(300);if(day<0){day=0;}}
    times=day;
  a[0]=3;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}

///////// коррекция месяц /////////////////
  if(menu==4){
    if(830<u_d && u_d<850){month++;delay(300);if(month>12){month=0;}}
    if(u_d>1000){month--;delay(300);if(month<0){month=0;}}
    times=month;
  a[0]=4;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}

///////// коррекция год /////////////////
  if(menu==5){
    if(830<u_d && u_d<850){year++;delay(300);if(year>99){year=19;}}
    if(u_d>1000){year--;delay(300);if(year<19){year=19;}}
    times=year;
  a[0]=5;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}
  
if(w==1){clock.setDateTime(year+2000, month, day, hour, minute, 59 );// год (19),месяц(11),день(15),час(23),минуты(32),секунды
 w=0;}

  } // loop
 
void to_Timer(){
  switch(i){
    case 0: cl();segm=a[0]; an=0; anod(); segment();break;
    case 1: cl();segm=a[1]; an=1; anod(); segment();break;
    case 2: cl();segm=a[2]; an=2; anod(); segment();break;
    case 3: cl();segm=a[3]; an=3; anod(); segment();break;
    }i++;if(i>3){i=0;}}
 
 
void segment(){
  switch(segm){                                                                 
             //  A       B       C       D       E       F       G  
    case 0: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,1);break;// 0 
    case 1: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 1
    case 2: ch(2,0);ch(3,0);ch(4,1);ch(5,0);ch(6,0);ch(7,1);ch(8,0);break;// 2
    case 3: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,1);ch(8,0);break;// 3   
    case 4: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,0);ch(8,0);break;// 4 
    case 5: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 5 
    case 6: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 6 
    case 7: ch(2,0);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 7 
    case 8: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 8
    case 9: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 9  
    case 10:ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// ПУСТО  
    case 11:ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// S 
    case 12:ch(2,1);ch(3,1);ch(4,1);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// t  
  }}
void anod(){
  switch(an){                                                             
    case 0:ch(9,0);ch(10,1);ch(11,1);ch(12,1);break;  
    case 1:ch(9,1);ch(10,0);ch(11,1);ch(12,1);break; 
    case 2:ch(9,1);ch(10,1);ch(11,0);ch(12,1);break;
    case 3:ch(9,1);ch(10,1);ch(11,1);ch(12,0);break;
  }}

void cl(){
     segm=10; an=0; segment(); anod(); an=1; segment(); anod();  an=2; segment(); anod();  an=3; segment();anod(); 
  } 

  void ch(int pin, int logic){digitalWrite(pin,logic);}

113

Re: Ретро часы на ИВ-6

liman324 пишет:

Кнопки с делителем напряжения не самый лучший вариант, проще применять отдельные пины для каждой кнопки

Спасибо в следующем проекте учту. Сейчас уже нет смысла плату переделывать.

114

Re: Ретро часы на ИВ-6

Доброго времени суток. Прошу не пинать, я не силен в написании кодов, может совсем глупость спрашиваю, всю жизнь с железом работаю. Но вот зачесались руки сделать часы, так как имеется запас индикаторов ив-6. Когда очередь дошла до компиляции кода, выдаёт ошибку:
Arduino: 1.8.13 (Windows Store 1.8.42.0) (Windows 10), Плата:"Arduino Uno"

sketch_jan29g:4:10: error: no matching function for call to 'DS3231::DS3231()'

   DS3231 clock;RTCDateTime DateTime;

Библиотеки уже менял...результат один и тот((((

115

Re: Ретро часы на ИВ-6

замените библиотеку ds3231 - https://rcl-radio.ru/wp-content/uploads … DS3231.zip

116

Re: Ретро часы на ИВ-6

Парадокс с Arduino Ide под windows 10. Ставил на этой винде программу через инсталятор и были регулярные ошибки в компиляциях не только этого скетча. А вот когда полностью снёс программу и установил как приложение из магазина Майкрософт всё стало работать отлично.

117

Re: Ретро часы на ИВ-6

Спасибо большое! С этой библиотекой все работает)))) Счастья полные штаны:D

118

Re: Ретро часы на ИВ-6

Схема часов с применением ULN2003 Данный контент доступен только зарегистрированным пользователям.

119

Re: Ретро часы на ИВ-6

Скетч для данной схемы.

#define ADDR_INIT 6    // Адрес для проверки
#define INIT_KEY 12    // Ключ проверки на первый запуск
#define ADDR_YRKOST 0  // Адрес хранения значения яркости
#define ADDR_SVET 2    // Адрес хранения состояния подсветки

#include <MsTimer2.h>
#include <EEPROM.h>
#include <Wire.h>
#include <DS3231.h>
  DS3231 clock;RTCDateTime DateTime;
  int an, segm,times, i, u_d;
  byte a[4];
  int menu,year,month,day,hour,minute,w,w2,save_t;
  int menu_svet, svet_state, brightness, svet,w3;
  int led_pwm = 10;  //выход с ШИМ для управления подсветкой (переключается блоком перемычек X1)
  //************** Управляющие сетки ВЛИ *****************************
  int grids_HL1 = 9;
  int grids_HL2 = 11;
  int grids_HL3 = A2;  //Переключается блоком перемычек X1
  int grids_HL4 = 12;
void setup(){
  Wire.begin();
  clock.begin();
  MsTimer2::set(2, to_Timer);
  MsTimer2::start();
  Serial.begin(9600);

  if (EEPROM.read(ADDR_INIT) != INIT_KEY) {   // проверка на первый запуск
    EEPROM.put(ADDR_INIT, INIT_KEY);
    EEPROM.put(ADDR_YRKOST, 50);   // значение яркости по умолчанию
    EEPROM.put(ADDR_SVET, 1);   // состояние подвсетки по умолчанию
    clock.setDateTime(__DATE__, __TIME__);} // Устанавливаем время на часах, основываясь на времени компиляции скетча
  
  //************* Настройка выводов микроконтроллера *****************
  pinMode(grids_HL1,OUTPUT);  // D9  === Сетка A0
  pinMode(grids_HL2,OUTPUT);  // D10 === Сетка A1
  pinMode(grids_HL3,OUTPUT);  // D11 === Сетка A2
  pinMode(grids_HL4,OUTPUT);  // D12 === Сетка A3
  pinMode(2,OUTPUT);   // D2  === a
  pinMode(3,OUTPUT);   // D3  === b
  pinMode(4,OUTPUT);   // D4  === c
  pinMode(5,OUTPUT);   // D5  === d
  pinMode(6,OUTPUT);   // D6  === e
  pinMode(7,OUTPUT);   // D7  === f
  pinMode(8,OUTPUT);   // D8  === g
  pinMode(13,OUTPUT);  // D13  === dp 
  pinMode(A6,INPUT);   // SQW
  clock.setOutput(DS3231_1HZ);
  //***************** Управление энергопотреблением ******************
  pinMode(A0,OUTPUT);
  pinMode(A1,OUTPUT);
  pinMode(led_pwm,OUTPUT);
  digitalWrite(A0,HIGH);  // Включил преобразователь +27 Вольт
  digitalWrite(A1,LOW);  // Включил накал ламп
  
  //************************** Кнопки ********************************
  pinMode(A3,INPUT);
  pinMode(A7,INPUT);
  /*Значения полученны со входа A3 при нажитии кнопок
   SW1 - 709...711 --- 700<u_d && u_d<720
   SW2 - 837...840 --- 830<u_d && u_d<850
   SW3 - 1022...1023 --- u_d>1000
   
   Назначение кнопок:
     set - при однократном нажатии активируется режим корректировки минут(1), далее нажимая set - часы(2), дата(3), месяц(4) и год(5)
     +/sec - при нажатии и удержании кнопки должны отображаться секунды "S_31"
     -/temp - при нажатии и удержании кнопки должна отображаться температура
     light - при однократном нажатии меню включения/отключения подсветки, далее меню настройки яркости
  */
  //  текущее время перенос в переменные коррекции времени
  DateTime=clock.getDateTime();  // опрос времени
  year = DateTime.year;
  month = DateTime.month;
  day = DateTime.day;
  hour = DateTime.hour;
  minute = DateTime.minute;
  
  EEPROM.get(ADDR_YRKOST,brightness);   // Чтение значения яркости подсветки
  EEPROM.get(ADDR_SVET,svet_state);   // Чтение значения состояния подсветки
}
void loop(){
  DateTime=clock.getDateTime();// опрос времени
  u_d = analogRead(A3);   // Значение с делителя напряжения для кнопок
  if(700<u_d && u_d<720 && menu_svet==0){ menu++;delay(200);if(menu>6&&save_t==1){menu=0;w=1;} //Вход в меню корректировки и выход с сохранением
                                                            if(menu>6&&save_t==0){menu=0;w=0;} //Выход без изменения настроек времени
                                                            digitalWrite(13,HIGH);}
  
  // Меню настройки подсветки вход/выход с сохранением в ЭСППЗУ
  if(analogRead(A7)>1000 && menu==0){menu_svet++;delay(200);if(menu_svet>2){menu_svet=0;w3=1;}digitalWrite(13,HIGH);}
  
  //*************************** Время ********************************
  if(menu==0&&w2==0&&menu_svet==0){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;
   if(analogRead(A6)>900){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}// dp
  }
  w2=0;
  
  //****** вывод секунд - нажать и удерживать кнопку +/sec ***********
  if(830<u_d && u_d<850&&menu==0&&menu_svet==0){w2=1;times = DateTime.second;digitalWrite(13,HIGH);
  a[0]=11;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}

  //***** вывод температуры - нажать и удерживать кнопку -/temp ******
  if(u_d>1000&&menu==0&&menu_svet==0){w2=1;times = int(clock.readTemperature());digitalWrite(13,HIGH);
  a[0]=12;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}  
  
  //********************* Коррекция минут ****************************
  if(menu==1){
    if(830<u_d && u_d<850){minute++;delay(300);if(minute>59){minute=0;}}
    if(u_d>1000){minute--;delay(300);if(minute<0){minute=0;}}
    times=minute;
  a[0]=1;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}

  //********************** Коррекция часов ***************************
  if(menu==2){
    if(830<u_d && u_d<850){hour++;delay(300);if(hour>23){hour=0;}}
    if(u_d>1000){hour--;delay(300);if(hour<0){hour=0;}}
    times=hour;
  a[0]=2;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}

  //********************** Коррекция даты ****************************
  if(menu==3){
    if(830<u_d && u_d<850){day++;delay(300);if(day>31){day=0;}}
    if(u_d>1000){day--;delay(300);if(day<0){day=0;}}
    times=day;
  a[0]=3;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}

  //********************* Коррекция месяца ***************************
  if(menu==4){
    if(830<u_d && u_d<850){month++;delay(300);if(month>12){month=0;}}
    if(u_d>1000){month--;delay(300);if(month<0){month=0;}}
    times=month;
  a[0]=4;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;}

  //********************** Коррекция года ****************************
  if(menu==5){
    if(830<u_d && u_d<850){year++;delay(300);if(year>99){year=19;}}
    if(u_d>1000){year--;delay(300);if(year<19){year=19;}}
    times=year;
  a[0]=5;
  a[1]=10;
  a[2]=times/10%10;
  a[3]=times%10;}
  
  //***** Запрос на сохранение изменений корректировки времени *******
  if(menu==6){
    if(830<u_d && u_d<850){save_t++;delay(300);if(save_t>1){save_t=0;}}
    if(u_d>1000){save_t--;delay(300);if(save_t<0){save_t=1;}}
    if(save_t==1){
        a[0]=11;
        a[1]=17;
        a[2]=10;
        a[3]=16;}
    if(save_t==0){
        a[0]=11;
        a[1]=17;
        a[2]=10;
        a[3]=14;}
  }
  
  if(w==1){clock.setDateTime(year+2000, month, day, hour, minute, 59 );// год (19),месяц(11),день(15),час(23),минуты(32),секунды
  w=0;}// Сохранение времени при флаге w==1

  //*************** Включение/выключение подсветки *******************
    if(menu_svet==1){
    if(830<u_d && u_d<850){svet_state++;delay(300);if(svet_state>1){svet_state=0;}}
    if(u_d>1000){svet_state--;delay(300);if(svet_state<0){svet_state=1;}}
    if(svet_state==1){
        a[0]=10;
        a[1]=10;
        a[2]=0;
        a[3]=14;}
    if(svet_state==0){
        a[0]=10;
        a[1]=0;
        a[2]=13;
        a[3]=13;}
    }
    
  //***************** Настройка яркости подсветки ********************
  if(menu_svet==2){
    if(830<u_d && u_d<850){brightness++;delay(200);if(brightness>100){brightness=100;}}
    if(u_d>1000){brightness--;delay(200);if(brightness<0){brightness=0;}}
    times = brightness;
  a[0]=15;
  if(times==100){a[1]=1;} else {a[1]=10;}
  if(times>9){a[2]=times/10%10;} else {a[2]=10;}
  a[3]=times%10;};
  
  svet=255-(brightness*2.55);
  if(svet_state==1){analogWrite(led_pwm,svet);
  } else {digitalWrite(led_pwm,HIGH);}
  
  if(w3==1){EEPROM.put(ADDR_YRKOST,brightness);EEPROM.put(ADDR_SVET,svet_state);
  w3=0;}// Сохранение настроек в ЭСППЗУ при флаге w3==1

  //***************** Проверка через монитор порта *******************
  Serial.print("Raw data: "); //  Вывод времени в монитор порта
  Serial.print(DateTime.year);   Serial.print("-");
  Serial.print(DateTime.month);  Serial.print("-");
  Serial.print(DateTime.day);    Serial.print(" ");
  Serial.print(DateTime.hour);   Serial.print(":");
  Serial.print(DateTime.minute); Serial.print(":");
  Serial.print(DateTime.second); Serial.println("");
  
  Serial.print("brightness: ");Serial.println(brightness); //  Вывод значений яркости подсветки
  Serial.print("PWM: ");       Serial.println(svet);
} // loop
  
  //******************** Динамическая индикация **********************
void to_Timer(){
  switch(i){
    case 0: cl();segm=a[0]; an=0; anod(); segment();break;
    case 1: cl();segm=a[1]; an=1; anod(); segment();break;
    case 2: cl();segm=a[2]; an=2; anod(); segment();break;
    case 3: cl();segm=a[3]; an=3; anod(); segment();break;
    }i++;if(i>3){i=0;};}

  /*Таблица символов составленных из сегментов индикатора
      Обозначение сегментов индикатора
                  A
              /////////
         ///           ///
      F ///           /// B
       ///    G      ///
         /////////
     ///          ///
  E ///          /// C
   ///          ///
      ////////
         D            */
void segment(){
  switch(segm){                                                                 
             //  A       B       C       D       E       F       G  
    case 0: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,1);break;// 0
    case 1: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 1
    case 2: ch(2,0);ch(3,0);ch(4,1);ch(5,0);ch(6,0);ch(7,1);ch(8,0);break;// 2
    case 3: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,1);ch(8,0);break;// 3
    case 4: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,0);ch(8,0);break;// 4
    case 5: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 5
    case 6: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 6
    case 7: ch(2,0);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 7
    case 8: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 8
    case 9: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 9
    case 10:ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// ПУСТО  
    case 11:ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// S
    case 12:ch(2,1);ch(3,1);ch(4,1);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// t
    case 13:ch(2,0);ch(3,1);ch(4,1);ch(5,1);ch(6,0);ch(7,0);ch(8,0);break;// F
    case 14:ch(2,1);ch(3,1);ch(4,0);ch(5,1);ch(6,0);ch(7,1);ch(8,0);break;// n
    case 15:ch(2,1);ch(3,1),ch(4,1);ch(5,0);ch(6,0);ch(7,0);ch(8,1);break;// L
    case 16:ch(2,1);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// y
    case 17:ch(2,0);ch(3,0);ch(4,0);ch(5,1);ch(6,0);ch(7,0);ch(8,0);break;// A
  }}
void anod(){
  switch(an){                                                             
    case 0:ch(grids_HL1,0);ch(grids_HL2,1);ch(grids_HL3,1);ch(grids_HL4,1);break;  
    case 1:ch(grids_HL1,1);ch(grids_HL2,0);ch(grids_HL3,1);ch(grids_HL4,1);break; 
    case 2:ch(grids_HL1,1);ch(grids_HL2,1);ch(grids_HL3,0);ch(grids_HL4,1);break;
    case 3:ch(grids_HL1,1);ch(grids_HL2,1);ch(grids_HL3,1);ch(grids_HL4,0);break;
    }}

void cl(){
     segm=10; an=0; segment(); anod(); an=1; segment(); anod();  an=2; segment(); anod();  an=3; segment();anod(); 
     } 

void ch(int pin, int logic){digitalWrite(pin,logic);}

Добавил:
1) ШИМ регулировка яркости подсветки
2) Меню запроса на сохранений времени при корректировке
3) Меню настройки подсветки
4) Автоматическая установка времени на RTC DS3231 при первой загрузке скетча в плату
5) Автоматическое сохранение параметров настройки подсветки в ЭСППЗУ контроллера
Думал как правильно реализовать работу (по времени суток) с включением/отключением преобразователя на 27В, накала ламп и подсветки, но так не сделал. Может у кого будут мысли как это грамотно реализовать в скетче.

120

Re: Ретро часы на ИВ-6

Управление сетками тоже можно организовать через ULN2003?

AlexandrS пишет:

Схема часов с применением ULN2003 Данный контент доступен только зарегистрированным пользователям.

121

Re: Ретро часы на ИВ-6

Да. Это будет удобнее, если использовать 6 индикаторов, так как меньше нужно загромождать место на плате резисторами и транзисторами.

122 (2021-03-21 02:49:05 отредактировано AlexandrS)

Re: Ретро часы на ИВ-6

Схема и печатная плата в формате JSON для открытия в EasyEDA и редактирования. На картинках я отметил расположение индикаторов. Фото нет так как ещё не собирал для проверки. Скетч нужно подогнать изменив номера выводов.
Данный контент доступен только зарегистрированным пользователям.
Использовал MT3608, ULN2003 и резисторные сборки в SMD корпусах.

123

Re: Ретро часы на ИВ-6

Изменил скетч, но ещё не протестировал.

#define ADDR_INIT 6    // Адрес для проверки
#define INIT_KEY 12    // Ключ проверки на первый запуск
#define ADDR_YRKOST 0  // Адрес хранения значения яркости
#define ADDR_SVET 2    // Адрес хранения состояния подсветки

#include "MsTimer2.h"
#include <EEPROM.h>
#include <Wire.h>
#include "DS3231.h"
  DS3231 clock;RTCDateTime DateTime;
  int an, segm,times, i;
  boolean dp;
  byte a[5]; // масив в котором хранится выводимая на индикаторы информация 
  int menu,year,month,day,hour,minute,w,w2,save_t;
  int menu_svet, svet_state, brightness, svet,w3;
  int led_pwm = 10;  // вывод управления подсветкой индикаторов
  //************** Управляющие сетки ВЛИ *****************************
  int grids_HL1 = 4;
  int grids_HL2 = 3;
  int grids_HL3 = 2;
  int grids_HL4 = 13;
  int grids_HL5 = A0;
  //******************** Сегменты ВЛИ ********************************
  int SEG_A = 7;
  int SEG_B = 5;
  int SEG_C = 6;
  int SEG_D = 12;
  int SEG_E = 11;
  int SEG_F = 9;
  int SEG_G = 8;
  //************************** Кнопки ********************************
  int SW1 = A7;
  int SW2 = A3;
  int SW3 = A2;
  int SW4 = A1;
  
void setup(){
  Wire.begin();
  clock.begin();
  MsTimer2::set(2, to_Timer);
  MsTimer2::start();
  Serial.begin(9600);

  if (EEPROM.read(ADDR_INIT) != INIT_KEY) {   // проверка на первый запуск
    EEPROM.put(ADDR_INIT, INIT_KEY);
    EEPROM.put(ADDR_YRKOST, 50);   // значение яркости по умолчанию
    EEPROM.put(ADDR_SVET, 1);   // состояние подвсетки по умолчанию
    clock.setDateTime(__DATE__, __TIME__);} // Устанавливаем время на часах, основываясь на времени компиляции скетча
  
  //************* Настройка выводов микроконтроллера *****************
  pinMode(grids_HL1,OUTPUT);
  pinMode(grids_HL2,OUTPUT);
  pinMode(grids_HL3,OUTPUT);
  pinMode(grids_HL4,OUTPUT);
  pinMode(grids_HL5,OUTPUT);
  pinMode(SEG_A,OUTPUT);
  pinMode(SEG_B,OUTPUT);
  pinMode(SEG_C,OUTPUT);
  pinMode(SEG_D,OUTPUT);
  pinMode(SEG_E,OUTPUT);
  pinMode(SEG_F,OUTPUT);
  pinMode(SEG_G,OUTPUT);
  pinMode(A6,INPUT);   // SQW
  pinMode(led_pwm,OUTPUT);  // подсветка ламп
  pinMode(SW1,INPUT);
  pinMode(SW2,INPUT);
  pinMode(SW3,INPUT);
  pinMode(SW4,INPUT);
  
  clock.setOutput(DS3231_1HZ);
  
 /*  Назначение кнопок:
     SW1 --- light - при однократном нажатии меню включения/отключения подсветки, далее меню настройки яркости
     SW2 --- +/sec - при нажатии и удержании кнопки должны отображаться секунды "S_31"
     SW3 --- -/temp - при нажатии и удержании кнопки должна отображаться температура
     SW4 --- set - при однократном нажатии активируется режим корректировки минут(1), далее нажимая set - часы(2), дата(3), месяц(4) и год(5)
  */
  //  текущее время перенос в переменные коррекции времени
  DateTime=clock.getDateTime();  // опрос времени
  year = DateTime.year;
  month = DateTime.month;
  day = DateTime.day;
  hour = DateTime.hour;
  minute = DateTime.minute;
  
  EEPROM.get(ADDR_YRKOST,brightness);   // Чтение значения яркости подсветки
  EEPROM.get(ADDR_SVET,svet_state);   // Чтение значения состояния подсветки
}
void loop(){
  DateTime=clock.getDateTime();// опрос времени
  if(analogRead(A6)>900){dp = true;}else{dp = false;}  // зажигаем тире или гасим
  
  if(analogRead(SW4)>900 && menu_svet==0){ menu++;delay(200);if(menu>6&&save_t==1){menu=0;w=1;} //Вход в меню корректировки и выход с сохранением
                                                             if(menu>6&&save_t==0){menu=0;w=0;} //Выход без изменения настроек времени
                                                             ;}
  
  // Меню настройки подсветки вход/выход с сохранением в ЭСППЗУ
  if(analogRead(SW1)>900 && menu==0){menu_svet++;delay(200);if(menu_svet>2){menu_svet=0;w3=1;};}
  
  //*************************** Время ********************************
  if(menu==0&&w2==0&&menu_svet==0){times = DateTime.hour*100+DateTime.minute;
  a[0]=times/1000;
  a[1]=times/100%10;
  if(dp==true){a[2]=18;} else {a[2]=10;}
  a[3]=times/10%10;
  a[4]=times%10%10;
  }
  w2=0;
  
  //****** вывод секунд - нажать и удерживать кнопку +/sec ***********
  if(analogRead(SW2)>900&&menu==0&&menu_svet==0){w2=1;times = DateTime.second;
  a[0]=11;
  a[1]=10;
  a[2]=10;
  a[3]=times/10;
  a[4]=times%10;}

  //***** вывод температуры - нажать и удерживать кнопку -/temp ******
  if(analogRead(SW3)>900&&menu==0&&menu_svet==0){w2=1;times = int(clock.readTemperature());
  a[0]=12;
  a[1]=10;
  a[2]=10;
  a[3]=times/10;
  a[4]=times%10;}  
  
  //********************* Коррекция минут ****************************
  if(menu==1){
    if(analogRead(SW2)>900){minute++;delay(300);if(minute>59){minute=0;}}
    if(analogRead(SW3)>900){minute--;delay(300);if(minute<0){minute=0;}}
    times=minute;
  a[0]=1;
  a[1]=10;
  a[2]=10;
  a[3]=times/10;
  a[4]=times%10;}

  //********************** Коррекция часов ***************************
  if(menu==2){
    if(analogRead(SW2)>900){hour++;delay(300);if(hour>23){hour=0;}}
    if(analogRead(SW3)>900){hour--;delay(300);if(hour<0){hour=0;}}
    times=hour;
  a[0]=2;
  a[1]=10;
  a[2]=10;
  a[3]=times/10;
  a[4]=times%10;}

  //********************** Коррекция даты ****************************
  if(menu==3){
    if(analogRead(SW2)>900){day++;delay(300);if(day>31){day=0;}}
    if(analogRead(SW3)>900){day--;delay(300);if(day<0){day=0;}}
    times=day;
  a[0]=3;
  a[1]=10;
  a[2]=10;
  a[3]=times/10;
  a[4]=times%10;}

  //********************* Коррекция месяца ***************************
  if(menu==4){
    if(analogRead(SW2)>900){month++;delay(300);if(month>12){month=0;}}
    if(analogRead(SW3)>900){month--;delay(300);if(month<0){month=0;}}
    times=month;
  a[0]=4;
  a[1]=10;
  a[2]=10;
  a[3]=times/10;
  a[4]=times%10;}

  //********************** Коррекция года ****************************
  if(menu==5){
    if(analogRead(SW2)>900){year++;delay(300);if(year>99){year=19;}}
    if(analogRead(SW3)>900){year--;delay(300);if(year<19){year=19;}}
    times=year;
  a[0]=5;
  a[1]=10;
  a[2]=10;
  a[3]=times/10%10;
  a[4]=times%10;}
  
  //***** Запрос на сохранение изменений корректировки времени *******
  if(menu==6){
    if(analogRead(SW2)>900){save_t++;delay(300);if(save_t>1){save_t=0;}}
    if(analogRead(SW3)>900){save_t--;delay(300);if(save_t<0){save_t=1;}}
    if(save_t==1){
        a[0]=11;
        a[1]=17;
        a[2]=10;
        a[3]=10;
        a[4]=16;}
    if(save_t==0){
        a[0]=11;
        a[1]=17;
        a[2]=10;
        a[3]=10;
        a[4]=14;}
  }
  
  if(w==1){clock.setDateTime(year+2000, month, day, hour, minute, 59 );// год (19),месяц(11),день(15),час(23),минуты(32),секунды
  w=0;}// Сохранение времени при флаге w==1

  //*************** Включение/выключение подсветки *******************
    if(menu_svet==1){
    if(analogRead(SW2)>900){svet_state++;delay(300);if(svet_state>1){svet_state=0;}}
    if(analogRead(SW3)>900){svet_state--;delay(300);if(svet_state<0){svet_state=1;}}
    if(svet_state==1){
        a[0]=10;
        a[1]=10;
        a[2]=10;
        a[3]=0;
        a[4]=14;}
    if(svet_state==0){
        a[0]=10;
        a[1]=10;
        a[2]=0;
        a[3]=13;
        a[4]=13;}
    }
    
  //***************** Настройка яркости подсветки ********************
  if(menu_svet==2){
    if(analogRead(SW2)>900){brightness++;delay(200);if(brightness>100){brightness=100;}}
    if(analogRead(SW3)>900){brightness--;delay(200);if(brightness<0){brightness=0;}}
    times = brightness;
  a[0]=15;
  a[1]=10;
  if(times==100){a[2]=1;} else {a[2]=10;}
  if(times>9){a[3]=times/10%10;} else {a[3]=10;}
  a[4]=times%10;};
  
  svet=255-(brightness*2.55);
  if(svet_state==1){analogWrite(led_pwm,svet);
  } else {digitalWrite(led_pwm,HIGH);}
  
  if(w3==1){EEPROM.put(ADDR_YRKOST,brightness);EEPROM.put(ADDR_SVET,svet_state);
  w3=0;}// Сохранение настроек в ЭСППЗУ при флаге w3==1

  //***************** Проверка через монитор порта *******************
  Serial.print("Raw data: "); //  Вывод времени в монитор порта
  Serial.print(DateTime.year);   Serial.print("-");
  Serial.print(DateTime.month);  Serial.print("-");
  Serial.print(DateTime.day);    Serial.print(" ");
  Serial.print(DateTime.hour);   Serial.print(":");
  Serial.print(DateTime.minute); Serial.print(":");
  Serial.print(DateTime.second); Serial.println("");
  
  Serial.print("brightness: ");Serial.println(brightness); //  Вывод значений яркости подсветки
  Serial.print("PWM: ");       Serial.println(svet);
} // loop
  
  //******************** Динамическая индикация **********************
void to_Timer(){
  switch(i){
    case 0: cl();segm=a[0]; an=0; anod(); segment();break;
    case 1: cl();segm=a[1]; an=1; anod(); segment();break;
    case 2: cl();segm=a[2]; an=2; anod(); segment();break;
    case 3: cl();segm=a[3]; an=3; anod(); segment();break;
    case 4: cl();segm=a[4]; an=4; anod(); segment();break;
    }i++;if(i>4){i=0;};}

void segment(){
  switch(segm){                                                                 

    case 0: ch(SEG_A,0);ch(SEG_B,0);ch(SEG_C,0);ch(SEG_D,0);ch(SEG_E,0);ch(SEG_F,0);ch(SEG_G,1);break;// 0
    case 1: ch(SEG_A,1);ch(SEG_B,0);ch(SEG_C,0);ch(SEG_D,1);ch(SEG_E,1);ch(SEG_F,1);ch(SEG_G,1);break;// 1
    case 2: ch(SEG_A,0);ch(SEG_B,0);ch(SEG_C,1);ch(SEG_D,0);ch(SEG_E,0);ch(SEG_F,1);ch(SEG_G,0);break;// 2
    case 3: ch(SEG_A,0);ch(SEG_B,0);ch(SEG_C,0);ch(SEG_D,0);ch(SEG_E,1);ch(SEG_F,1);ch(SEG_G,0);break;// 3
    case 4: ch(SEG_A,1);ch(SEG_B,0);ch(SEG_C,0);ch(SEG_D,1);ch(SEG_E,1);ch(SEG_F,0);ch(SEG_G,0);break;// 4
    case 5: ch(SEG_A,0);ch(SEG_B,1);ch(SEG_C,0);ch(SEG_D,0);ch(SEG_E,1);ch(SEG_F,0);ch(SEG_G,0);break;// 5
    case 6: ch(SEG_A,0);ch(SEG_B,1);ch(SEG_C,0);ch(SEG_D,0);ch(SEG_E,0);ch(SEG_F,0);ch(SEG_G,0);break;// 6
    case 7: ch(SEG_A,0);ch(SEG_B,0);ch(SEG_C,0);ch(SEG_D,1);ch(SEG_E,1);ch(SEG_F,1);ch(SEG_G,1);break;// 7
    case 8: ch(SEG_A,0);ch(SEG_B,0);ch(SEG_C,0);ch(SEG_D,0);ch(SEG_E,0);ch(SEG_F,0);ch(SEG_G,0);break;// 8
    case 9: ch(SEG_A,0);ch(SEG_B,0);ch(SEG_C,0);ch(SEG_D,0);ch(SEG_E,1);ch(SEG_F,0);ch(SEG_G,0);break;// 9
    case 10:ch(SEG_A,1);ch(SEG_B,1);ch(SEG_C,1);ch(SEG_D,1);ch(SEG_E,1);ch(SEG_F,1);ch(SEG_G,1);break;// ПУСТО  
    case 11:ch(SEG_A,0);ch(SEG_B,1);ch(SEG_C,0);ch(SEG_D,0);ch(SEG_E,1);ch(SEG_F,0);ch(SEG_G,0);break;// S
    case 12:ch(SEG_A,1);ch(SEG_B,1);ch(SEG_C,1);ch(SEG_D,0);ch(SEG_E,0);ch(SEG_F,0);ch(SEG_G,0);break;// t
    case 13:ch(SEG_A,0);ch(SEG_B,1);ch(SEG_C,1);ch(SEG_D,1);ch(SEG_E,0);ch(SEG_F,0);ch(SEG_G,0);break;// F
    case 14:ch(SEG_A,1);ch(SEG_B,1);ch(SEG_C,0);ch(SEG_D,1);ch(SEG_E,0);ch(SEG_F,1);ch(SEG_G,0);break;// n
    case 15:ch(SEG_A,1);ch(SEG_B,1),ch(SEG_C,1);ch(SEG_D,0);ch(SEG_E,0);ch(SEG_F,0);ch(SEG_G,1);break;// L
    case 16:ch(SEG_A,1);ch(SEG_B,0);ch(SEG_C,0);ch(SEG_D,0);ch(SEG_E,1);ch(SEG_F,0);ch(SEG_G,0);break;// y
    case 17:ch(SEG_A,0);ch(SEG_B,0);ch(SEG_C,0);ch(SEG_D,1);ch(SEG_E,0);ch(SEG_F,0);ch(SEG_G,0);break;// A
    case 18:ch(SEG_A,1);ch(SEG_B,1);ch(SEG_C,1);ch(SEG_D,1);ch(SEG_E,1);ch(SEG_F,1);ch(SEG_G,0);break;// -
  }}
void anod(){
  switch(an){                                                             
    case 0:ch(grids_HL1,0);ch(grids_HL2,1);ch(grids_HL3,1);ch(grids_HL4,1);ch(grids_HL5,1);break;  
    case 1:ch(grids_HL1,1);ch(grids_HL2,0);ch(grids_HL3,1);ch(grids_HL4,1);ch(grids_HL5,1);break; 
    case 2:ch(grids_HL1,1);ch(grids_HL2,1);ch(grids_HL3,0);ch(grids_HL4,1);ch(grids_HL5,1);break;
    case 3:ch(grids_HL1,1);ch(grids_HL2,1);ch(grids_HL3,1);ch(grids_HL4,0);ch(grids_HL5,1);break;
    case 4:ch(grids_HL1,1);ch(grids_HL2,1);ch(grids_HL3,1);ch(grids_HL4,1);ch(grids_HL5,0);break;
    }}

void cl(){
     segm=10;
     an=0; segment(); anod();
     an=1; segment(); anod();
     an=2; segment(); anod();
     an=3; segment(); anod();
     an=4; segment(); anod();
     } 

void ch(int pin, int logic){digitalWrite(pin,logic);}