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 13: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 14:01:31 отредактировано AlexandrS)

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

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

#include <MsTimer2.h>  // http://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>  // http://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-05 18: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>  // http://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-05 18: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 - http://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-05-10 19:52:08 отредактировано AlexandrS)

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

Схема и печатная плата часов на индикаторах ИВ-6. Двухстороннюю печатную плату я сделал ЛУТом.
Использовал ULN2003 и резисторные сборки в SMD корпусах. Повышающий преобразователь выполнен отдельной платой на NE555 так как MT3608 сразу сгорел. Для счета времени использовал DS1302.
Данный контент доступен только зарегистрированным пользователям.
Схема и печатная плата проверена.
Преобразователь настроил на 26 вольт. Вместо подстроечного резистора использовал резистор на 500 Ом.

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

#include "MsTimer2.h"
#include <EEPROM.h>
#include <Wire.h>
#include <iarduino_RTC.h>
iarduino_RTC watch(RTC_DS1302, A4, A3, A5);  // RST, CLK, DAT
int an, segm, times, i, ss, mm, hh;
int dp;
byte a[5];  // масив содержащий выводимую на индикаторы информацию
int menu, year, month, day, hour, minute, second, weekday, w, w2, save_t;
int menu_svet, svet_state, brightness, svet, w3;
uint32_t timer = 0;
int led_pwm = 10;
int dps;
///////////// Управляющие сетки ВЛИ/////////////////////////
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 = A1;
int SW2 = A2;
int SW3 = A6;
int SW4 = A7;

