ARDUINO Часы на ГРИ v1. Обсуждение проекта

poty

★★★★★★✩
19 Фев 2020
2,989
895
Внешне всё нормально.
4,7мкФ на какое напряжение? Это уже новый стоит? Проверен?
Что за диод на месте HER106? Проверяли его?
Какова индуктивность дросселя?
КТ3107 и 3102 не перепутаны местами?
Высоковольтный свист говорит о том, что частота преобразователя находится в слышимом диапазоне, отсюда - нагрев катушки и транзистора. Фактически, если нет какого-то к.з. на выходе высоковольтного питания (а здесь это маловероятная вещь, если плата с лампами снята), частота определяется единственным конденсатором 510пФ (помнится, я о нём уже спрашивал, но проверить всё равно не мешает).
 

zegors

✩✩✩✩✩✩✩
21 Мар 2020
5
0
@poty, Спасибо, обнаружил непропай от одной ноги дешифратора, цифру 7 включил. индикатор включить так и не удалось несмотря на замену соответствующей оптопары, контакты звонятся, похоже он мертв
 

poty

★★★★★★✩
19 Фев 2020
2,989
895
индикатор включить так и не удалось несмотря на замену соответствующей оптопары, контакты звонятся, похоже он мертв
Это не исключено, но Вы проверили - правильно ли он впаян? Нет ли непропая его анода? В принципе - если на него подать напряжение как я ранее указывал, тоже ничего не происходит?
 

zegors

✩✩✩✩✩✩✩
21 Мар 2020
5
0
@poty, я проверил правильность распайки и прозвонил контакт анода, по поводу подать напряжение не совсем понял, мне нужно через резистор с одной ноги конденсатора подать напряжение на цифру, а с другой на анод, так?
UPD: Так и сделал, индикатор не горит увы
 
Изменено:

Chumniy_Doc

✩✩✩✩✩✩✩
18 Мар 2020
12
0
@poty, да, новый, на 450 вольт. кт-шки местами не перепутаны (уже не раз проверял). Индуктивность закупалась для второй версии часов изначально и ее значение - 220. На месте HER 106 стоит HER 106 , его проверил. Он к сведению новый. Может еще добавит ясности - я когда пытался записать скетч (и собственно говоря записал), я не подключал 12 вольтового питания, но при этом модуль реального времени работал + был слашен высоковольтный свист - по сути я запитал плату от 5 вольт. Мб причина в этом
 

zegors

✩✩✩✩✩✩✩
21 Мар 2020
5
0
Я хотел сделать эффект наложения цифр друг на друга при смене, возможно ли на этой плате включить несколько цифр одновременно на одном индикаторе?
 

poty

★★★★★★✩
19 Фев 2020
2,989
895
UPD: Так и сделал, индикатор не горит увы
Так чтобы уж совсем позанудничать - а на рабочем так пробовали? Горит?
новый, на 450 вольт
кт-шки местами не перепутаны
Индуктивность ... значение - 220
На месте HER 106 стоит HER 106
ОК по всем пунктам.
Что касается запитывания платы от 5В - несколько странно... Возможно, КРЕН имеет защитный диод от отрицательной разности напряжения по входу и выходу, потому всё и запитывалось, иначе непонятно, как 5В попали на шину 12В. Само по себе включение от 5В не должно было привести ни к чему плохому. На всякий случай: индуктивность 220мкГн, правильно? И проверка сейчас осуществляется без платы ламп? Не вижу тогда проблем, чтоб не работало.
А в принципе, если на выключенной плате (и отключенной плате ламп) померить мультиметром в режиме сопротивления конденсатор 4,7мкФ (соблюдая полярность, разумеется, и дождавшись его заряда) - может на плате всё же есть где утечка или к.з.

возможно ли на этой плате включить несколько цифр одновременно на одном индикаторе?
Напрямую - нет. Но если обеспечить чередование при импульсном зажигании, то да. Единственно, яркость цифр будет снижаться пропорционально количеству.
 
Изменено:
  • Лойс +1
Реакции: Chumniy_Doc

zegors

✩✩✩✩✩✩✩
21 Мар 2020
5
0
@poty, частоты обновления хватит чтобы это было незаметно при чередовании?
 

poty

