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

Часы на ГРИ v2. Обсуждение проекта
Вот, потихоньку делаю корпус на ГРИ) Нужно ли дальше запихивать лампы? Или наоборот сильно глубоко?) Определится не могу)
 

Вложения

Комментарии

poty

★★★★★★✩
19 Фев 2020
2,990
895
@Dimasssiusis, вопросов было гораздо больше. Ну, если измерения произведены правильно, то проблема в дросселе.
Я так и не понял - Вы применяете резистор в анодной цепи и какой?
 

Kashper

✩✩✩✩✩✩✩
12 Янв 2021
4
0
SN74141N можно использовать. Если можно нужно чтото переделовать
 

psyx86

★★★★✩✩✩
31 Янв 2020
384
229
@Dimasssiusis, у тех, кто давно в теме - тестер давно уже есть, а для собрать часы один раз он совсем не нужен... Я собрал себе универсальный тестер с функцией прожарки ламп по одному из доступных в интернете вариантов. Из элементов только микроконтроллер, конденсатор, катушка, 13 транзисторов, диод и горсть резисторов. Питание от USB, жарит/проверяет любые лампы.
Посмотреть вложение 22290Посмотреть вложение 22291
Для универсальности сейчас подключена колодка, у которой на другом конце просто контакты от разъема питания - одеваются на любые ножки. Для эстетов можно сделать переходник под любой патрон.
Собрал свой тестер на ардуино со сменными панелями под разные лампы (пока изготовил под имеющиеся ИН-12, ИН-4, ИН-2).
Платы специально изготовил односторонние методом гравировки.
Режимы работы:
-скорость смены цифр с индикацией (светодиод):1000мс, 500мс, 200мс;
-таймер работы:2ч, 4ч, 12ч (пока не удалось реализовать, хотел использовать функцию сон, но кнопки аналоговые подключены к пин А7);
-режим ручного переключения цифр ++/--;
- переключатель на повышенное напряжение (прожиг, лечение отравления).
Скетч прикрепил , не ругайтесь - это первый опыт по написанию. Готов к критике и помощи в его доработки
 

Вложения

psyx86

★★★★✩✩✩
31 Янв 2020
384
229
@psyx86, Бутерброд из 3-х плат выглядит люто... Но главное, чтобы работало! :)
Неее, там пирамидка маленькая))) Общий дизайн мне не очень пока нравится, со временем переделаю на smd.
размер нижней платы 52*42мм. Что удобно так это Высоковольтная часть съемная, при отладки прошивки было удобно.
 

-=SaNcHeZ=-

✩✩✩✩✩✩✩
6 Янв 2020
14
3
Всем привет!
Доработал немного оригинальную прошивку для часов!

Что нового:

ver 2.6
  • Исправлены все предыдущие баги оригинальной прошивки.
  • Добавлен режим автосмены эффекта вместо 0-го(без эффекта).
  • Добавлен будильник с 4-мя режимами работы(однократный, каждый день, по будням и по дням недели).
  • Добавлен календарь.
  • Добавлена настройка времени день/ночь с кнопок.
  • Добавлена настройка скорости 1-го эффекта день/ночь.
  • Добавлена возможность выбора активного/пассивного бузера будильника.
ver 2.6.1
  • Добавлена возможность выбора активного/пассивного бузера будильника.

Управление:

Настройка времени: Удерживать "среднюю" кнопку
  • Левая кнопка - выбор, остальные "меньше" и "больше"
  • Клик по "выбору" - смена настройки часы/минуты | месяц/дата
  • Клик "меньше" или "больше" - изменение времени
  • Удержать "больше" - переход к настройке месяца/даты
  • Удержать "меньше" - переход к настройке года
  • Удержать "выбор" - возврат к режиму часов

Настройка будильника: Удерживать "левую" кнопку
  • Левая кнопка - выбор, остальные "меньше" и "больше"
  • Клик по "выбору" - смена настройки часы/минуты | режим будильника/день недели
  • Клик "меньше" или "больше" - изменение времени/режима
  • Удержать "меньше" или "больше" - переход к настройке режима/времени
  • В 4м режиме будильника клик "меньше" или "больше" - изменение дня недели/включения 1 или отключения 0 будильника
  • Удержать "выбор" - возврат к режиму часов

