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

poty

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

Kashper

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

psyx86

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

Вложения

psyx86

★★★★✩✩✩
31 Янв 2020
420
238
@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
3,257
949
@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
3,257
949
Шикарно живёте, для такого проекта - 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
3,257
949
Черырехслойная? Она двухслойная 😅
Красный цвет - верхний слой, синий цвет - нижний
Согласен, лопухнулся. Посчитал 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
3,257
949
Мой мультиметр показывает напряжение в 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
3,257
949
Что-то, значит, сделали не так. Предлагаю перенести этот марафон в личную переписку, вряд ли это здесь кому-то интересно.
 
  • Лойс +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);
  }
}