Прошу помощи со скетчем часов.

olegovich80
Offline
Зарегистрирован: 07.01.2017

Доброго времени суток всем.

Делаю часы на редких 8-и сегментных индикаторах (марсианская восьмерка)

Поскольку индикаторы работают только в статике, было принято решение использовать сдвиговые регистры 74HC595. 

Регистры подключены каскадом.

Прицепил к ардуине RTC 1302 (знаю, что не лучший вариант, но она была под рукой) повесил ее на пины 5,6,7.

Испытал - работает.

Теперь встала задача вывести время на индикаторы.... и вот тут получилась загвоздка.

написал вот такой скетч:

/*
используем 8-и сегментные индикаторы ИЭЛ 0-VI
 */
#include <iarduino_RTC.h>                                   // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
    iarduino_RTC time(RTC_DS1302, 5, 6, 7);                 // Объявляем объект time для работы с RTC модулем на базе чипа DS1302, указывая выводы Arduino подключённые к выводам модуля RST, CLK, DAT
//  iarduino_RTC time(RTC_DS1307);                          // Объявляем объект time для работы с RTC модулем на базе чипа DS1307, используется аппаратная шина I2C
//  iarduino_RTC time(RTC_DS3231);                          // Объявляем объект time для работы с RTC модулем на базе чипа DS3231, используется аппаратная шина I2C


int latchpin = 2; // connect to pin 2 on the '595 ST_CP
int clockpin = 3; // connect to pin 3 on the '595 SH_CP
int datapin = 4; // connect to pin 4 on the '595 DS


// Пишем карту сегментов индикатора в двоичном формате
int segdisp[10] = 
{
 0b00001111,
 0b00000010,
 0b01100101,
 0b10100101,
 0b01001100,
 0b10101001,
 0b10110011,
 0b10000110,
 0b10101111,
 0b11101100
 }; 
void setup()
{
 delay(300);                // Ждем готовности модуля отвечать на запросы

 time.begin();              // Инициируем работу с модулем.
 pinMode(latchpin, OUTPUT); // Пин ST_CP как выход.   
 pinMode(clockpin, OUTPUT); // Пин SН_CP как выход.
 pinMode(datapin, OUTPUT);  // Пин DS как выход.
 
}

void loop()
{
  time.gettime();
int s1 = time.seconds;      // объявили переменную s1 как единицы секунд
int s10 = (time.seconds%10);  // объявили переменную s10 как десятки секунд
int m1 = time.minutes;      // объявили переменную m1 как единицы минут
int m10 = (time.minutes%10);  // объявили переменную m10 как десятки минут
int h1 = time.Hours;        // объявили переменную h1 как единицы часов
int h10 = (time.Hours%10);    // объявили переменную h10 как десятки часов

 

     digitalWrite(latchpin, LOW);

     shiftOut(datapin, clockpin, MSBFIRST, segdisp[s1]);  // выводим на первый регистр единицы секунд

     shiftOut(datapin, clockpin, MSBFIRST, segdisp[s10]); // выводим на второй регистр десятки секунд

     shiftOut(datapin, clockpin, LSBFIRST, segdisp[m1]);  // выводим на третий регистр единицы минут
     
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[m10]); // выводим на четвертый регистр десятки минут
     
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[h1]);  // выводим на пятый регистр единицы часов 
     
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[h10]); // выводим на шестой регистр десятки часов
     
     digitalWrite(latchpin, HIGH);
     
delay (1000);
   
 
}

В итоге ОНО тикает, но куда то не туда.

Сегменты переключаются хаотично, на всех индикаторах сразу.

Прошу помощи.

Не могу понять, где накосячил.

 

P.S.

Со сдвиговыми дело имею первый раз. Тапками прошу не бить.

P.P.S.

Если есть у кого скетч готовых часов со статикой, поделитесь пожалуйста.

sadman41
Offline
Зарегистрирован: 19.10.2016

А это нормально, что у вас часть цифер выводится с MSBFIRST, а другая с LSBFIRST?

olegovich80
Offline
Зарегистрирован: 07.01.2017

Ой, забыл поправить. 

Это я экспериментировал.

Я для теста 2 регистра использую (только секунды) и на них пробую.

Остальные строки были закомментированы.

А тут решил выложить полный скетч и раскомментировал все.