void setup() {
  watch.begin();  // Инициируем работу с модулем.
  MsTimer2::set(2, to_Timer);
  MsTimer2::start();
  Serial.begin(9600);
  //Serial.end();  // Отключаем последовательный порт

  if (EEPROM.read(ADDR_INIT) != INIT_KEY) {  // проверка на первый запуск
    EEPROM.put(ADDR_INIT, INIT_KEY);
    EEPROM.put(ADDR_YRKOST, 50);  // значение яркости по умолчанию
    EEPROM.put(ADDR_SVET, 1);  // состояние подвсетки по умолчанию
  }

  //////////////////////// Настройка выводов микроконтроллера////////////////
  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(SW1, INPUT);
  pinMode(SW2, INPUT);
  pinMode(SW3, INPUT);
  pinMode(SW4, INPUT);
  pinMode(led_pwm, OUTPUT);  // подсветка ламп

  /*  Назначение кнопок:
      SW4 --- set - при однократном нажатии активируется режим корректировки минут(1), далее нажимая set - часы(2), день(3), месяц(4) и год(5)
      SW3 --- +/sec - при нажатии и удержании кнопки должны отображаться секунды "S_31"
      SW2 --- -/day - при нажатии и удержании кнопки должна отображаться дата
      SW1 --- light - при однократном нажатии меню включения/отключения подсветки, далее меню настройки яркости
  */
  watch.gettime();
  year = watch.year;  // текущее время перенос в переменные коррекции времени
  month = watch.month;
  day = watch.day;
  hour = watch.Hours;
  minute = watch.minutes;

  EEPROM.get(ADDR_YRKOST, brightness);  // Чтение значения яркости подсветки
  EEPROM.get(ADDR_SVET, svet_state);  // Чтение значения состояния подсветки
}
void loop() {
  // Опрос времени
  if (millis() - timer >= PERIOD) {
    dps=1;
    if (dp != dps){
      dp=1;} else {dp=0;}
    watch.gettime();
    hh = watch.Hours;  // Часы
    mm = watch.minutes;  // Минуты
    ss = watch.seconds;  // Секунды
    Serial.println(watch.gettime("d-m-Y, H:i:s, D"));  // Выводим время.
    do {
      timer += PERIOD;
      if (timer < PERIOD) break;  // переполнение uint32_t
    } while (timer < millis() - PERIOD); // защита от пропуска шага
  } else {dps=0;}
  
   if (analogRead(SW4) > 500 && 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) > 500 && menu == 0) {menu_svet++;delay(200); if (menu_svet > 2) {menu_svet = 0;w3 = 1;};} 
  ///////////////////////////// Время/////////////////////////////
  if (menu == 0 && w2 == 0 && menu_svet == 0) {times = hh*100+mm;
    a[0] = times / 1000;
    a[1] = times / 100 % 10;
    if (dp == 1) {  // Мигающее тире разделителяющее минуты и секунды
      a[2] = 18;
    } else {
      a[2] = 10;}
    a[3] = times / 10 % 10;
    a[4] = times % 10 % 10;
  }
  w2 = 0;

  ////////////////// вывод секунд - нажать и удерживать кнопку +/sec //////
  if (analogRead(SW3) > 500 && menu == 0 && menu_svet == 0) {
    w2 = 1; times = ss;
    a[0] = 11;
    a[1] = 10;
    a[2] = 10;
    a[3] = times / 10;
    a[4] = times % 10;
  }

  ////////////////////////// Коррекция минут//////////////////////////
  if (menu == 1) {
    if (analogRead(SW3) > 500 ) {minute++;delay(300);if (minute > 59) {minute = 0;}}
    if (analogRead(SW2) > 500 ) {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(SW3) > 500 ) {hour++;delay(300);if (hour > 23) {hour = 0;}}
    if (analogRead(SW2) > 500 ) {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(SW3) > 500 ) {day++;delay(300);if (day > 31) {day = 0;}}
    if (analogRead(SW2) > 500 ) {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(SW3) > 500 ) {month++;delay(300);if (month > 12) {month = 1;}}
    if (analogRead(SW2) > 500 ) {month--;delay(300);if (month < 1) {month = 1;}}
    times = month;
    a[0] = 4;
    a[1] = 10;
    a[2] = 10;
    a[3] = times / 10;
    a[4] = times % 10;}

  ///////////////////////////// Коррекция года ////////////////////////
  if (menu == 5) {
    if (analogRead(SW3) > 500 ) {year++;delay(300);if (year > 99) {year = 19;}}
    if (analogRead(SW2) > 500 ) {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(SW3) > 500 ) {save_t++;delay(300);if (save_t > 1) {save_t = 0;}}
    if (analogRead(SW2) > 500 ) {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) {  // Сохранение времени при флаге w==1
    watch.settime(59,minute,hour,day,month,year,weekday);  // 59  сек, 52 мин, 22 часа, 2, мая, 2021 года, воскресенье
    w=0;
  }
  ///////////////////// Включение/выключение подсветки//////////////////
  if (menu_svet == 1) {
    if (analogRead(SW3) > 500 ) {svet_state++;delay(300);if (svet_state > 1) {svet_state = 0;}}
    if (analogRead(SW2) > 500 ) {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(SW3) > 500 ) {brightness++;delay(200);if (brightness > 100) {brightness = 100;}}
    if (analogRead(SW2) > 500 ) {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 = brightness * 2.55;
  if (svet_state == 1) {
    analogWrite(led_pwm, svet);
  } else {
    digitalWrite(led_pwm, LOW);
  }

  if (w3 == 1) {  // Сохранение настроек в ЭСППЗУ при флаге w3==1
    EEPROM.put(ADDR_YRKOST, brightness); EEPROM.put(ADDR_SVET, svet_state);
    w3 = 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;
    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);}

123 (2021-05-10 12:01:32 отредактировано AlexandrS)

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

Фото готовых часов
http://forum.rcl-radio.ru/uploads/images/2021/05/ef6f9feff66b5304f3bba011d98f8576.png
Плата с обратной стороны
http://forum.rcl-radio.ru/uploads/images/2021/05/e3f8fb39fe38e1fa4c428844d51a238c.png

124

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

Всем привет! Успешно собрал часы по предоставленным здесь схемам, но столкнулся с одной проблемой в прошивке часов с кнопками. Установил я допустим время в 12.15, и оно тикает себе, все хорошо. прошло 3 часа к примеру, стало 15.15. И тут я решаю понажимать кнопку set, что бы дату посмотреть. долистываю до даты, смотрю, листаю дальше что бы вернуться ко времени. И вижу вновь 12.15, т е после нажатия кнопки set время возращается ко времени установки. Вопрос к знатокам, ибо я в прошивках не большой специалист. Это проблема прошивки, и можно ее исправить, или что то не так с моим ds3132 (так же, например системное время при компиляции скетча часы ни в какую не подтягивают). Либо, можно ли переназначить кнопку sec на date, ибо смотреть на секунды смысла не вижу, а дата гораздо нужнее.
ну и последнее. не знаю у кого как, а у меня температуру показывает на 2-3 градуса выше нормы (причем после включения показывает верную, а поработав 10-20 мин начинает завышать) DS3132 стоит в стороне от всего, и греть его нечему, так понимаю это его собственное тепло (если бы он не грелся, то и термостабилизация была бы не к чему). может имеет смысл использовать какой либо датчик температуры для ардуино? готов ли кто то подкорректировать прошивку?

125

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

опубликуйте скетч