Режимы будильника:
  • 00 - выключен
  • 01 - однократный
  • 02 - каждый день
  • 03 - по будням
  • 04 - выбор по дням недели

Настройка ночной подсветки: Удерживать "правую" кнопку
  • Левая кнопка - выбор, остальные "меньше" и "больше"
  • Клик по "выбору" - смена настройки час перехода в ночной режим/час перехода в дневной режим
  • Клик "меньше" или "больше" - изменение времени
  • Удержать "выбор" - возврат к режиму часов

Управление эффектами В РЕЖИМЕ ЧАСОВ:

Клик по "левой" кнопке переключает режимы подсветки ламп
  • Отключена - 0
  • Постоянное свечение - 1
  • Дыхание - 2
Клик по "средней" кнопке включает - 1 и выключает - 0 режим "глюков"

Клик по "правой" кнопке переключает режимы перелистывания цифр
  • Автоматическая смена эффектов - 0
  • Плавное угасание - 1
  • Перемотка по порядку числа - 2
  • Перемотка по катодам - 3
  • Поезд - 4
  • Резинка - 5

Прошивку можно скачать в этом посте.
Установил версию прошивки 2.6.1, огромная благодарность автору, намного интереснее версии 2.5.
Но обнаружил несколько проблем:
1. Проблема с подсветкой.
Суть: часы работают с подсветкой в режиме "1" (постоянное свечение). После отключения питания часов, при повторном включении подсветка не работает. Нажимая на левую кнопку, подсветка переходит в режим "2". Т.е. часы стоят в режиме подсветки "1", но фактически она не работает, пока не проклацаешь левую кнопку по кругу на режим "1". На версии прошивки 2.5 такой проблемы нет.

2. Проблема с яркостью в ночном режиме.
В программе установлены следующие параметры:
// ======================= ЯРКОСТЬ =======================
uint8_t NIGHT_START = 22; // час перехода на ночную подсветку (BRIGHT_N)
uint8_t NIGHT_END = 7; // час перехода на дневную подсветку (BRIGHT)

#define INDI_BRIGHT 23 // яркость цифр дневная (1 - 24) !на 24 могут быть фантомные цифры!
#define INDI_BRIGHT_N 1 // яркость цифр ночная (1 - 24)

#define DOT_BRIGHT 100 // яркость точки дневная (1 - 255)
#define DOT_BRIGHT_N 44 // яркость точки ночная (1 - 255)

#define BACKL_BRIGHT 255 // макс. яркость подсветки ламп дневная (0 - 255)
#define BACKL_BRIGHT_N 5 // макс. яркость подсветки ламп ночная (0 - 255, 0 - подсветка выключена)
#define BACKL_MIN_BRIGHT 20 // мин. яркость подсветки ламп в режиме дыхание (0 - 255)
#define BACKL_PAUSE 200 // пазуа "темноты" между вспышками подсветки ламп в режиме дыхание, мс

Но с наступлением 22-00 яркость цифр не меняется, яркость подсветки лам так же не изменяется, и остается прежней.