★★★★★★✩
19 Фев 2020
2,989
895
Думаю, хватит. Сейчас на каждую цифру приходится по 3мс, цифр у нас (считая с разделителями) - 7. Общая продолжительность периода = 21мс или частота = 47Гц. Т.е., в режиме чередования совместные цифры будут иметь частоту около 23Гц (при двух одновременных цифрах). Можно, конечно, изощриться и поделить интервал в 3мс на количество одновременно зажжённых цифр, тогда частота вообще не изменится.
 

poty

★★★★★★✩
19 Фев 2020
2,989
895
Кстати, для тех, кто хотел повысить яркость есть две возможности:
1. Объединить отображение точки с одним из разрядов. В этом случае зажигание остальных индикаторов будет осуществляться чаще на 1/7 периода.
2. Увеличить время горения в рамках 3мс, выделенных на отображение одной цифры (имеется соответствующий параметр в секции define).
 

Chumniy_Doc

✩✩✩✩✩✩✩
18 Мар 2020
12
0
@poty, да, 220UH, если меня конечно китайцы не нае"ли. Короче решил я что-то еще раз пропаять кт транзисторы, и сразу запустил - оно заработало! писк пропал, кз нет, замерил напряжение на кондике - 150-170, 840 мизерный нагрев, индуктивность тоже еле теплая - тоесть всё завелось, но отключил ее от розетки, перенес на другую поверхность, запускаю и ничего опять не работает - опять свист, жесткий нагрев. Решил опять прогреть ножки кт3107 и 3102, и она опять завелась, в это время успел поставить плату с лампами - не заработали(, но и свиста не появилось. Потом опять отключил и через некоторое время включил - опять все симптомы как изначально. Опять прогрел транзисторы, запустил - работает, отключил, подождал, - опять симптомы.
 

technotrasher

★★★★✩✩✩
14 Ноя 2019
501
223
@technotrasher использует обновлённые библиотеки RTC, библиотеки базового проекта могут не подходить, даже имея одинаковые имена и названия функций. Убедитесь, что используются правильные библиотеки.
А вообще - я код @technotrasher ещё досконально не разбирал, возможно он лучше знает.
А так и есть. я не зря выложил библиотеки все. с проектом. они другие. над багами работаю. и обновляю постоянно прошивку. но не пишу новые версии. просто смотрите не обновилась ли. И! главное - у меня чуть чуть другая схема. у меня две пары часов работают. и отлично сохраняют время при отключении питания. библиотека для модуля rtc у меня реально другая!!!! но никто не смотрит и не читает описание. а зачем... ща напихаем и какая то магия и все вдруг как получится.
 
  • Лойс +1
Реакции: berlingos

psyx86

★★★★✩✩✩
31 Янв 2020
383
229
Нужна помощь. Не могу правильно прописать код что бы при нажатии кнопки по очереди выводились ДАТА-(ч.ч / м.м /г.г) - ПАУЗА - ТЕМПЕРАТУРА И ВЛАЖНОСТЬ (Т.Т / ПУСТО.ПУСТО / В.В) - ПАУЗА - ДАВЛЕНИЕ (ПУСТО.ПУСТО /ПУСТО.ПУСТО /Д.Д).
Параметры вывода на индикаторы прописал, можно назначить на разные кнопки, а вот объединить их не могу.
mode == 0 - режим часов
mode == 7 - ТЕМПЕРАТУРА И ВЛАЖНОСТЬ
mode == 8 - ДАТА
mode == 13 - ДАВЛЕНИЕ
все находится в одной функции


if (btn4.isClick()) //
{ blinkflag = true; // прекращаем мигать цифрами
startTime = millis();
timeout = true; // запрещаем считывать нажатия кнопок
if (mode == 0) {
mode = 13; **** нужно добавить mode = 7 и mode = 8
v = 40; // счетчик времени после отпускания кнопки
}
}
полный код в прикрепленном файле
 

Вложения

poty

★★★★★★✩
19 Фев 2020
2,989
895
@psyx86, или я капитально Вас не понял, или Вы не поняли принцип динамической индикации., предполагающейся в этом проекте.
Код, если честно, вообще не понятен, как Вы надеетесь на помощь, если у Вас нет описаний переменных, функций (кстати, функция show вызывает сама себя, причём объявлена она без аргументов, а вызывается с аргументами)? Куда будет вставлена эта Ваша "одна функция"? Как Вы собираетесь управлять отображением?
 
  • Лойс +1