sadman41
Offline
Зарегистрирован: 19.10.2016

Но секунды-то нормально отображаются? 

Или если просто известные числа вытолкнуть на все индикаторы - типа segdisp[5] - тогда как?

olegovich80
Offline
Зарегистрирован: 07.01.2017

Вот такой код. 

И он не работает.

/*
используем 8-и сегментные индикаторы ИЭЛ 0-VI
 */
#include <iarduino_RTC.h>                                   // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
    iarduino_RTC time(RTC_DS1302, 5, 6, 7);                 // Объявляем объект time для работы с RTC модулем на базе чипа DS1302, указывая выводы Arduino подключённые к выводам модуля RST, CLK, DAT
//  iarduino_RTC time(RTC_DS1307);                          // Объявляем объект time для работы с RTC модулем на базе чипа DS1307, используется аппаратная шина I2C
//  iarduino_RTC time(RTC_DS3231);                          // Объявляем объект time для работы с RTC модулем на базе чипа DS3231, используется аппаратная шина I2C


int latchpin = 2; // connect to pin 2 on the '595 ST_CP
int clockpin = 3; // connect to pin 3 on the '595 SH_CP
int datapin = 4; // connect to pin 4 on the '595 DS


// Пишем карту сегментов индикатора в двоичном формате
int segdisp[10] = 
{
 0b00001111, // 0
 0b00000010, // 1
 0b01100101, // 2
 0b10100101, // 3
 0b01001100, // 4
 0b10101001, // 5
 0b10110011, // 6
 0b10000110, // 7
 0b10101111, // 8
 0b11101100  // 9
 }; 
void setup()
{
 delay(300);                // Ждем готовности модуля отвечать на запросы
 time.begin();              // Инициируем работу с модулем.
 pinMode(latchpin, OUTPUT); // Пин ST_CP как выход.   
 pinMode(clockpin, OUTPUT); // Пин SН_CP как выход.
 pinMode(datapin, OUTPUT);  // Пин DS как выход.
 
}

void loop()
{
time.gettime();               // получаем время из RTC
int s1 = time.seconds;        // объявили переменную s1 как единицы секунд
int s10 = (time.seconds%10);  // объявили переменную s10 как десятки секунд
int m1 = time.minutes;        // объявили переменную m1 как единицы минут
int m10 = (time.minutes%10);  // объявили переменную m10 как десятки минут
int h1 = time.Hours;          // объявили переменную h1 как единицы часов
int h10 = (time.Hours%10);    // объявили переменную h10 как десятки часов

     digitalWrite(latchpin, LOW);                         // открываем защелку
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[s1]);  // выводим на первый регистр единицы секунд
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[s10]); // выводим на второй регистр десятки секунд
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[m1]);  // выводим на третий регистр единицы минут
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[m10]); // выводим на четвертый регистр десятки минут
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[h1]);  // выводим на пятый регистр единицы часов 
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[h10]); // выводим на шестой регистр десятки часов
     digitalWrite(latchpin, HIGH);                        // закрываем защелку
     delay (1000);                                        // Ждем 1 секунду перед следующим циклом
}

