Re: Ретро часы на ИВ-6
Вот так всё выглядит. Должно быть 18.48
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Законченные проекты → Ретро часы на ИВ-6
Вот так всё выглядит. Должно быть 18.48
А схема есть?
А схема есть?
Слишком большие отличия от моей схемы, я не смогу Вам помочь.
Уважаемые форумчане, делал ли кто данный проект с модулем DS1302. С железом проблем не возникло а вот с ПО - проблема, если кому не жалко поделитесь скетчем. Установку времени по компиляции вырезал, температуру тоже, а воз и ныне там...
Проект с модулем на DS1302 есть на форуме.
Схема и печатная плата часов на индикаторах ИВ-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);}
Здравствуйте, а как добавить будильник? Я заметил, что если просто вызвать функцию tone(tonePin, 174, 249), то таймер, что отвечает за динамическую индикацию сбивается, скорость падает в два раза, а сама tone() не работает при этом. Подскажите пожалуйста по этой проблемке.
tone использует таймер 2, а он уже занять под индикацию
tone использует таймер 2, а он уже занять под индикацию
А какие есть варианты решения с tone, и не планируется ли в будущем будильник?
Переведите индикацию на таймер 1 - http://rcl-radio.ru/?p=111487
Здравствуйте! Собрал часы по Вашей схеме (только вместо индикаторов ИВ-6 использовал ИВ-8) Все работает но есть одна проблема, первый индикатор дублирует на себе все последующие. Как можно решить?
На часах должно быть 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);}
Измените
MsTimer2::set(5, to_Timer);MsTimer2::start();
на
MsTimer2::set(1000, to_Timer);MsTimer2::start();
посмотрите гаснет ли первая лампа
Измените
MsTimer2::set(5, to_Timer);MsTimer2::start();
на
MsTimer2::set(1000, to_Timer);MsTimer2::start();
посмотрите гаснет ли первая лампа
Цифры поочередно загораются на индикаторах. Сперва на первом горит 1, потом на первом и втором 2, далее первый третий 2 и первый четвертый 0. Первый всегда дублирует число следующего индикатора. Но первая лампа не гаснет.
дело не в коде, смотрите схему, особенно транзистор подключенный к сетке лампы
дело не в коде, смотрите схему, особенно транзистор подключенный к сетке лампы
Благодарю за подсказку. Буду проверять.
Добрый день.Сделал часы по данной схеме,и я бы хотел заменить модуль ds1302 на ds3231,нужно ли для этого изменять код? (если нужно то не могли бы помочь с кодам и как подключить ds3231)
Схема и печатная плата часов на индикаторах ИВ-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);}
Ds1307 и ds3231 в плане вывода времени и корректировки времени полностью совместимы.
Собрал по этой схеме на индикаторе ИЛЦ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);}
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;
Доброго времени суток.Сделал часы по данной схеме,только заменил модуль ds1302 на ds3231.И проблема такова что на всех индикаторах светятся все сегменты причем плата на кнопки не реагирует.
Схема и печатная плата часов на индикаторах ИВ-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);}
Ds1302 и ds3231 как бы вообще не совместимы, Вы меняли код под ds3231?
Код я не менял так как в этом не силен.Надеялся на "чудо"
Код и схема которую вы используете была сильно изменена пользователем сайта, поэтому ждите ответа от AlexandrS. Возможно он Вам поможет.
Хорошо
Здравствуйте. Помогите пожалуйста с наладкой скетча(я в этом ооочень мало разбираюсь). Хочу сделать часы на 8 лампах с настройкой времени и подсветкой на адресных светодиодах. К слову у меня получилось собрать и прошить часы на 8 лампах и реализовать подсветку с регулировкой яркости подключив её на пины D13 и A0. Лампы которые идут на секунды я подключил соответственно на 0 и 1 пины, а лампы которые идут на "тире(G)" подключил согласно схемы к sqw. Собирал по первой схеме, пытался как то скрестить скетчи с настройкой и для 8 ламп, но всегда почему то переставали работать секунды. Есть ещё такой нюанс: после залития любого скетча, часы не показывали время компиляции, а какое-то другое.
forum.rcl-radio.ru → Законченные проекты → Ретро часы на ИВ-6
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|