Кто-то с таким сталкивался и может подсказать что делать? Очень нравится версия 2.6.1, но вот такие мелочи огорчают :-(
 
Изменено:

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
@Dimasssiusis, вопросов было гораздо больше. Ну, если измерения произведены правильно, то проблема в дросселе.
Я так и не понял - Вы применяете резистор в анодной цепи и какой?
Да, понимаю, просто времени нет заняться тестером, что успел сделать - так и отписался, вот схема моей штуковины:
1613237859999.png
Резисторы подобраны "на глаз", предполагалось позже подобрать лучше в реальных условиях
 

poty

★★★★★★✩
19 Фев 2020
2,990
895
@Dimasssiusis, какие-нибудь конденсаторы байпаса стоят? В частности, перед DC-DC конвертором со стороны 5В.
Сопротивление в анодной цепи в 10кОм, по моим расчётам, даёт примерно 7мА ток. Импульсов у Вас нет, фактически Вы прожигаете лампу постоянным напряжением. Думаю, что просто не хватает тока. С сопротивлениями меньше номиналом, думаю, просадка будет значительно выше. Но Вы утверждали, что у Вас и в холостом ходу 160. Попробуйте байпас на вход DC/DC поставить.
 

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
@Dimasssiusis, какие-нибудь конденсаторы байпаса стоят? В частности, перед DC-DC конвертором со стороны 5В.
Сопротивление в анодной цепи в 10кОм, по моим расчётам, даёт примерно 7мА ток. Импульсов у Вас нет, фактически Вы прожигаете лампу постоянным напряжением. Думаю, что просто не хватает тока. С сопротивлениями меньше номиналом, думаю, просадка будет значительно выше. Но Вы утверждали, что у Вас и в холостом ходу 160. Попробуйте байпас на вход DC/DC поставить.
Извиняюсь, схему дал не полную, не все влезло, вот нормальная:
1613254867415.png

На всякий случай все слои платы:
1613254932217.png 1613254960615.png 1613254993038.png 1613255011516.png

Байпас - это нужно линию на вход транзистора в обход резистора пустить?
Или конденсатор по питанию с ЮСБ убрать?
Я да, не очень разбираюсь в схемотехнике
 

alexmat

✩✩✩✩✩✩✩
14 Фев 2021
1
0
Подскажите, пожалуйста. Собрал часы на ин-12 на плате Гайвера. 3-я лампа при нормальном режиме работы горит тускло, иногда моргает, иногда неполностью цифра загорается. В режиме проверки ламп на максимальной яркости все в норме, лампа горит отлично. Соплей, флюса нигде нет.

Также при изменении настроек яркости на максимум в прошивке часов, лампа вообще не загорается. При понижении до 12-13 загорается и работает нормально.

В чем может быть проблема?
 

poty

★★★★★★✩
19 Фев 2020
2,990
895
Шикарно живёте, для такого проекта - 4-х слойную плату!
Уточню, сейчас разбираю режим холостого хода и Ваше утверждение, что в нём, независимо от установленной скважности - постоянно 160В на конденсаторе 4,7 мкФ 400В.
1. Надеюсь, все измерения проводились с полностью выкрученным на 500кОм потенциометром и отключённой нагрузкой любого типа.
2. Хотелось бы увидеть скетч, который использовался для управления скважностью ШИМ. Если не здесь, то хотя бы в личку.
3. Измерьте напряжение на затворе IRF840, оно должно меняться при изменении скважности ШИМ.
4. По возможности, измерьте входной ток через разъём питания и напряжение на входе (5В).
5. Конденсатор C3 нужно увеличить значительно, до 1000мкФ, возможно ещё больше. Думайте об этом как о преобразовании напряжений. Пропорционально напряжению возрастает и запасаемая энергия. У Вас напряжение возрастает в 180/5=36 раз, как минимум во столько же должен быть больше входной конденсатор (5*36=180мкФ). Аналогично, с током: ток в 7мА на входе превращается в 250мА и даже это - не полная картина. При duty=160 ток передаётся только 60% времени, и КПД преобразования вряд ли дотягивает до 80%. Т.о. амплитуда тока на входе будет 250/(0,6*0,8)=500мА (выдерживает ли сердечник Вашего дросселя такой ток?). Провод к USB разъёму, очевидно, длинный, при таких токах возможны просадки напряжения на импульсах, поэтому конденсатор там жизненно необходим. Вопрос, почему это происходит на холостом ходу, когда токи должны составлять раз в 20 меньшую величину - как раз и является исследуемой проблемой.
 

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
Шикарно живёте, для такого проекта - 4-х слойную плату!
Уточню, сейчас разбираю режим холостого хода и Ваше утверждение, что в нём, независимо от установленной скважности - постоянно 160В на конденсаторе 4,7 мкФ 400В.
1. Надеюсь, все измерения проводились с полностью выкрученным на 500кОм потенциометром и отключённой нагрузкой любого типа.
2. Хотелось бы увидеть скетч, который использовался для управления скважностью ШИМ. Если не здесь, то хотя бы в личку.
3. Измерьте напряжение на затворе IRF840, оно должно меняться при изменении скважности ШИМ.
4. По возможности, измерьте входной ток через разъём питания и напряжение на входе (5В).
5. Конденсатор C3 нужно увеличить значительно, до 1000мкФ, возможно ещё больше. Думайте об этом как о преобразовании напряжений. Пропорционально напряжению возрастает и запасаемая энергия. У Вас напряжение возрастает в 180/5=36 раз, как минимум во столько же должен быть больше входной конденсатор (5*36=180мкФ). Аналогично, с током: ток в 7мА на входе превращается в 250мА и даже это - не полная картина. При duty=160 ток передаётся только 60% времени, и КПД преобразования вряд ли дотягивает до 80%. Т.о. амплитуда тока на входе будет 250/(0,6*0,8)=500мА (выдерживает ли сердечник Вашего дросселя такой ток?). Провод к USB разъёму, очевидно, длинный, при таких токах возможны просадки напряжения на импульсах, поэтому конденсатор там жизненно необходим. Вопрос, почему это происходит на холостом ходу, когда токи должны составлять раз в 20 меньшую величину - как раз и является исследуемой проблемой.
Черырехслойная? Она двухслойная 😅 И размеры 100*100, чтобы плата была 2$, Вы, просто, не так подумали))
Красный цвет - верхний слой, синий цвет - нижний