Как то так :((

olegovich80
Offline
Зарегистрирован: 07.01.2017

не выводит нормально. обозначил вывод на 1 индикатор цифры 5, на второй - цифры 6. 

Теперь горит только ведущий (к которому от ардуины DS приходит), и то не в соответствии с битами. 

Зажглось только 2 сегмента.

sadman41
Offline
Зарегистрирован: 19.10.2016

Значит часы непричем. Засылайте туда shiftout-ом 0b11111111 - должны все сегменты загореться. Если нет - что-то напутано в проводах. Например - клок и дата перепутаны местами.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Надо схему проверять. А если в карте сегментов все 1 поставить у какой-нибудь цифры и вывести её - что гореть будет?

И кстати по скетчу, s1 это не единицы секунд (соответственно и m1, h1). Единицы это как раз s10. А сейчас  Вы за пределы массива обращаетесь.

nik182
Offline
Зарегистрирован: 04.05.2015

Должно быть

int s1 = time.seconds%10;        // объявили переменную s1 как единицы секунд
int s10 = (time.seconds/10);  // объявили переменную s10 как десятки секунд
int m1 = time.minutes%10;        // объявили переменную m1 как единицы минут
int m10 = (time.minutes/10);  // объявили переменную m10 как десятки минут
int h1 = time.Hours%10;          // объявили переменную h1 как единицы часов
int h10 = (time.Hours/10);    // объявили переменную h10 как десятки часов

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

А это нормально, что у вас часть цифер выводится с MSBFIRST, а другая с LSBFIRST?

Нормально! В войну, как ивестно, синус до пяти доходил, а Вы тут с глупостЯми лезете!

olegovich80
Offline
Зарегистрирован: 07.01.2017

Всё сейчас ещё раз проверил.

Буду думать над схемой управления индикаторами.

Похоже, что у меня симмисторы с оптронами не выдержали.

Сейчас горят все сегменты, независимо от того, подключены сдвиговые к ардуине или нет.

Скетч буду проверять  на светодиодах. Дома как раз тестовая плата с 6-ю сдвиговыми и 48 диодами лежит.

Всем большущее спасибо за ответы. 

Вернусь к теме, когда деталями закуплюсь. (на днях)

olegovich80
Offline
Зарегистрирован: 07.01.2017

Программа завелась с полоборота. Я уже начал было грешить на аппаратные проблемы, но как оказалось, мои расчеты были верны. 

Не знаю, насколько я корректно дописал в программу строки про SPI, Wire и Serial, но все получилось и затикало туда, куда надо и как надо.

Теперь буду дописывать в скетч кнопки. 

Не хочу заморачиваться и делать меню, а сделаю просто кучу кнопок подсоединенных к аналоговым пинам. (корпус будет большой... места на панели много)

Будет:

Установка минут, 

Установка часов,

Установка числа,

Установка месяца, 

Установка года,

Установка дня недели.

сейчас скетч выглядит таким образом:

/*
используем 8-и сегментные индикаторы ИЭЛ 0-VI
 */
#include <SPI.h>
#include <Wire.h>
#include <iarduino_RTC.h>                                   // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
    iarduino_RTC time(RTC_DS1302, 5, 6, 7);                 // Объявляем объект time для работы с RTC модулем на базе чипа DS1302, указывая выводы Arduino подключённые к выводам модуля RST, CLK, DAT
//  iarduino_RTC time(RTC_DS1307);                          // Объявляем объект time для работы с RTC модулем на базе чипа DS1307, используется аппаратная шина I2C
//  iarduino_RTC time(RTC_DS3231);                          // Объявляем объект time для работы с RTC модулем на базе чипа DS3231, используется аппаратная шина I2C


int latchpin = 2; // connect to pin 2 on the '595 ST_CP
int clockpin = 13; // connect to pin 3 on the '595 SH_CP
int datapin = 11; // connect to pin 4 on the '595 DS
int a = A0 // переменная для установки минут. Подключение к аналоговому пину А0
int b = A1 // переменная для установки часов. Подключение к аналоговому пину А1
int c = A2 // переменная для установки числа. Подключение к аналоговому пину А2
int d = A3 // переменная для установки месяца. Подключение к аналоговому пину А3
int e = A4 // переменная для установки года. Подключение к аналоговому пину А4
int f = A5 // переменная для установки дня недели. Подключение к аналоговому пину А5



// Пишем карту сегментов индикатора в двоичном формате
int segdisp[10] = 
{
 0b11110000, // 0
 0b01000000, // 1
 0b10100110, // 2
 0b10100101, // 3
 0b01001100, // 4
 0b10101001, // 5
 0b10110011, // 6
 0b10000110, // 7
 0b10101111, // 8
 0b11101100  // 9
 }; 
void setup()
{
 delay(300);                    // Ждем готовности модуля отвечать на запросы
 Serial.begin(9600);            // Готовим передачу данных
 time.begin();                  // Инициируем работу с модулем.
 pinMode(latchpin, OUTPUT);     // Пин ST_CP как выход.   
 pinMode(clockpin, OUTPUT);     // Пин SН_CP как выход.
 pinMode(datapin, OUTPUT);      // Пин DS как выход.
 digitalWrite(latchpin, HIGH);  // Устанавливаем первоначально защелку
 pinMode(a, INPUT);             // Устанавливаем порт А0 на вход
 pinMode(b, INPUT);             // Устанавливаем порт А1 на вход
 pinMode(c, INPUT);             // Устанавливаем порт А2 на вход
 pinMode(d, INPUT);             // Устанавливаем порт А3 на вход
 pinMode(e, INPUT);             // Устанавливаем порт А4 на вход
 pinMode(f, INPUT);             // Устанавливаем порт А5 на вход
}

void loop()
{
time.gettime();               // получаем время из RTC
int s1 = (time.seconds%10);        // объявили переменную s1 как единицы секунд
int s10 = (time.seconds/10);  // объявили переменную s10 как десятки секунд
int m1 = (time.minutes%10);        // объявили переменную m1 как единицы минут
int m10 = (time.minutes/10);  // объявили переменную m10 как десятки минут
int h1 = (time.Hours%10);          // объявили переменную h1 как единицы часов
int h10 = (time.Hours/10);    // объявили переменную h10 как десятки часов

     digitalWrite(latchpin, LOW);                         // открываем защелку
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[s1]);  // выводим на первый регистр единицы секунд
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[s10]); // выводим на второй регистр десятки секунд
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[m1]);  // выводим на третий регистр единицы минут
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[m10]); // выводим на четвертый регистр десятки минут
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[h1]);  // выводим на пятый регистр единицы часов 
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[h10]); // выводим на шестой регистр десятки часов
     digitalWrite(latchpin, HIGH);                        // закрываем защелку
     delay (100);                                        // Ждем 1 секунду перед следующим циклом