Реакции: technotrasher

psyx86

★★★★✩✩✩
31 Янв 2020
383
229
или я капитально Вас не понял, или Вы не поняли принцип динамической индикации
Принцип динамической индикации я понял.
Скетч (не мой) действительно построен очень интересно и отличается от версий Гайвера, но работает уже несколько недель, я не сильно разбираюсь в программирование, переписываю его на основании логики и аналогии с другими скетчами + изучение материалов по ардуино.
Прикладываю скетч.
 

Вложения

poty

★★★★★★✩
19 Фев 2020
2,989
895
Мой ответ был удалён, видимо, из-за обновления форума. Попытаюсь пересказать.
Фактически, для того, чтобы обеспечить последовательное отображение, достаточно ввести флаг (бинарную переменную), принимающую значение true при переключении кнопкой в режим, назовём его "витрина". Кроме того, "взводим" собственный таймер и устанавливаем mode в первое отображаемое значение. В начале функции show() проверяем флаг и истечение таймера и переключаем mode в следующее значение, снова взводим таймер и т.д. Также нужно изменить блок переключения режимов по кнопке, добавив в первую строку проверку флага.
По поводу кода: полный цикл отображения всех разрядов в одной функции - хорошее решение, но все вычисления и опросы внешних модулей полностью делаются между циклами, а не размазаны внутри. Поэтому возникают две проблемы: заметная задержка реакции на кнопку и потенциально большой перерыв между циклами. Если первая проблема не сильно критична (в конце концов это - сервисная, а не оперативная функция), то вторая проблема может приводить к изменению яркости или заметному мерцанию индикаторов. По хорошему, как я бы сделал на "большой" системе, использовать таймер на прерываниях для динамической индикации, все остальные процедуры проводить в основном цикле.
 

psyx86

★★★★✩✩✩
31 Янв 2020
383
229
Мой ответ был удалён, видимо, из-за обновления форума. Попытаюсь пересказать.
Фактически, для того, чтобы обеспечить последовательное отображение, достаточно ввести флаг (бинарную переменную), принимающую значение true при переключении кнопкой в режим, назовём его "витрина". Кроме того, "взводим" собственный таймер и устанавливаем mode в первое отображаемое значение. В начале функции show() проверяем флаг и истечение таймера и переключаем mode в следующее значение, снова взводим таймер и т.д. Также нужно изменить блок переключения режимов по кнопке, добавив в первую строку проверку флага.
По поводу кода: полный цикл отображения всех разрядов в одной функции - хорошее решение, но все вычисления и опросы внешних модулей полностью делаются между циклами, а не размазаны внутри. Поэтому возникают две проблемы: заметная задержка реакции на кнопку и потенциально большой перерыв между циклами. Если первая проблема не сильно критична (в конце концов это - сервисная, а не оперативная функция), то вторая проблема может приводить к изменению яркости или заметному мерцанию индикаторов. По хорошему, как я бы сделал на "большой" системе, использовать таймер на прерываниях для динамической индикации, все остальные процедуры проводить в основном цикле.
Видимо удалили. Но я успел прочитать, идея отличная. По поводу прошивки яркость ин-12 6шт выше чем на скетче 2 версии Гайвер, частота не заметна. Реакция нажатия на кнопки мгновенная, но если подключить библиотеку кнопок гайвера и переписать под нее, заметна медленная ответная реакция
 

poty

★★★★★★✩
19 Фев 2020
2,989
895
С кнопками - там программно реализуется уход от дребезга контактов, потому вводится некоторый интервал нечувствительности. Конечно, лучше эту функцию отдать, допустим, триггеру Шмитта, но так как пользуемся готовой аппаратной конструкцией, то приходится так или иначе от дребезга спасаться.
Яркость - скорее всего из-за того, что отсутствует интервал "выключено", который в исходном скетче уменьшает время горения примерно на 10%. Здесь есть куда стремиться по оптимизации кода, соглашусь.
 

psyx86