Там просто два слоя одновременно, на последних фото, без отображения заливки землей, чтобы все дорожки было видно

1) Да, потенциометр выкручен в ноль, замерял без нагрузки (ничего не подключал)
2) Скетч уже скидывал, прикрепляю еще раз:


Тестовая прошивка:
// "минимальный" код для работы часов, можете начать с него разработку своей прошивки
// проверочный код для индикаторов, выводит 0-9 по очереди на каждую лампу

#define DELAY 500000    // задержка между сменой цифр, мс
#define DUTY 200      // скважность ШИМ. От скважности зависит напряжение! у меня 175 вольт при значении 180 и 145 вольт при 120

#define BOARD_TYPE 0

// пины
#define KEY0 8    // часы
#define BTN1 3    // кнопка 1
#define BTN2 4    // кнопка 2
#define BTN3 5   // кнопка 3
#define GEN 6     // генератор
//#define BACKL 11  // подсветка


#define DECODER0 A0
#define DECODER1 A1
#define DECODER2 A2
#define DECODER3 A3

// распиновка ламп
#if (BOARD_TYPE == 0)
byte digitMask[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // маска дешифратора платы in12_turned (цифры нормальные)
byte opts[] = {KEY0};            // порядок индикаторов слева направо
#endif

#include "GyverHacks.h"

void setDig(byte digit) {
  digit = digitMask[digit];
  setPin(DECODER3, bitRead(digit, 0));
  setPin(DECODER1, bitRead(digit, 1));
  setPin(DECODER0, bitRead(digit, 2));
  setPin(DECODER2, bitRead(digit, 3));
}

void setup() {
  Serial.begin(9600);

  // настройка пинов на выход
  pinMode(DECODER0, OUTPUT);
  pinMode(DECODER1, OUTPUT);
  pinMode(DECODER2, OUTPUT);
  pinMode(DECODER3, OUTPUT);
  pinMode(KEY0, OUTPUT);
  pinMode(GEN, OUTPUT);
  //  pinMode(BACKL, OUTPUT);

  // задаем частоту ШИМ на 5 и 6 выводах 31 кГц
  TCCR0B = TCCR0B & 0b11111000 | 1;        // ставим делитель 1

  // включаем ШИМ, от скважности зависит напряжение! у 175 вольт при значении 180 и 145 вольт при 120
  setPWM(6, DUTY);
  //  setPWM(BACKL, 1);   // шим на светодиоды подсветки

  /*
    // перенастраиваем частоту ШИМ на пинах 3 и 11 на 7.8 кГц и разрешаем прерывания по совпадению
    TCCR2B = (TCCR2B & B11111000) | 2;    // делитель 8
    TCCR2A |= (1 << WGM21);   // включить CTC режим для COMPA
    TIMSK2 |= (1 << OCIE2A);  // включить прерывания по совпадению COMPA
  */
}

void loop() {
  while (true) {
    for (int i = 0; i < 10; i++) {
      setPin(opts[0], 1);           // тупо перебираем числа от 0 до 1
      setDig(i);
      delay(DELAY);
    }
  }
}
3) Сейчас замерю напряжение на транзисторе
4) Конденсатор заменю завтра, нужно его добыть