// теперь установка времени с кнопок с записью в RTC



}

Теперь немного фоток, ради чего все это делается:

Это индикаторы ИЭЛ:

Индикаторы ИЭЛ

Они же

Он же, пойдет на день недели

Вот так один из них светится:

И еще раз: (он зеленый, другие цвета есть, но они очень редкие)

Отреставрировал вольтметр с амперметром. У них теперь черный матовый корпус, золотистая зеркальная шкала и еле заметная зеленая подсветка:

И еще раз они же:

Вот как то так :))

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Ух ты! У меня где-то один похожий электролюминесцентный индикатор лежит на память. Надеюсь, кнопки тоже винтажные будут? Успехов!

И про блинк без делей почитайте. А то фигово будут кнопки нажиматься.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

olegovich80 пишет:

Теперь буду дописывать в скетч кнопки. 

Не хочу заморачиваться и делать меню, а сделаю просто кучу кнопок подсоединенных к аналоговым пинам. (корпус будет большой... места на панели много)

Можно теперь даже немношко поискать и найти схему как много кнопок можно подключить к ОДНОМУ аналоговому пину, чтоб не нарушать бизабразия. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Может сразу ПТК туда прикрутить и пассатижи рядом на цепь привесить...

SPI там вообще ни в какую красную армию. Оно, конечно, инклюдится, но не используется. Wire, вроде тоже не задевает ничего - квадратной шины в 1302 же нет?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

olegovich80 пишет:

Будет:

Установка минут, 

Установка часов,

Установка числа,

Установка месяца, 

Установка года,

Установка дня недели.

А ничего, что для текущей даты (число/месяц/год) день недели не допускает вариантов?

Или Вы решили создать собственный календарь?

Предусмотрите тогда установки количества дней в неделе, в году и в каждом из месяцев.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

olegovich80 пишет:

Будет:

Установка минут, 

Установка часов,

Установка числа,

Установка месяца, 

Установка года,

Установка дня недели.

И ограбление корованов!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano пишет:

А ничего, что для текущей даты (число/месяц/год) день недели не допускает вариантов?

Почему же не допускает?

Ещё классик писал: "Большинством голсов решили, что сегодня среда, а был понедельник".  Демократия-с!

olegovich80
Offline
Зарегистрирован: 07.01.2017

Прикрутил точки между индикаторами (работают) и попытался воткнуть кнопки (коррекцию дня недели убрал :) - разогнался малость с кнопками...)

Вот только кнопки не хотят работать..

Ткните плиз носом (ежели не трудно), где косяк.

/*
используем 8-и и 7-и сегментные индикаторы ИЭЛ 0-VI
 */
#include <SPI.h>
#include <Wire.h>
#include <iarduino_RTC.h>                                   // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
    iarduino_RTC time(RTC_DS1302, 5, 6, 7);                 // Объявляем объект time для работы с RTC модулем на базе чипа DS1302, указывая выводы Arduino подключённые к выводам модуля RST, CLK, DAT
