201 (2022-02-16 17:47:38 отредактировано FedorM)

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

Вот так всё выглядит. Должно быть 18.48 http://forum.rcl-radio.ru/uploads/images/2022/02/a0e65df303e16b92a181d13a14895797.jpg

202

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

А схема есть?

203

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

liman324 пишет:

А схема есть?

https://easyeda.com/fedorm1984/lumo-clock

204

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

Слишком большие отличия от моей схемы, я не смогу Вам помочь.

205

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

Уважаемые форумчане, делал ли кто данный проект с модулем DS1302. С железом проблем не возникло а вот с ПО - проблема, если кому не жалко поделитесь скетчем. Установку времени по компиляции вырезал, температуру тоже, а воз и ныне там...

206 (2022-10-18 21:07:26 отредактировано AlexandrS)

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

Проект с модулем на DS1302 есть на форуме.

AlexandrS пишет:

Схема и печатная плата часов на индикаторах ИВ-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);}

207 (2022-10-25 22:52:48 отредактировано Alex789)

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

Здравствуйте, а как добавить будильник? Я заметил, что если просто вызвать функцию tone(tonePin, 174, 249), то таймер, что отвечает за динамическую индикацию сбивается, скорость падает в два раза, а сама tone() не работает при этом. Подскажите пожалуйста по этой проблемке.

208

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

tone использует таймер 2, а он уже занять под индикацию

209

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

liman324 пишет:

tone использует таймер 2, а он уже занять под индикацию

А какие есть варианты решения с tone, и не планируется ли в будущем будильник?

210

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

Переведите индикацию на таймер 1 - http://rcl-radio.ru/?p=111487

211

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

Здравствуйте! Собрал часы по Вашей схеме (только вместо индикаторов ИВ-6 использовал ИВ-8) Все работает но есть одна проблема, первый индикатор дублирует на себе все последующие. Как можно решить?
http://forum.rcl-radio.ru/uploads/images/2023/01/4da71614aa7ec843c72c5f278a4b1554.jpg

На часах должно быть 1140

#include <MsTimer2.h>  // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <Wire.h> 
#include <DS3231.h>  // http://rcl-radio.ru/wp-content/uploads/2021/01/DS3231.zip
DS3231 clock;RTCDateTime DateTime;
  int an, segm,times,i;
  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);
}
 
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);}

212

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

Измените
MsTimer2::set(5, to_Timer);MsTimer2::start();
на
MsTimer2::set(1000, to_Timer);MsTimer2::start();
посмотрите гаснет ли первая лампа

213

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

liman324 пишет:

Измените
MsTimer2::set(5, to_Timer);MsTimer2::start();
на
MsTimer2::set(1000, to_Timer);MsTimer2::start();
посмотрите гаснет ли первая лампа

Цифры поочередно загораются на индикаторах. Сперва на первом горит 1, потом на первом и втором 2, далее первый третий 2 и первый четвертый 0. Первый всегда дублирует число следующего индикатора. Но первая лампа не гаснет.

214

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

дело не в коде, смотрите схему, особенно транзистор подключенный к сетке лампы

215

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

liman324 пишет:

дело не в коде, смотрите схему, особенно транзистор подключенный к сетке лампы

Благодарю за подсказку. Буду проверять.

216

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

Добрый день.Сделал часы по данной схеме,и я бы хотел заменить модуль ds1302 на ds3231,нужно ли для этого изменять код? (если нужно то не могли бы помочь с кодам и как подключить ds3231)

AlexandrS пишет:

Схема и печатная плата часов на индикаторах ИВ-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);}

217

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

Ds1307 и ds3231 в плане вывода времени и корректировки времени полностью совместимы.

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

Собрал по этой схеме на индикаторе ИЛЦ1-4/7Л-Р.
Тоже есть засветка сегментов. Колдовство с кодом не помогает. В принципе, за зеленым светофильтром довольно хорошо.
Сделал звук на кнопку "SET", перевел на TIMER1, так как tone() сбивает TIMER2.
Выкладываю измененную программу под свой индикатор, может кому-нибудь будет полезно. По поводу засветки можно поиграться с частотой обновления в TIMER1.