Сейчас попробую разные комбинации проводов и БП, отпишусь

UPD: Поставил дроссель массивнее, подключил провод короткий к мощному PowerBank и теперь на конденсаторе 10uf 400v напряжение при нагрузке колеблется 138-141 вольт

При скважности 160 на транзисторе 1.5 вольт, при скважности в 200 на транзисторе 0,8- 0,9 вольт (если я то, что нужно, замеряю)
 
Изменено:

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
Подскажите, пожалуйста. Собрал часы на ин-12 на плате Гайвера. 3-я лампа при нормальном режиме работы горит тускло, иногда моргает, иногда неполностью цифра загорается. В режиме проверки ламп на максимальной яркости все в норме, лампа горит отлично. Соплей, флюса нигде нет.

Также при изменении настроек яркости на максимум в прошивке часов, лампа вообще не загорается. При понижении до 12-13 загорается и работает нормально.

В чем может быть проблема?
Похоже, что лампа полуживая, случайно не розовым цветом горит?
Бывает такое, что при прямой подаче напряжения светится нормально, а вот при динамической индикации лампа отказывается работать корректно
Ее либо менять, либо пробовать восстанавливать
 

poty

★★★★★★✩
19 Фев 2020
2,990
895
Черырехслойная? Она двухслойная 😅
Красный цвет - верхний слой, синий цвет - нижний
Согласен, лопухнулся. Посчитал 4 картинки, как 4 разных слоя. :)

На схеме затвор подключен к D7, на плате и в скетче - на D6. Предполагаю, что вывод 6 - верный.
здесь лишний.
Чтобы реально проверять оптрон нужно его хотя бы иногда выключать. Предлагаю переписать код loop следующим образом:
Код loop:
#define    SHOWTIME    5
#define PAUSETIME    1
void loop() {
    static unsigned long mytime = millis();
    static unsigned long showtime = millis();
    static byte cathode = 0;
    static boolean on_off = false;
    
    if (mytime-millis() >= DELAY) {
        setPin(opts[0], 0);
        showtime = mytime = millis();
        if (++cathode > 10) cathode = 0;
        setDig(cathode);
        on_off = false;
    } else if (showtime-millis() >= (on_off ? SHOWTIME : PAUSETIME)) {
        on_off ^= 1;
        showtime = millis();
        setPin(opts[0], on_off ? 1 : 0)
    }
}
При скважности 160 на транзисторе 1.5 вольт, при скважности в 200 на транзисторе 0,8- 0,9 вольт (если я то, что нужно, замеряю)
ни то, ни другое напряжения не соответствуют тому, что должно быть. Вам нужно померить напряжение между выводом D6 и землёй. Впрочем, тут и мультиметр может врать безбожно, если он совсем простой.
 

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
На схеме затвор подключен к D7, на плате и в скетче - на D6. Предполагаю, что вывод 6 - верный.
Да, при разводке ошибся, D7 не поддерживает ШИМ

Хм, скетч компилится, прошивается, но ничего не происходит:


Тестовая прошивка:
#define DELAY 10000    // задержка между сменой цифр, мс
#define DUTY 200      // скважность ШИМ. От скважности зависит напряжение! у меня 175 вольт при значении 180 и 145 вольт при 120

#define BOARD_TYPE  0
#define SHOWTIME    5
#define PAUSETIME   1