//  iarduino_RTC time(RTC_DS1307);                          // Объявляем объект time для работы с RTC модулем на базе чипа DS1307, используется аппаратная шина I2C
//  iarduino_RTC time(RTC_DS3231);                          // Объявляем объект time для работы с RTC модулем на базе чипа DS3231, используется аппаратная шина I2C


int latchpin = 2; // connect to pin 2 on the '595 ST_CP
int clockpin = 13; // connect to pin 13 on the '595 SH_CP
int datapin = 11; // connect to pin 4 on the '595 DS
int a = A0; // переменная для установки минут. Подключение к аналоговому пину А0
int a1 = 0; // дополнительная переменная для установки минут
int b = A1; // переменная для установки часов. Подключение к аналоговому пину А1
int b1 = 0; // дополнительная переменная для установки часов
int c = A2; // переменная для установки числа. Подключение к аналоговому пину А2
int c1 = 0; // дополнительная переменная для установки числа
int d = A3; // переменная для установки месяца. Подключение к аналоговому пину А3
int d1 = 0; // дополнительная переменная для установки месяца
int e = A4; // переменная для установки года. Подключение к аналоговому пину А4
int e1 = 0; // дополнительная переменная для установки года
int f = A5; // переменная для установки дня недели. Подключение к аналоговому пину А5
int f1 = 0; // дополнительная переменная для установки номера дня недели


// Пишем карту сегментов индикатора в двоичном формате (для 8-и серментника)
int segdisp[10] = 
{
 0b11110000, // 0
 0b01000000, // 1
 0b10100110, // 2
 0b10100101, // 3
 0b01001100, // 4
 0b10101001, // 5
 0b10110011, // 6
 0b10000110, // 7
 0b10101111, // 8
 0b11101100, // 9
 
 }; 
 // Пишем карту сегментов индикатора в двоичном формате (для 7-и сегментника)
 int segdisp1[12] = 
{
 0b11111100, // 0
 0b01100000, // 1
 0b11011010, // 2
 0b11110010, // 3
 0b01100110, // 4
 0b10110110, // 5
 0b10111110, // 6
 0b11100000, // 7
 0b11111111, // 8
 0b11110110, // 9
 0b11000110, // знак градус
 0b10011100  // буква С
 }; 

const int ledPin =  8;      // номер выхода, подключенного к светодиоду
// Variables will change:
int ledState = LOW;             // этой переменной устанавливаем состояние светодиода
long previousMillis = 0;        // храним время последнего переключения светодиода
 
long interval = 1000;           // интервал между включение/выключением светодиода (1 секунда)

 
void setup()
{
 delay(300);                    // Ждем готовности модуля отвечать на запросы
 Serial.begin(9600);            // Готовим передачу данных
 time.begin();                  // Инициируем работу с модулем.
 pinMode(latchpin, OUTPUT);     // Пин ST_CP как выход.   
 pinMode(clockpin, OUTPUT);     // Пин SН_CP как выход.
 pinMode(datapin, OUTPUT);      // Пин DS как выход.
 digitalWrite(latchpin, HIGH);  // Устанавливаем первоначально защелку
 pinMode(a, INPUT);             // Устанавливаем порт А0 на вход
 pinMode(b, INPUT);             // Устанавливаем порт А1 на вход
 pinMode(c, INPUT);             // Устанавливаем порт А2 на вход
 pinMode(d, INPUT);             // Устанавливаем порт А3 на вход
 pinMode(e, INPUT);             // Устанавливаем порт А4 на вход
 pinMode(f, INPUT);             // Устанавливаем порт А5 на вход
 pinMode(ledPin, OUTPUT);       // Устанавливаем порт LedPin на выход
}