//#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;
//------------------------------
int s1 = 10;
int s2 = 8;
int s4 = 4;
int s5 = 1;
int segA = 9;
int segB = 12;
int segC = 5;
int segD = 6;
int segE = 3;
int segF = 11;
int segG = 2;
int dotL = 7;
int dotK = 0;
int beeper = 13;
//-------------------------------------------------- 
void setup(){ 
  Wire.begin();
  clock.begin();
 // MsTimer2::set(1, to_Timer);
 // MsTimer2::start();
 // установка таймера1, http://rcl-radio.ru/?p=111487
cli();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
// (16000000/((624+1)x64))=400 Hz
  OCR1A = 624;
  TCCR1B |= (1 << WGM12);
// Prescaler 64
  TCCR1B |= (1 << CS11) | (1 << CS10);
  TIMSK1 |= (1 << OCIE1A);
  sei();
 //clock.setDateTime(2023, 2, 11, 13, 45, 0); // Устанавливаем время на часах, основываясь на времени компиляции скетча
 //clock.setDateTime(12, 01);
 //
 //                      распиновка ИЛЦ1-4/7
 /*-------------------------------------------------------------------
  *   1   2   3   4   5   6   7   8   9  10   11  12  13  14  15  16
  *   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
  *   к   в   с   с   с   с   с   с   c   н   с   с   c   с   с   к
  *   а   е   е   е   е   е   е   е   е   и   е   е   е   е   е   а
  *   т   р   т   г   г   т   г   г   т   ж   т   г   г   т   г   т
  *   о   х   к   м   м   к   м   м   к   н   к   м   м   к   м   о
  *   д       а   .   .   а   .   .   а   я   а   .   .   а   .   д
  *       т                               я                      
  *   н   о   5   G   E   4   C   D   3       2   B   F   1   A   н
  *   а   ч           +                   т       +   +           а
  *   к   к   р           р           р   о   р           р       к
  *   а   а   а           а           а   ч   а           а       а
  *   л       з           з           з   к   з           з       л
  *           р           р           р   а   р           р
  *           я           я           я       я           я
  *           д           д           д       д           д
  */

 pinMode(0,OUTPUT); // D0 === верхняя точка K
 pinMode(1,OUTPUT); // D1  === A0  сетка 5 разряда
 pinMode(4,OUTPUT); // D4 === A1    сетка 4 разряда
 pinMode(8,OUTPUT); // D8 === A2   сетка 2 разряда
 pinMode(10,OUTPUT);// D10 === A3 сетка 1 разряда
 pinMode(9,OUTPUT); // D9  === a
 pinMode(11,OUTPUT);// D11  === f
 pinMode(12,OUTPUT);// D12  === b
 pinMode(6,OUTPUT); // D6  === d
 pinMode(5,OUTPUT); // D5  === c
 pinMode(3,OUTPUT); // D3  === e
 pinMode(2,OUTPUT); // D2  === g
 pinMode(7,OUTPUT); // нижняя точка
 pinMode(13,OUTPUT);// пищалка
 pinMode(A0,INPUT);  // SET
 pinMode(A1,INPUT);  // +/sec
 pinMode(A2,INPUT);  // -/temp
 pinMode(A3,INPUT);

////  текущее время перенос в переменные коррекции времени
 DateTime=clock.getDateTime();// опрос времени
 year = DateTime.year;
 month = DateTime.month;
 day = DateTime.day;
 hour = DateTime.hour;
 minute = DateTime.minute;

 //clock.setOutput(DS3231_1HZ); //включаем выход SQW DS3231 на 1 Гц
 
} //setup


 
void loop(){ 
  DateTime=clock.getDateTime();// опрос времени

if(analogRead(A1)>900){
  menu++;
  delay(200);
  tone(beeper, 440, 10);
  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(A3)>900){digitalWrite(dotL,HIGH);}else{digitalWrite(dotL,LOW);}// dp
  }
  w2=0;
////// вывод секунд - нажать и удерживать кнопку +/sec /////////////////////////////////////
  if(analogRead(A2)>900&&menu==0){w2=1;times = DateTime.second;digitalWrite(dotL,HIGH);
  a[0]=11;
  a[1]=10;
  a[2]=times/10;
  a[3]=times%10;} else{digitalWrite(dotL,LOW);}

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