// пины
#define KEY0 8      // часы
#define BTN1 3      // кнопка 1
#define BTN2 4      // кнопка 2
#define BTN3 5      // кнопка 3
#define GEN 6       // генератор
//#define BACKL 11  // подсветка


#define DECODER0 A0
#define DECODER1 A1
#define DECODER2 A2
#define DECODER3 A3

// распиновка ламп
#if (BOARD_TYPE == 0)
byte digitMask[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};    // маска дешифратора платы in12_turned (цифры нормальные)
byte opts[] = {KEY0};                                 // порядок индикаторов слева направо
#endif

#include "GyverHacks.h"

void setDig(byte digit) {
  digit = digitMask[digit];
  setPin(DECODER3, bitRead(digit, 0));
  setPin(DECODER1, bitRead(digit, 1));
  setPin(DECODER0, bitRead(digit, 2));
  setPin(DECODER2, bitRead(digit, 3));
}

void setup() {
  Serial.begin(9600);

  // настройка пинов на выход
  pinMode(DECODER0, OUTPUT);
  pinMode(DECODER1, OUTPUT);
  pinMode(DECODER2, OUTPUT);
  pinMode(DECODER3, OUTPUT);
  pinMode(KEY0, OUTPUT);
  pinMode(GEN, OUTPUT);

  // задаем частоту ШИМ на 5 и 6 выводах 31 кГц
  TCCR0B = TCCR0B & 0b11111000 | 1;        // ставим делитель 1

  setPWM(6, DUTY);   // включаем ШИМ, от скважности зависит напряжение! у 175 вольт при значении 180 и 145 вольт при 120

}

void loop() {
    static unsigned long mytime = millis();
    static unsigned long showtime = millis();
    static byte cathode = 0;
    static boolean on_off = false;

    if (mytime-millis() >= DELAY) {
        setPin(opts[0], 0);
        showtime = mytime = millis();
        if (++cathode > 10) cathode = 0;
        setDig(cathode);
        on_off = false;
    } else if (showtime-millis() >= (on_off ? SHOWTIME : PAUSETIME)) {
        on_off ^= 1;
        showtime = millis();
        setPin(opts[0], on_off ? 1 : 0);
    }
}
Но напряжение 170вна конденсаторе имеется, видимо скетч чуть не верный

Между D6 и землей сейчас посмотрю напряжение

UPD: Мой мультиметр показывает напряжение в 4 вольта ровно (между D6 и землей) на DUTY 200
И 3,19 при DUTY 160

Замерял на Вашей подправленной прошивке
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
2,990
895
Мой мультиметр показывает напряжение в 4 вольта ровно (между D6 и землей) на DUTY 200
И 3,19 при DUTY 160
Ну, это уже близко. (5*200/255=3,9; 5*160/255=3,1).
ничего не происходит
попробуйте переместить
C++:
    static unsigned long mytime = millis();
    static unsigned long showtime = millis();
    static byte cathode = 0;
    static boolean on_off = false;
без слов static перед надписью "распиновка ламп" в глобальной области.
 
  • Лойс +1
Реакции: Dimasssiusis

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
Ну, это уже близко. (5*200/255=3,9; 5*160/255=3,1).

попробуйте переместить
C++:
    static unsigned long mytime = millis();
    static unsigned long showtime = millis();
    static byte cathode = 0;
    static boolean on_off = false;