void loop()
{
time.gettime();                    // получаем время из RTC
int s1 = (time.seconds%10);        // объявили переменную s1 как единицы секунд
int s10 = (time.seconds/10);       // объявили переменную s10 как десятки секунд
int m1 = (time.minutes%10);        // объявили переменную m1 как единицы минут
int m10 = (time.minutes/10);       // объявили переменную m10 как десятки минут
int h1 = (time.Hours%10);          // объявили переменную h1 как единицы часов
int h10 = (time.Hours/10);         // объявили переменную h10 как десятки часов
int day1 = (time.day%10);          // объявили переменную day1 как единицы дня
int day10 = (time.day/10);         // объявили переменную day10 как десятки дня
int mo1 = (time.month%10);         // объявили переменную mo1 как единицы месяца
int mo10 = (time.month/10);        // объявили переменную mo10 как десятки месяца
int y1 = (time.year%10);           // объявили переменную y1 как единицы года
int y10 = (time.year/10);          // объявили переменную y10 как десятки года
int dd = (time.weekday);           // объявили переменную dd как день недели

     digitalWrite(latchpin, LOW);                           // открываем защелку
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[s1]);    // выводим на первый регистр единицы секунд
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[s10]);   // выводим на второй регистр десятки секунд
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[m1]);    // выводим на третий регистр единицы минут
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[m10]);   // выводим на четвертый регистр десятки минут
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[h1]);    // выводим на пятый регистр единицы часов 
     shiftOut(datapin, clockpin, LSBFIRST, segdisp[h10]);   // выводим на шестой регистр десятки часов
     // shiftOut(datapin, clockpin, LSBFIRST, segdisp[day1]);  // выводим на седьмой регистр
     // shiftOut(datapin, clockpin, LSBFIRST, segdisp[day10]); // выводим на восьмой регистр
     // shiftOut(datapin, clockpin, LSBFIRST, segdisp[mo1]);   // выводим на девятый регистр
     // shiftOut(datapin, clockpin, LSBFIRST, segdisp[mo10]);  // выводим на десятый регистр
     // shiftOut(datapin, clockpin, LSBFIRST, segdisp[y1]);    // выводим на одинадцатый регистр
     // shiftOut(datapin, clockpin, LSBFIRST, segdisp[y10]);   // выводим на двенадцатый регистр
     // shiftOut(datapin, clockpin, LSBFIRST, segdisp1[dd]);    // выводим на тринадцатый регистр (7-и сегментный индикатор)
     digitalWrite(latchpin, HIGH);                        // закрываем защелку
     delay (1);                                         // Ждем 0,001 секунду перед следующим циклом
unsigned long currentMillis = millis();
  //проверяем не прошел ли нужный интервал, если прошел то
  if(currentMillis - previousMillis > interval) {
    // сохраняем время последнего переключения
    previousMillis = currentMillis; 
 
    // если светодиод не горит, то зажигаем, и наоборот
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
 
    // устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(ledPin, ledState);
  }

// теперь установка времени с кнопок с записью в RTC

a1 = digitalRead(a); // присваиваем значение дополнительной переменной для установки минут
b1 = digitalRead(b); // присваиваем значение дополнительной переменной для установки часов
c1 = digitalRead(c); // присваиваем значение дополнительной переменной для установки числа
d1 = digitalRead(d); // присваиваем значение дополнительной переменной для установки месяца
e1 = digitalRead(e); // присваиваем значение дополнительной переменной для установки года
f1 = digitalRead(f); // присваиваем значение дополнительной переменной для установки номера дня недели

// если нажата кнопка установки минут
if (a == HIGH){
for (a1=0; a1 <= 59; a1++){
      time.blinktime(2, 4);                           // мигаем минутами
      time.settime(-1, a1, -1, -1, -1, -1, -1);       // пишем минуты в RTC
      delay(100);                                    // ждем 0,1 секунду
   }                         
}
// если нажата кнопка установки часов
else if (b == HIGH){
for (b1=0; b1 < 24; b1++){
      time.blinktime(3, 4);                           // мигаем часами
      time.settime(-1, -1, b1, -1, -1, -1, -1);                    // пишем часы в RTC
      delay(100);                                  // ждем 0,1 секунду
   }
}
// если нажата кнопка установки числа
else if (c == HIGH){
for (c1=0; c1 <= 31; c1++){
      time.blinktime(4, 4);                           // мигаем числом
      time.settime(-1, -1, -1, c1, -1, -1, -1);                // пишем число в RTC
      delay(100);                                  // ждем 0,1 секунду
   }
}
// если нажата кнопка установки месяца
else if (d == HIGH){
for (d1=0; d1 <= 12; d1++){
      time.blinktime(5, 4);                           // мигаем месяцем
      time.settime(-1, -1, -1, -1, d1, -1, -1);            // пишем месяц в RTC
      delay(100);                                  // ждем 0,1 секунду
   }
}
// если нажата кнопка установки года
else if (e == HIGH){
for (e1=0; e1 <= 99; e1++){
      time.blinktime(6, 4);                           // мигаем годом
      time.settime(-1, -1, -1, -1, -1, e1, -1);        // пишем год в RTC
      delay(100);                                  // ждем 0,1 секунду
   }
}
// если ничего не нажато
else {
}                                                   // ничего не делаем
}