★★★★✩✩✩
31 Янв 2020
383
229
Здесь есть куда стремиться по оптимизации кода, соглашусь.
Единственное что не понравилось это пульсация (в близи, из дали не видно), ее причина синхронизация date, month, year (если ее закомментировать пульсация пропадает, но дата и время тоже и не сохраняется при установке в ручную, при сбросе питания)
C++:
#include <DS3231.h> //используемая библиотека
void ReadDS3231()
{
  minute = Clock.getMinute();
  hour = Clock.getHour(h12, PM);
  second = Clock.getSecond();
  date = Clock.getDate();                //наблюдается мерцание по индикаторам
  month = Clock.getMonth(Century);       //наблюдается мерцание по индикаторам
  year = Clock.getYear();                //наблюдается мерцание по индикаторам
}
Добавил от себя:
  • внутренний ШИМ для работы ламп из 2 версии;
  • пару эффектов смены цифр, тест индикаторов при включение (так же по установленному времени - ночью- можно тоже назвать прожигом высоким током - нагрузка один индикатор на высоковольтную схему-, цифры бегут медленно по порядку с переключением порядкового номера лам), Глюки, прожиг по таймеру, остальные эффекты не удается видимо из за особенности основного принципа индикации;
  • датчик bme280 - (отображение по нажатию и установленному таймеру в настройка):
    • температура=влажность;
    • давление в мм.рт.ст.
  • отображение даты (ДД.ММ.ГГ) по нажатию и установленному таймеру в настройка;
 

poty

★★★★★★✩
19 Фев 2020
2,989
895
А Вы на каких-то своих платах делали? Потому что прикрутить ШИМ к схеме v.1 можно, но не очень просто.
Применённый принцип индикации вполне пригоден для добавления эффектов, только нужно сохранять "шаг" эффекта во внешней переменной. Но Вы же сделали "глюки", значит, уже знаете этот вариант добавления эффектов. Мне сейчас не на чем проверять, но я точно уйду от такого стиля написания программ. Вместо обработки унифицированных данных - какая-то вакханалия с заплатками по всякому поводу. Например, те же эффекты можно легко сделать модифицируемыми просто заполнив "матрицу переключений" - и не изменяя ни строчки программного кода - вуаля - имеем нужный нам эффект! Может, я, конечно, не учитываю недостаток памяти в микропроцессоре для этого, но, думаю, это не так.
Отображение дополнительных данных (даты/температуры/…) я тоже хочу сделать по кнопке, а не с автоматическим перебором, как это сейчас в 1.3. Логичнее, как мне кажется. Да и режимы лучше разделить на информационные и установочные, чтобы не перебирать в основном цикле редко используемые комбинации.
Что касается считывания/сохранения даты: вот здесь мне непонятно. Во-первых, есть возможность считывания сразу всех регистров модуля реального времени за одно обращение (не уверен, что это реализовано в используемой Вами библиотеке). Во-вторых, зачем запрашивать у модуля дату (да и время тоже) по сотне раз в секунду? Ладно время, возможно Вы просто не доверяете внутренним часам микроконтроллера, но дата-то точно меняется только один раз - "когда часы 12 (ночи) бьют"! Может, в этот момент и стоит один раз заполнить переменные date, month, year (а заодно добавить первичную инициализацию этих переменных в setup) и не трогать их до следующей полночи?
 
  • Лойс +1
Реакции: technotrasher и shtrlz

psyx86

★★★★✩✩✩
31 Янв 2020
383
229
Схема взята из второй версии + добавил датчик BME280 + аналоговая клавиатура на 4 кнопки. Это тестовая плата все на разъемах и дип-панелях + переходная планка для z5660m 4 шт с неонкой , фото:
Что касается считывания/сохранения даты: вот здесь мне непонятно
это автор видимо решил так сделать, из дали не заметно поэтому пока не заморачивался.
В связи с самоизоляцией очень втянулся в изучение ардуино и проработке скетчей для часов, свободного времени то много стало да и знаний прибавляется))
 

Helpers