без слов static перед надписью "распиновка ламп" в глобальной области.
Ничего не поменялось((
:unsure:

Тестовая прошивка:
#define DELAY 10000    // задержка между сменой цифр, мс
#define DUTY 160      // скважность ШИМ. От скважности зависит напряжение! у меня 175 вольт при значении 180 и 145 вольт при 120

#define BOARD_TYPE  0
#define SHOWTIME    5
#define PAUSETIME   1

// пины
#define KEY0 8      // часы
#define BTN1 3      // кнопка 1
#define BTN2 4      // кнопка 2
#define BTN3 5      // кнопка 3
#define GEN 6       // генератор

#define DECODER0 A0
#define DECODER1 A1
#define DECODER2 A2
#define DECODER3 A3

unsigned long mytime = millis();
unsigned long showtime = millis();
byte cathode = 0;
boolean on_off = false;

// распиновка ламп
#if (BOARD_TYPE == 0)
byte digitMask[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};    // маска дешифратора платы in12_turned (цифры нормальные)
byte opts[] = {KEY0};                                 // порядок индикаторов слева направо
#endif

#include "GyverHacks.h"

void setDig(byte digit) {
  digit = digitMask[digit];
  setPin(DECODER3, bitRead(digit, 0));
  setPin(DECODER1, bitRead(digit, 1));
  setPin(DECODER0, bitRead(digit, 2));
  setPin(DECODER2, bitRead(digit, 3));
}

void setup() {
  Serial.begin(9600);

  // настройка пинов на выход
  pinMode(DECODER0, OUTPUT);
  pinMode(DECODER1, OUTPUT);
  pinMode(DECODER2, OUTPUT);
  pinMode(DECODER3, OUTPUT);
  pinMode(KEY0, OUTPUT);
  pinMode(GEN, OUTPUT);

  // задаем частоту ШИМ на 5 и 6 выводах 31 кГц
  TCCR0B = TCCR0B & 0b11111000 | 1;        // ставим делитель 1

  setPWM(6, DUTY);   // включаем ШИМ, от скважности зависит напряжение! у 175 вольт при значении 180 и 145 вольт при 120
}

void loop() {
  if (mytime - millis() >= DELAY) {
    setPin(opts[0], 0);
    showtime = mytime = millis();
    if (++cathode > 10) cathode = 0;
    setDig(cathode);
    on_off = false;
  } else if (showtime - millis() >= (on_off ? SHOWTIME : PAUSETIME)) {
    on_off ^= 1;
    showtime = millis();
    setPin(opts[0], on_off ? 1 : 0);
  }
}
Для интереса попробовал другую оптопару - ничего
 

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
Понял. Поставьте
setDig(cathode);
в setup после setPWM и на всякий случай замените
on_off ^= 1;
на
on_off = !on_off;
Да, заработало теперь)) Только катоды не перебирает 😅


Тестовая прошивка:
#define DELAY 1000    // задержка между сменой цифр, мс
#define DUTY 200      // скважность ШИМ. От скважности зависит напряжение! у меня 175 вольт при значении 180 и 145 вольт при 120

#define BOARD_TYPE  0
#define SHOWTIME    1
#define PAUSETIME   1

// пины
#define KEY0 8      // часы
#define BTN1 3      // кнопка 1
#define BTN2 4      // кнопка 2
#define BTN3 5      // кнопка 3
#define GEN 6       // генератор

#define DECODER0 A0
#define DECODER1 A1
#define DECODER2 A2
#define DECODER3 A3

unsigned long mytime = millis();
unsigned long showtime = millis();
byte cathode = 0;
boolean on_off = false;

// распиновка ламп
#if (BOARD_TYPE == 0)
byte digitMask[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};    // маска дешифратора платы in12_turned (цифры нормальные)
byte opts[] = {KEY0};                                 // порядок индикаторов слева направо
#endif

#include "GyverHacks.h"

void setDig(byte digit) {
  digit = digitMask[digit];
  setPin(DECODER3, bitRead(digit, 0));
  setPin(DECODER1, bitRead(digit, 1));
  setPin(DECODER0, bitRead(digit, 2));
  setPin(DECODER2, bitRead(digit, 3));
}

void setup() {
  Serial.begin(9600);

  // настройка пинов на выход
  pinMode(DECODER0, OUTPUT);
  pinMode(DECODER1, OUTPUT);
  pinMode(DECODER2, OUTPUT);
  pinMode(DECODER3, OUTPUT);
  pinMode(KEY0, OUTPUT);
  pinMode(GEN, OUTPUT);

  // задаем частоту ШИМ на 5 и 6 выводах 31 кГц
  TCCR0B = TCCR0B & 0b11111000 | 1;        // ставим делитель 1

  setPWM(6, DUTY);   // включаем ШИМ, от скважности зависит напряжение! у 175 вольт при значении 180 и 145 вольт при 120
  setDig(cathode);
}