Заранее спс.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

olegovich80.Вы наверно обидетесь, но главный косяк это тот кто такой скетч написал. А использование delay(100); следствие. И в результате что пишем то и получаем.

sadman41
Offline
Зарегистрирован: 19.10.2016

Так расскажите, как они не хотят. Думаете, что легко по виду скетча угадать, что как глючит?

Квон сейчас вам классы приложит ко лбу и всё пройдет (но это не точно).

И старайтесь избегать имен переменных типа a1, A1 и т.д. Забудетесь - напишите с прописной, да начнете ошибки искать там, где их нет.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

какие тут классы, тут трепанацию надо проводить.

146 if (a == HIGH){
147 for (a1=0; a1 <= 59; a1++){
148       time.blinktime(2, 4);                           // мигаем минутами
149       time.settime(-1, a1, -1, -1, -1, -1, -1);       // пишем минуты в RTC
150       delay(100);                                    // ждем 0,1 секунду
151    }                        
152 }

Вот что будет если a будет HIGH . Код войдет в штопор(зачеркнуто )    в цикл 60 раз выполнит delay (100) итого 6 секунд будет в тормозе.

olegovich80
Offline
Зарегистрирован: 07.01.2017

Я так понимаю delay надо вынести за рамки for? правильно?

P.S. кнопки в данный момент не работают вообще. время в RTC не корректируется.

P.P.S. А в чем косяк всего скетча? мне нужна статика на всех индикаторах. (в динамике они в принципе не работают) Нужна гора отдельных индикаторов. (их в итоге 19 будет).

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Знаний вам не хватает. И их я не буду выкладывать индивидуально для вас.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

olegovich80,

ну что Вы творите? Ну, вот смотрите сами

Строки 138 и 146

a1 = digitalRead(a);
if (a == HIGH){

В строке 138 Вы используете "a" как номер пина, а в 146 Вы ту же самую "a" используете как некое значение, которое сравниваете с HIGH. Вы уж определитесь, если она номер пина, то нахрена её с HIGH сравнивать, а если она - значение, так зачем её в качестве номера пина использовать.

То же самое касается многих других переменных, см. сами.

Такие ошибки появляются от лени. Ну, как нахрен "a"? Переменная должна называться примерно pinZelenoyKnopki, понимаете? Если все переменные будут называться осмысленно - то их труднее перепутать, а так как у Вас ....

Владимира Владимировича читали?

Если тебе корова имя,
У тебя должно быть молоко и вымя!
А если нет ни молока, ни вымени,
То чёрта ль в твоём коровьем имени?

Вот так надо переменные называть!

olegovich80
Offline
Зарегистрирован: 07.01.2017

Принято. Будем исправляться.

kalapanga
Offline
Зарегистрирован: 23.10.2016

olegovich80 пишет:

Я так понимаю delay надо вынести за рамки for? правильно?

Неправильно. От него надо избавиться. Совсем. Я же выше написал, что плохо кнопкам будет. Смотрите в примерах blink without delay. Или прямо тут: Мигаем светодиодом без delay() Да и на форуме куча тем про это.

olegovich80
Offline
Зарегистрирован: 07.01.2017

Решил разместить фотки того, что получается.

Воткнул всё в корпус.

Жду от наших друзей из поднебесной посылку с оптореле. Приедет, выложу фотку с работающими индикаторами.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Брутально! А вот эти приборы по бокам (вотльтметры?) - неужели они в аналоговом режиме показывают месяц и день недели? Только не говорите, что "да", а то я от зависти умру! Ну, очень брутально выглядит. Такое суровое ретро! Блеск!

olegovich80
Offline
Зарегистрирован: 07.01.2017

Нет, они просто для красоты. Показывают напряжение на контроллере и ток на индикаторах. Подсвечены зелёным неоном в цвет индикаторов.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

А зря, аналоговые индикаторы должны показывать год и столетие. И надпись должна быть very powerful time machine

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

qwone пишет:

А зря, аналоговые индикаторы должны показывать год и столетие. И надпись должна быть very powerful time machine

аналоговые индикаторы должны показывать дату апокалипсиса

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Лучше бы они что-то связанное со временем показывали - реально круто, подумайте!

Если реально решите делать, могу подарить Вам скетч (и схемотехнику) для дня недели. Т.е. Вы аккуратно вытаскиваете циферблат, заменяете его на свой, разрисованный на 7 секторов (от стрелки и расширяющиеся вверх, как солнечные лучи), а я подскажу как соединить и как скетч написать, чтобы стрелка всегда находилась в нужном дне недели, причём двигалась постоянно, т.е. по ней можно и время приблизительно прикинуть)..