★✩✩✩✩✩✩
21 Мар 2019
66
17
Кстати, для тех, кто хотел повысить яркость есть две возможности:
1. Объединить отображение точки с одним из разрядов. В этом случае зажигание остальных индикаторов будет осуществляться чаще на 1/7 периода.
2. Увеличить время горения в рамках 3мс, выделенных на отображение одной цифры (имеется соответствующий параметр в секции define).
Тут я не понял, у меня шесть цифр, точек нету разделительных, прошивка допустим гайвера. Что куда мне надо припаять и что в прошивке поменять?
 

poty

★★★★★★✩
19 Фев 2020
2,989
895
@Helpers, в функции showDigits() осуществляется последовательное отображение 6 разрядов (цифровых индикаторов) и точки. Что конкретно делается управляется двумя переменными: counter и indState.
Переменная counter может принимать значение от 0 (при котором производится управление точкой, которая у Вас не запаяна) до 6 (1 - первый индикатор, 2 - второй и т.д.).
indState показывает, что нужно сделать: true - зажечь индикатор с номером counter, false - выключить индикатор с номером counter.
Так как точка у Вас не запаяна, время (равное значению REDRAW_TIME), отведённое под его зажигание (когда counter = 0), тратится понапрасну, т.е. в этот промежуток времени ничего не горит. Для Вашего случая нужно просто заменить строчку:
if (counter > 6) counter = 0;
на
if (counter > 6) counter = 1;
Этого будет достаточно.
Для тех, у кого точка запаяна и они хотят использовать этот интервал для увеличения яркости и оставить свечение точки нужно переписать этот участок следующим образом:

if (indState) {
indState = false;
redrawTimer.setInterval(on_time); // переставляем таймер, столько индикаторы будут светить
counter++;
if (counter > 6) counter = 1;
setDigit(digitsDraw[counter]); // отображаем ЦИФРУ в её ИНДИКАТОР
digitalWrite(opts[counter], 1); // включаем текущий индикатор
if (counter == 1) {
if (dotFlag && mode != 1) digitalWrite(opts[0], 1); // включаем точку
}
} else {
indState = true;
digitalWrite(opts[counter], 0); // выключаем текущий индикатор
if (counter == 1) digitalWrite(opts[0], 0); // выключаем точку
redrawTimer.setInterval(REDRAW_TIME - on_time); // переставляем таймер, столько индикаторы будут выключены
}

А вообще в коде первоначальное значение counter не определено. Я бы это сделал в секции setup(). Не люблю недомолвок.
 

Helpers

★✩✩✩✩✩✩
21 Мар 2019
66
17
@Helpers, в функции showDigits() осуществляется последовательное отображение 6 разрядов (цифровых индикаторов) и точки. Что конкретно делается управляется двумя переменными: counter и indState.
Переменная counter может принимать значение от 0 (при котором производится управление точкой, которая у Вас не запаяна) до 6 (1 - первый индикатор, 2 - второй и т.д.).
indState показывает, что нужно сделать: true - зажечь индикатор с номером counter, false - выключить индикатор с номером counter.
Так как точка у Вас не запаяна, время (равное значению REDRAW_TIME), отведённое под его зажигание (когда counter = 0), тратится понапрасну, т.е. в этот промежуток времени ничего не горит. Для Вашего случая нужно просто заменить строчку:
if (counter > 6) counter = 0;
на
if (counter > 6) counter = 1;
Этого будет достаточно.
Для тех, у кого точка запаяна и они хотят использовать этот интервал для увеличения яркости и оставить свечение точки нужно переписать этот участок следующим образом:

if (indState) {
indState = false;
redrawTimer.setInterval(on_time); // переставляем таймер, столько индикаторы будут светить
counter++;
if (counter > 6) counter = 1;
setDigit(digitsDraw[counter]); // отображаем ЦИФРУ в её ИНДИКАТОР
digitalWrite(opts[counter], 1); // включаем текущий индикатор
if (counter == 1) {
if (dotFlag && mode != 1) digitalWrite(opts[0], 1); // включаем точку
}
} else {
indState = true;
digitalWrite(opts[counter], 0); // выключаем текущий индикатор
if (counter == 1) digitalWrite(opts[0], 0); // выключаем точку
redrawTimer.setInterval(REDRAW_TIME - on_time); // переставляем таймер, столько индикаторы будут выключены
}

А вообще в коде первоначальное значение counter не определено. Я бы это сделал в секции setup(). Не люблю недомолвок.
Благодарю! Попробую сделать.