///////// коррекция минут /////////////////
  if(menu==1){
    if(analogRead(A2)>900){minute++;delay(300);if(minute>59){minute=0;}}
    if(analogRead(A0)>900){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(analogRead(A2)>900){hour++;delay(300);if(hour>23){hour=0;}}
    if(analogRead(A0)>900){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(analogRead(A2)>900){day++;delay(300);if(day>31){day=0;}}
    if(analogRead(A0)>900){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(analogRead(A2)>900){month++;delay(300);if(month>12){month=0;}}
    if(analogRead(A0)>900){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(analogRead(A2)>900){year++;delay(300);if(year>99){year=19;}}
    if(analogRead(A0)>900){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(){
ISR(TIMER1_COMPA_vect){ 
//int ddd = 50;  //50 переменная для задержкив микросекундах
  switch(i){
    //case 0: segm=a[0]; an=0; anod(); segment(); break;
    case 0: an=4;anod(); delayMicroseconds(ddd);segm=a[0]; an=0; anod(); segment();break;
    case 1: segm=a[1]; an=1; anod(); segment(); break;
    case 2: segm=a[2]; an=2; anod(); segment(); break;
    case 3: segm=a[3]; an=3; anod(); segment(); break;}
//    case 0: an=4;anod(); delayMicroseconds(ddd);segm=a[0]; an=0; anod(); segment();break;
//    case 1: an=4;anod(); delayMicroseconds(ddd);segm=a[1]; an=1; anod(); segment();break;
//    case 2: an=4;anod(); delayMicroseconds(ddd);segm=a[2]; an=2; anod(); segment();break;
//    case 3: an=4;anod(); delayMicroseconds(ddd);segm=a[3]; an=3; anod(); segment();break;} //не помогло
    i++;
    if(i>3){i=0;}
}
 
 
void segment(){   //для ИЛЦ1-4/7
  switch(segm){                                                                 
             //   A          B          C          D          E          F          G  
    case 0: ch(segA,0);ch(segB,0);ch(segC,0);ch(segD,0);ch(segE,0);ch(segF,0);ch(segG,1);break;// 0 
    case 1: ch(segA,1);ch(segB,0);ch(segC,0);ch(segD,1);ch(segE,1);ch(segF,1);ch(segG,1);break;// 1
    case 2: ch(segA,0);ch(segB,0);ch(segC,1);ch(segD,0);ch(segE,0);ch(segF,1);ch(segG,0);break;// 2
    case 3: ch(segA,0);ch(segB,0);ch(segC,0);ch(segD,0);ch(segE,1);ch(segF,1);ch(segG,0);break;// 3   
    case 4: ch(segA,1);ch(segB,0);ch(segC,0);ch(segD,1);ch(segE,1);ch(segF,0);ch(segG,0);break;// 4 
    case 5: ch(segA,0);ch(segB,1);ch(segC,0);ch(segD,0);ch(segE,1);ch(segF,0);ch(segG,0);break;// 5 
    case 6: ch(segA,0);ch(segB,1);ch(segC,0);ch(segD,0);ch(segE,0);ch(segF,0);ch(segG,0);break;// 6 
    case 7: ch(segA,0);ch(segB,0);ch(segC,0);ch(segD,1);ch(segE,1);ch(segF,1);ch(segG,1);break;// 7 
    case 8: ch(segA,0);ch(segB,0);ch(segC,0);ch(segD,0);ch(segE,0);ch(segF,0);ch(segG,0);break;// 8
    case 9: ch(segA,0);ch(segB,0);ch(segC,0);ch(segD,0);ch(segE,1);ch(segF,0);ch(segG,0);break;// 9 
    case 10:ch(segA,1);ch(segB,1);ch(segC,1);ch(segD,1);ch(segE,1);ch(segF,1);ch(segG,1);break;// ПУСТО
    case 11:ch(segA,0);ch(segB,1);ch(segC,0);ch(segD,0);ch(segE,1);ch(segF,0);ch(segG,0);break;// S 
    case 12:ch(segA,1);ch(segB,1);ch(segC,1);ch(segD,0);ch(segE,0);ch(segF,0);ch(segG,0);break;// t  
  }}
void anod(){
  switch(an){                                                             
    case 0: ch(s5,0); ch(s4,1); ch(s2,1); ch(s1,1); break;  
    case 1: ch(s5,1); ch(s4,0); ch(s2,1); ch(s1,1); break; 
    case 2: ch(s5,1); ch(s4,1); ch(s2,0); ch(s1,1); break;
    case 3: ch(s5,1); ch(s4,1); ch(s2,1); ch(s1,0); break;
    case 4: ch(s5,1); ch(s4,1); ch(s2,1); ch(s1,1); break;
  }}

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

http://forum.rcl-radio.ru/uploads/images/2023/02/6d4c01cf6acc5687705f9b765c962c4c.jpg

219

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

ddd 1/3 от длительности свечения лампы
    case 0: segm=10;an=4;anod(); segment();delayMicroseconds(ddd);segm=a[0]; an=0; anod(); segment(); break;
    case 1: segm=10;an=4;anod(); segment();delayMicroseconds(ddd);segm=a[1]; an=1; anod(); segment(); break;
    case 2: segm=10;an=4;anod(); segment();delayMicroseconds(ddd);segm=a[2]; an=2; anod(); segment(); break;
    case 3: segm=10;an=4;anod(); segment();delayMicroseconds(ddd);segm=a[3]; an=3; anod(); segment(); break;

220

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

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

AlexandrS пишет:

Схема и печатная плата часов на индикаторах ИВ-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);}

221

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

Ds1302 и ds3231 как бы вообще не совместимы, Вы меняли код под ds3231?

222

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

Код я не менял так как в этом не силен.Надеялся на "чудо"

223

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

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

224

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

Хорошо

225

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

Здравствуйте. Помогите пожалуйста с наладкой скетча(я в этом ооочень мало разбираюсь). Хочу сделать часы на 8 лампах с настройкой времени и подсветкой на адресных светодиодах. К слову у меня получилось собрать и прошить часы на 8 лампах и реализовать подсветку с регулировкой яркости подключив её на пины D13 и A0. Лампы которые идут на секунды я подключил соответственно на 0 и 1 пины, а лампы которые идут на "тире(G)" подключил согласно схемы к sqw. Собирал по первой схеме, пытался как то скрестить скетчи с настройкой и для 8 ламп, но всегда почему то переставали работать секунды. Есть ещё такой нюанс: после залития любого скетча, часы не показывали время компиляции, а какое-то другое. http://forum.rcl-radio.ru/uploads/images/2024/01/fbce6d2027e83f1c1e403620d530a634.gif