sadman41
Offline
Зарегистрирован: 19.10.2016

Можно еще "зеленый глаз" из лампового приемника присобачить. Пусть показывает... Фазу луны, во.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

Можно еще "зеленый глаз" из лампового приемника присобачить. 

Где б его ещё взять? А то можно было бы и присобачить.

olegovich80
Offline
Зарегистрирован: 07.01.2017

Я так понимаю, что вывод можно осуществить при помощи analogWrite. Правильно? Идея интересная, но сейчас, к сожалению, нет пока времени ей заняться. На работе завал, который продолжится до начала лета. А насчет зеленого глаза - не проблема. Не сочтите за рекламу, я иногда закупаюсь в ретрорадиодетали и в тех орге. Там много, чего интересного есть.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

olegovich80 пишет:

 я иногда закупаюсь в ретрорадиодетали и в тех орге. Там много, чего интересного есть.

Пожалуйста, ссылочки!

А то я попробовал http://tech.org/ - не то :(

olegovich80
Offline
Зарегистрирован: 07.01.2017
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Хрена се - 6Е5С - 2 т.р. на ретро-детали! Да они ухи нажрались! На том же техорге она за 500!

olegovich80
Offline
Зарегистрирован: 07.01.2017

Я так думаю, если порыскать по авитоподобным сайтам то можно на переферии найти за копейки. Я недавно ИВ-27 в количестве купил за 200 рублей. ИН-ки всякие по 50 - 100 собираю по всей России. Ну и всякое такое. ИЭЛы из Тулы заказываю.

olegovich80
Offline
Зарегистрирован: 07.01.2017

Очень хочу матрицу точек цветную электролюминисцентную 50-х годов. Но видел такую всего раз в жизни и стоила она 1500 долл. Я на такие жертвы еще не готов. :))

olegovich80
Offline
Зарегистрирован: 07.01.2017

Часики в работе.

https://youtu.be/x3qla2TdIfE

И немного фото

Вот как то так пока.

Если появится время, буду дописывать эффекты индикации, температуру, дату и другие подобные плюшки.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Молодец, что до готового изделия всё довели! Чуть-чуть критики. По-моему, зря Вы индикаторы внутрь утопили. На первом фото, где они крупно, видны дефекты вырезания отверстий. Хотя, изделие крупное, смотреть будут издали, мелочи наверное и не видно будет. Казалось бы, ну чего хорошего во всём этом старье? А притягивает! Сам при случае подбираю разные приборчики/индикаторы, может дойдут руки сделать чего-нибудь.

olegovich80
Offline
Зарегистрирован: 07.01.2017

Спасибо за похвалу.

У меня 2 панельки передних. Одна действительно с косяками, с ней и решил собирать экспериментальный образец. (мало ли испорчу). На второй панели дефектов нет. Я буду с ней собирать такие же, но корпус будет сделан качественнее. Подсветку приборов переделаю на EL, сделаю заднюю панель с кнопочками. Но это всё позже. Сейчас просто рад, что они заработали.

P.S. Идей с этими индикаторами еще много. На примере этих часов - проверю их на выживаемость. Если долго проживут, буду с ними дальше баловаться, если же нет, то буду индикаторы сам делать из EL бумаги. 

Мне их "марсианская" восьмерка нравится :)