void loop() {
  if (mytime - millis() >= DELAY) {
    setPin(opts[0], 0);
    showtime = mytime = millis();
    if (++cathode > 10) cathode = 0;
    on_off = false;
  } else if (showtime - millis() >= (on_off ? SHOWTIME : PAUSETIME)) {
    on_off = !on_off;
    showtime = millis();
    setPin(opts[0], on_off ? 1 : 0);
  }
}
 

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
Её не переносить надо было, а скопировать.
Если ее добавить, то перестает работать:


Тестовая прошивка:
void loop() {
  if (mytime - millis() >= DELAY) {
    setPin(opts[0], 0);
    showtime = mytime = millis();
    if (++cathode > 10) cathode = 0;
    setDig(cathode);
    on_off = false;
  } else if (showtime - millis() >= (on_off ? SHOWTIME : PAUSETIME)) {
    on_off = !on_off;
    showtime = millis();
    setPin(opts[0], on_off ? 1 : 0);
  }
}
 

poty

★★★★★★✩
19 Фев 2020
2,990
895
Что-то, значит, сделали не так. Предлагаю перенести этот марафон в личную переписку, вряд ли это здесь кому-то интересно.
 
  • Лойс +1
Реакции: druna20031

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
Что-то, значит, сделали не так.
Следовал Вашим инструкциям:


Тестовая прошивка:
#define DELAY 1000    // задержка между сменой цифр, мс
#define DUTY 160      // скважность ШИМ. От скважности зависит напряжение! у меня 175 вольт при значении 180 и 145 вольт при 120

#define BOARD_TYPE  0
#define SHOWTIME    1
#define PAUSETIME   1

// пины
#define KEY0 8      // часы
#define BTN1 3      // кнопка 1
#define BTN2 4      // кнопка 2
#define BTN3 5      // кнопка 3
#define GEN 6       // генератор

#define DECODER0 A0
#define DECODER1 A1
#define DECODER2 A2
#define DECODER3 A3

unsigned long mytime = millis();
unsigned long showtime = millis();
byte cathode = 0;
boolean on_off = false;

// распиновка ламп
#if (BOARD_TYPE == 0)
byte digitMask[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};    // маска дешифратора платы in12_turned (цифры нормальные)
byte opts[] = {KEY0};                                 // порядок индикаторов слева направо
#endif

#include "GyverHacks.h"

void setDig(byte digit) {
  digit = digitMask[digit];
  setPin(DECODER3, bitRead(digit, 0));
  setPin(DECODER1, bitRead(digit, 1));
  setPin(DECODER0, bitRead(digit, 2));
  setPin(DECODER2, bitRead(digit, 3));
}

void setup() {
  Serial.begin(9600);

  // настройка пинов на выход
  pinMode(DECODER0, OUTPUT);
  pinMode(DECODER1, OUTPUT);
  pinMode(DECODER2, OUTPUT);
  pinMode(DECODER3, OUTPUT);
  pinMode(KEY0, OUTPUT);
  pinMode(GEN, OUTPUT);

  // задаем частоту ШИМ на 5 и 6 выводах 31 кГц
  TCCR0B = TCCR0B & 0b11111000 | 1;        // ставим делитель 1

  setPWM(6, DUTY);   // включаем ШИМ, от скважности зависит напряжение! у 175 вольт при значении 180 и 145 вольт при 120
  setDig(cathode);
}

void loop() {
  if (mytime - millis() >= DELAY) {
    setPin(opts[0], 0);
    showtime = mytime = millis();
    if (++cathode > 10) cathode = 0;
    setDig(cathode);
    on_off = false;
  } else if (showtime - millis() >= (on_off ? SHOWTIME : PAUSETIME)) {
    on_off = !on_off;
    showtime = millis();
    setPin(opts[0], on_off ? 1 : 0);
  }
}