Digispark в коробочке


Окончание предыдущего обзора
Если Вам вдруг понадобилось быстренько собрать что-то простое, автономное и более-менее прилично выглядящее — вот вариант, как это можно реализовать.

В итоге, сделал устройство автоматики — генератор импульсов с регулируемой амплитудой и длительностью. Мне он на работе помогает автономно проводить проверку и чистку электромагнитных клапанов и реле с рабочим напряжением 5-28В и потребляемой мощностью до 4Вт.

Конечно, проще было собрать генератор на базе аппаратного таймера NE555 и подстроечниками выставлять необходимые параметры импульсов, но я потихоньку осваиваю Arduino и решил попробовать сделать устройство на базе контроллера. Был выбран один из самых маленьких неоригинальных контроллеров Digispark, совместимый с Arduino, возможностей которого более чем достаточно для выполнения простейших функций. Подробнее об этом и других контроллерах я постараюсь рассказать в отдельном обзоре.

Преобразователь повербанка использован без каких либо переделок.
Повышающий преобразователь из этого обзора с небольшими доработками, обозначенные на схеме красным.

Конденсатор снижает пульсации на выходе, а перемычка на подстроечнике позволяет значительно повысить плавность регулировки напряжения в области рабочих значений.

На контроллере был отключён красный светодиод по питанию, т.к. он давал паразитную засветку индикатора контроля выхода.

В качестве выхода использован порт P1, т.к. к нему уже подключен индикатор для контроля режима работы.
В качестве входа с кнопки использован порт P3, т.к. он имеет нормальную внешнюю подтяжку 1кОм.
Внутренняя подтяжка входа Reset контроллера весьма слабая (50кОм), что вызывает ложный сброс контроллера в условиях сильных помех. Пришлось его заблокировать, принудительно подав +5В.


Итоговая схема подключения всех модулей

В качестве ключа можно использовать любые N-канальные полевики с максимальным напряжением 55-100В и током более 10А, например
HUFA75307D (55V 15A 0,09Ohm)
IRLU024NP (55V 17A 0,065Ohm)
IRFU3910P (100V 16A 0,115Ohm)

Резисторы по выходному питанию необходимы для ограничения импульсного разрядного тока через ключевой элемент на безопасном уровне при кратковременном замыкании выхода.
Диод на выходе гасит ЭДС самоиндукции подключённых катушек, что предотвращает пробой ключевого элемента.

В начале, повышающий преобразователь пытался запитать непосредственно от аккумулятора 3,7В и ничего из этого не вышло, т.к он не смог вытянуть требуемые 24В. Это связано с ограничением MT3608 в 90% Maximum Duty Cycle. Поэтому пришлось использовать двойное преобразование напряжения 3,7В > 5В > 24В
Т.к. на холостом ходу преобразователь и контроллер потребляют относительно небольшой ток, пришлось подключить дополнительную нагрузку в виде резистора 200 Ом, чтобы преобразователь не отключался самостоятельно без нагрузки.

Конструкция
Перемычки корпуса при необходимости подрезаются в нужных местах

Тактовую кнопку и обе платы приклеил к корпусу холодной сваркой Poxipol


Настройка выходного напряжения производится отвёрткой рядом с тактовой кнопкой


Для программирования контроллера, пропилил отверстие для гнезда microUSB Digispark



Силовой ключ и диод удобнее всего оказалось разместить прямо на выходном разъёме навесным монтажом.


Весь монтаж выполнен пайкой проводом МГТФ, разъёмы намеренно не использовались.
Готовый монтаж



Чтобы мигающий красный светодиод было лучше видно, напротив него на крышке приклеил подходящую белую трубку в качестве световода. Для синего светодиода световод установлен штатно.

Красный индикатор видно слабовато, т.к. крышка плохо пропускает свет.

В собранном виде





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



Диаграммы выходных сигналов во всех режимах работы.


Для программирования использовал IDE Arduino 1.6.5
К сожалению, С++ практически не знаю, поэтому в программе использовал только простейшие функции, не используя библиотеки, подпрограммы и макросы. Функция «delay» используется только для обработки нажатия кнопки и не вносит искажений в рабочие временные циклы.
Короткое нажатие тактовой кнопки переключает режимы работы по кольцу (всего их 6), длительное нажатие устанавливает 1 режим работы. При желании, программу можно переделать под нужные требования, комментариев там достаточно.
Можно попробовать добавить сохранение режима после отключения питания, программирование выдержек времени прямо с кнопки и многое другое.
Если программисты найдут в текущей версии косяки — не стесняйтесь поправить :)

Скетч (программа)

// Генератор импульсов, ksiman © //

int flag = 0; //объявление переменных и их тип
int mode = 1;
unsigned long time1 = 0;
unsigned long time2 = 0;

void setup()
{
  pinMode(3, INPUT); //настройка входа
  pinMode(1, OUTPUT); //настройка выхода
}

void loop()
{
  if (digitalRead(3) == LOW && flag == 0) //проверка нажатой кнопки и флага
  {
    delay(500); //задержка для контроля удержания кнопки 500мс
    mode++; //следующий режим работы
    flag = 1; //установка флага

    if (digitalRead(3) == LOW) //кнопка всё ещё нажата?
    {
      delay(50); //защита от дребезга контакта 50мс
      mode = 1; //возврат в 1 режим работы
    }

    if (mode > 6) //количество режимов работы
    {
      mode = 1; //зацикливание смены режимов работы
    }
  }

  if (digitalRead(3) == HIGH && flag == 1) //проверка не нажатой кнопки и флага
  {
    flag = 0; //сброс флага
  }

  //---------------------------------------------------------------------

  if (mode == 1) //1 режим работы
  {
    digitalWrite(1, HIGH); //постоянный сигнал на выходе
  }

  //---------------------------------------------------------------------

  if (mode == 2) //2 режим работы
  {
    if (millis() - time1 > 2000) //период следования импульсов 2000мс
    {
      time1 = millis();
      digitalWrite(1, LOW);
      time2 = millis();
    }
    if (millis() - time2 > 1000) //длительность импульсов 1000мс
    {
      digitalWrite(1, HIGH);
      time2 = millis();
    }
  }

  //---------------------------------------------------------------------

  if (mode == 3) //3 режим работы
  {
    if (millis() - time1 > 1000) //период следования импульсов 1000мс
    {
      time1 = millis();
      digitalWrite(1, LOW);
      time2 = millis();
    }
    if (millis() - time2 > 100) //длительность импульсов 100мс
    {
      digitalWrite(1, HIGH);
      time2 = millis();
    }
  }

  //---------------------------------------------------------------------

  if (mode == 4) //4 режим работы
  {
    if (millis() - time1 > 1000) //период следования импульсов 1000мс
    {
      time1 = millis();
      digitalWrite(1, LOW);
      time2 = millis();
    }
    if (millis() - time2 > 900) //длительность импульсов 900мс
    {
      digitalWrite(1, HIGH);
      time2 = millis();
    }
  }

  //---------------------------------------------------------------------

  if (mode == 5) //5 режим работы
  {
    if (millis() - time1 > 200) //период следования импульсов 200мс
    {
      time1 = millis();
      digitalWrite(1, LOW);
      time2 = millis();
    }
    if (millis() - time2 > 100) //длительность импульсов 100мс
    {
      digitalWrite(1, HIGH);
      time2 = millis();
    }
  }
  
  //---------------------------------------------------------------------

  if (mode == 6) //6 режим работы
  {
    if (millis() - time1 > 100) //период следования импульсов 100мс
    {
      time1 = millis();
      digitalWrite(1, LOW);
      time2 = millis();
    }
    if (millis() - time2 > 50) //длительность импульсов 50мс
    {
      digitalWrite(1, HIGH);
      time2 = millis();
    }
  }
}


Скетч от пользователя yurok
// Генератор импульсов,  © yurok  //
// конфигурация пинов
#define BUTTON_PIN 3
#define SIGNAL_PIN 1

#define BOUNCE_PROTECTION_TIME 50 // защита от дребезга, мс
#define LONG_BUTTON_TIME 500 // длительность длинного нажатия, мс

byte CurrentMode = 0; // начинаем с первого режима
byte MaxMode = 0; // максимальное количество режимов в приборе
unsigned long TimePeriod = 0; // время последней фиксации периода
bool ButtonFlag = false; // нажата ли клавиша сейчас
bool PulseFlag = false; // признак того, что в текущем периоде импульс уже выдавали

// создаем тип данных "режим"
typedef struct
{
  unsigned long Period; // период
  unsigned long Duration; // длительность импульса
}
ModeType;
ModeType MT[] = { // массив структур режимов
  {1,    0},    // 1 режим (постоянный сигнал)
  {2000, 1000}, // 2 режим (меандр 0,5Гц)
  {1000, 100},  // 3 режим (короткий импульс)
  {1000, 900},  // 4 режим (короткая пауза)
  {200,  100},  // 5 режим (меандр 5Гц)
  {100,  50}    // 6 режим (меандр 10Гц)
};

// определение количества элементов в массиве произвольного типа
template<typename T, size_t n> inline size_t arraySize(const T (&arr)[n])
{
  return n;
}

////////////////////////////////////////////////////////////////////////////////
// предварительная настройка программы
////////////////////////////////////////////////////////////////////////////////
void setup()
{
  pinMode(BUTTON_PIN, INPUT); // кнопка
  pinMode(SIGNAL_PIN, OUTPUT); //сигнал
  MaxMode = arraySize(MT) - 1; // вычисляем максимальный доступный режим
}

////////////////////////////////////////////////////////////////////////////////
// функция для генерации импульсов в зависимости от режима
////////////////////////////////////////////////////////////////////////////////
void mode_control(byte in_mode) // первый режим не требует контроля времени, поэтому отработаем его тут
{
  if (in_mode == 0)
  {
    digitalWrite(SIGNAL_PIN, HIGH);
    return;
  }

  // все другие режимы отрабатываются одинаково
  unsigned long CurrentTime = millis(); // текущее время
  // проверка окончания прошлого периода
  if (CurrentTime - TimePeriod > MT[in_mode].Period)
  {
    digitalWrite(SIGNAL_PIN, HIGH); // начинаем новый импульс
    TimePeriod = CurrentTime; // отсечку периода приводим к текущему времени
    PulseFlag = false; // сбрасываем флаг текущего периода (в данном периоде импульс еще не завершали)
  }

  // проверка на окончание импульса
  if ((CurrentTime - TimePeriod > MT[in_mode].Duration) && !PulseFlag)
  {
    digitalWrite(SIGNAL_PIN, LOW); // заканчиваем текущий импульс
    PulseFlag = true; // ставим флаг, что импульс завершили в этом периоде
  }
}

// основной цикл
void loop()
{
  ////////////////////////////////////////////////////////////////////////////////
  // контроль кнопки
  ////////////////////////////////////////////////////////////////////////////////

  // проверка на нажатие с флагом для исключения повторной отработки
  if (digitalRead(BUTTON_PIN) == LOW && !ButtonFlag)
  {
    delay(LONG_BUTTON_TIME); // задержка для проверки долгого нажатия кнопки
    PulseFlag = false; //сбрасываем флаг сброса текущего импульса
    CurrentMode++; // переходим к следующему режиму
    ButtonFlag = true; // установка флага текущего нажатия кнопки
    // проверка долгого нажатия
    if (digitalRead(BUTTON_PIN) == LOW)
    {
      delay(BOUNCE_PROTECTION_TIME); // защита от дребезга кнопки
      CurrentMode = 0; // начинаем с первого режима
    }
    // проверка на достижение максимального режима
    if (CurrentMode > MaxMode)
    {
      CurrentMode = 0; // начинаем с первого режима
    }
  }
  // если кнопка была нажата, а сейчас отпущена - сбрасываем флаг
  if (ButtonFlag && digitalRead(BUTTON_PIN) == HIGH)
  {
    ButtonFlag = false;
  }

  ////////////////////////////////////////////////////////////////////////////////
  // исполнение функции для текущего режима
  ////////////////////////////////////////////////////////////////////////////////
  mode_control(CurrentMode);

}


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


youtu.be/TdhSkhlJORE

Вывод: несмотря на кажущуюся простоту конструкции, собрать и отладить её было непросто, зато для меня устройство получилось очень полезное, что с лихвой компенсировало все труды.
Планирую купить +43 Добавить в избранное +74 +135
+
avatar
  • triak
  • 11 марта 2016, 22:45
0
Зачет.
+
avatar
  • vanenzo
  • 11 марта 2016, 22:54
0
О, агонь, спасибо за идею, я уже вижу драйвер для ледов с диммированием по wifi(с esp8266)
+
avatar
+1
Корпус прекрасен, у меня тоже лежит такой, как повербанк он не заработал, при зарядке телефона 1А перегревается и отключается, а дальше идут постоянные включения/выключения как он немного остынет или опять перегреется. А вот как корпус прибора с питанием 5В задумка великолепная. Обзору однозначный плюс
+
avatar
0
Корпус приятный. Приобретался отдельно или из под какого-нибудь девайса?
+
avatar
  • ksiman
  • 11 марта 2016, 22:56
0
В самом первом предложении обзора есть ссылка
+
avatar
  • magtol
  • 11 марта 2016, 22:56
0
боюсь реле столько циклов не выдержит, но прикольно :)
+
avatar
  • ksiman
  • 11 марта 2016, 22:58
+1
Большинство промежуточных реле без нагрузки выдерживает 10млн срабатываний
+
avatar
  • magtol
  • 11 марта 2016, 23:04
0
10 млн истекут ровно через 2 месяца работы, это раз. а два — нафига оно нужно реле если на него не сажать нагрузку, так, побаловаться?
+
avatar
  • ksiman
  • 11 марта 2016, 23:05
+3
Притирка и зачистка контактов. Когда реле работает на малых нагрузках и редко переключается — контакт становится нестабильным.
+
avatar
  • magtol
  • 11 марта 2016, 23:15
-5
+
avatar
  • ksiman
  • 11 марта 2016, 23:22
+12
Это наука о контактах
+
avatar
  • AndrVU
  • 11 марта 2016, 23:32
+13
Это электротехника — наука о контактах. Все неисправности сводятся к двум причинам: либо контакт есть, там где он не нужен, либо контакта нет, где он требуется. )))))))))))
+
avatar
0
Хотел все время спросить мт3608 как себя ведет? В тишине слышно как пишит или нет? Просто на днях делал повыщающий преобразовтель с 3,7 вольт до 5 вольт. Ставил aliexpress.com/snapshot/7268048657.html
Так он меня своим микрописком просто добил.
+
avatar
  • ksiman
  • 11 марта 2016, 23:35
+1
Тихонечко пищит дроссель. Слышно если поднести вплотную к уху.
+
avatar
+1
Скетч лучше вставлять с помощью тега code. Там неплохая подсветка синтаксиса, плюс отступы у вас съелись.
+
avatar
  • ksiman
  • 12 марта 2016, 00:11
+1
Сделано, спасибо
+
avatar
  • hpv
  • 12 марта 2016, 00:37
+1
а еще, если использовать массив, то длинна скетча уменьшится радикально)))
+
avatar
  • mooni73
  • 12 марта 2016, 00:10
0
Когда светик плохо виден через корпус можно изнутри немного снять стружки толстым сверлом, главное не переборщить!
+
avatar
  • ksiman
  • 12 марта 2016, 00:13
0
Да, можно фрезой попробовать — завтра сделаю
+
avatar
0
img.mysku-st.ru/uploads/images/original/02/80/11/2016/03/11/e648fc.jpg
А что это еще на входе?
На схеме красным эта доработка не обозначена…
+
avatar
  • ksiman
  • 12 марта 2016, 08:17
+1
Вы про резистор? Он на общей схеме есть.
+
avatar
0
Можно подробнее где еще можно использовать данный проект?
+
avatar
0
в программе тут использование таймера напрашивается, была бы раза в 3 короче)
и во много раз энергоэффективнее — выставил регистры в обработчике кнопок и тинька сама будет дрыгать ногой, можно в обработчике ещё и спать её отправлять до следующего прерывания
+
avatar
  • ksiman
  • 12 марта 2016, 08:20
0
в программе тут использование таймера напрашивается, была бы раза в 3 короче)
Можно написать программу множеством способов — это один из вариантов.
Так я и использовал программный таймер.
+
avatar
0
millis тоже аппаратным таймером пользуется, только тут ещё куча ненужной работы и по хорошему ещё нужно обработку переполнения таймера добавлять
+
avatar
  • yurok
  • 12 марта 2016, 01:21
0
Хорошая поделка!
Код конечно «жестковат» — выглядит странно и с++ тут нет, простой c, для начала изучения вполне норм

У меня вот есть потребность питать от 18650 некую поделку, которой требуется 5 и 12 В. Потребление по 5 В составит в районе 300 мА, потребление по 12 В порядка 500 мА. Устройство от батарейки должно уметь работать часа 3 для одного заряда. Вот думаю сколько мне батареек потребуется параллельно соединить чтобы их смогла зарядить народная платка зарядки и как лучше сформировать необходимые 12 В.
+
avatar
  • ksiman
  • 12 марта 2016, 08:21
+1
Код конечно «жестковат»
Я об этом догадывался :)
Покажите как надо в образовательных целях.
Потребление по 5 В составит в районе 300 мА, потребление по 12 В порядка 500 мА. Устройство от батарейки должно уметь работать часа 3 для одного заряда.
Можно легко прикинуть — у меня получилось не менее 3х банок по 2600мАч. Лучше брать с запасом 4шт
+
avatar
  • yurok
  • 12 марта 2016, 08:54
0
общие пожелания по коду: пины и «магические константы» (типа времени) лучше вначале программы задать #define — так и программа читается легче и лишние комментарии можно убрать, второе следует к памяти относится бережнее, конкретно здесь — не использовать int для флагов и режима — тип byte для них самый раз. Ну и режимы работы у вас отличаются только временами — есть смысл обобщить и вынести проверки в функцию, код будет гораздо более читаем. Времена передавать аргументами. Я бы описал режим структуркой и определили их массив вначале, где номер режима определяет индекс в массиве — код был бы очень легкочитаем.
+
avatar
  • ksiman
  • 12 марта 2016, 08:57
0
лучше вначале программы задать #define
Надо попробовать, но программа станет ещё длиннее
следует к памяти относится бережнее, конкретно здесь — не использовать int для флагов и режима — тип byte для них самый раз
Да, действительно можно сэкономить целых 2 байта :)
Я бы описал режим структуркой и определили их массив вначале, где номер режима определяет индекс в массиве — код был бы очень легкочитаем.
Пока не представляю как так сделать
+
avatar
  • yurok
  • 12 марта 2016, 09:41
0
ниже приведу ваш код
+
avatar
+1
лучше вначале программы задать #define
Надо попробовать, но программа станет ещё длиннее
Если длиннее для человека, то все равно. Чем понятнее тем лучше.

Да, действительно можно сэкономить целых 2 байта :)
Привычка — вторая натура. Лучше сразу привыкнуть брать переменные по минимуму занимаемого места, магические числа описывать как константы /define, делать отступы и писать код который сможешь понять через полгода после окончания проекта.
Банальности, но очень сильно помогают в работе с программой.
+
avatar
  • klop
  • 12 марта 2016, 09:19
0
Для флагов только тип bool. Тогда вместо "&& flag == 1" можно писать " && flag" ). Это сэкономит еще несколько байт скомпилированного кода.
+
avatar
+1
Отличный обзор.

Но вот только может старшее поколение пояснит мне такую любовь к использованию МГТФ провода?
Я еще в детстве, в радиокружке его люто невзлюбил, потому как разделывать — гемор.
Но ладно, тогда у нас проводов особо не было, сейчас и продаются, и у меня, как у админа — куча пучков от дохлых БП и прочего.

Разноцветные, красивые, сразу понятно. что куда идет. А тут — один цвет, и капризный в разделке.

Поясните — зачем?!
+
avatar
  • yurok
  • 12 марта 2016, 01:42
+2
очень гибкие, изоляция не боится температуры — зачищаются легко мелкими кусачками
+
avatar
+1
Жилы вы при этом не вытягиваете?
Я часто просто подплавляю изоляцию жалом (плоское), и потом кусачками…
Видите как, неудачный детский опыт до сих пор жив…
+
avatar
0
Отлично зачищается таким вот инструментом
+
avatar
+2
На оборонном заводе (учился там когда-то на монтажника РЭА) для зачистки МГТФ используют обжигалку. Выглядит как старый аппарат для выжигания по дереву. Т.е. нихромовая проволока, раскаленная докрасна.
А если у кого в руках замечали кусачки… казнь была медленной и мучительной. 8)

А в домашних условиях я использую обычную «турбо» зажигалку.
+
avatar
  • yurok
  • 12 марта 2016, 08:39
0
пары там вредные… получается кусачками без повреждения жил
+
avatar
0
Там тех паров… мизер по сравнению с парами от припоя и прочего.
А кусачками все равно жилы и изоляция повреждаются. Да и края потом лохматые.
Ну и МГТФ 0.03 кусачками у меня не получается зачистить.
+
avatar
+1
Настоящий админ режет витуху и использует провода оттуда. Я до сих режу кабели от Длинка.Синие такие, которые раньше распихивали.
+
avatar
  • yurok
  • 12 марта 2016, 01:56
0
попробуйте МГТФ — разница очень существенная
+
avatar
0
А еще круче взять шлейф 80 пиновый и его порезать. И не хуже МГТФ будет. А в чип и дип я поеду не скоро…
+
avatar
+8
У МГТФ изоляция фторопластовая. Она не плавится при пайке. ПВХ предательски скукоживается у контактного пятачка.
+
avatar
  • sir0ta
  • 12 марта 2016, 13:14
+1
Хуже. Он толще, изоляция хуже, проводник меньше. МГТФ — наше ВСЕ!
+
avatar
  • stels
  • 15 марта 2016, 13:02
0
жила ide шлейфа толще мгтф?

хуже, да, но там где не нужен мгтф, где нет вибраций, высокой температуры и устройство не подвергается мех возд, паяю ide жилами, тем более прототипы навесным монтажом, которые все равно потом разберутся. Не вижу смысла в такие места резать мгтф.
+
avatar
  • sir0ta
  • 15 марта 2016, 13:32
0
Не было разговора за прототип. Он вообще собирается на макетке. И мгтф и мгтфу рознь. Но кажется даже самый тощий из них толще ide.
+
avatar
+1
Ну мне больше нравятся цвета проводов из питальника, что поделать.
Патчам из комлекта сетевых устройств находится прямое применение все время.
+
avatar
  • jh7
  • 12 марта 2016, 03:30
+2
сколько пробовал, паяются очень плохо. пока залудишь нормально, вся изоляция расплавится
+
avatar
  • wwest
  • 14 марта 2016, 15:19
0
А ещё админчеги пускают 220в по витухе.Гы-гы…
+
avatar
  • ksiman
  • 12 марта 2016, 08:25
+3
Но вот только может старшее поколение пояснит мне такую любовь к использованию МГТФ провода?
Нравятся и всё тут :)
+
avatar
  • wwest
  • 14 марта 2016, 15:14
0
Качество меди, жил, прочность, термостойкая!!! изоляция.
Зачищать надо УМЕТЬ! Даже кусачками не проблема, а уж спец инструментом…
Долговечность! После вымачивания в солёной океанской воде.Даже через 50 лет провод из жгута -как новый.
Королёв не смог запустить Р-1 копию Фау-2, пока не наладили выпуск проводов в фторопластовой изоляции.По немецкой естественно! технологии и оборудовании.
Гуттаперчевая отечественная -горела.
Вас никто и не просит пользоваться МГТФ, есть полно китайского барахла.Нам больше останется.
Я отрезками МГТФ собирал свой первый компьютер по типу Радио-80 на крейте.А Специалиста уже эмалированным проводом -пайкой перегретым паяльником к контактным площадкам макетной платы.
+
avatar
0
О, олдфаги еще подтянулись :)

Я что-то сомневаюсь, что 90% местных самоделок требуют такой пресловутой надежности, о которой вы говорить.
А вот простоты «чтения» конструкции, чтобы было видно сразу, что куда идет — да.

Да, муж сестры, старше меня на 10 лет — тоже свой первый «спектрум» так паял, но это же мазохизм чистой воды, по мне.

А у вас почему-то сразу, если кому-то что-то неудобно, так человек не умеет, да? Может, он сексом предпочитает по-другому заниматься? ;)
+
avatar
  • wwest
  • 15 марта 2016, 10:43
0
Так дело ТОГДА было даже не в надёжности а в удобстве!
Пользовались теми проводами, что были на производстве самыми лучшими и удобными-для себя любимого.
Были и ПВХ провода в двойной «шёлковой» изоляции.Были и одножильные, были и в шёлковой изоляции -много всего было.Так у них концы оболочки плавились, плавилась изоляция обнажая жилу и угрожая замыканием.А монтаж на плате ПК ну очень плотный.Представте себе ткнули вы в гущу паутины проводов горячим паяльником, чтобы подпаяться к похороненному в глубине пятачку?
И все провода проплавились до жил-замыкание и Сизифов труд на смарку!!! Если вы видели подобные конструкции то за проводами платы было не видно!
А МГТФ был всех толщин в наличии и зачистка проблем не представляла.

Мазохизм и адский труд.А куда деваться если готовые платы были дифсит и стоили пару-тройку зарплат? А сколько стоил Синклер или советский Эппл(3600-9000 от комплектации рублей в 86 году при зарплате в 130, Волга 10 000)??? Память 48килобайт стоила ДОРОЖЕ самого ПК.
ЛУТ технологии не существовало(платы разводили рейсфедерами нитрокраской или цапон лаком даже для пром телевизоров Электрон, Рубин итд 3УСЦТ), лазерных принтеров ещё не было даже на производстве, персональных ПК дома с программами разводки тоже.Были только отечественные и американские Ксероксы под роспись в 1 отделе с перечислением копированного материала.Только промышленные установки проектирования и производства плат, занятые ТОЛЬКО военным производством-не многие имели к ним доступ и знания пользования программами.Заказать печать плат официально для себя или мелкой партией было не возможно(до НЭПА Меченого), только по блату через задний проход за большие деньги, от предприятия итд.Китая ещё не было.
Есть и были конечно американские фторопластовые ЦВЕТНЫЕ провода не хуже МГТФ, но вы ЦЕНЫ на них видели??? Потому что они только МИЛИТАРИ класса.
Многие к тому же имеют старые запасы с работы, а барыги торгуют на радиорынках запасами со складов(кто что охранял то и имел).
И на сегодня по соотношению цена/качество ничего лучше у нас на рынке НЕТ.
Ваш Кэп О.
+
avatar
0
Спасибо за экскурс в прошлое, и я не подкалываю.
Действительно интересный комментарий!
+
avatar
0
Я бы порекомендовал добавить [mode = 0] [Uвых = 0]. И при запуске вставать в этот режим, дабы случайно не пожечь нагрузку, если напряжение было случайно не перенастроено.
+
avatar
  • ksiman
  • 12 марта 2016, 08:27
0
Настройка производится без подключенной нагрузки. Режим Mode 0 — это отключение питания :)
+
avatar
  • VG1544
  • 12 марта 2016, 02:31
+3
У меня вопрос, а для чего и где используется это устройство? Вижу много умных советов в комментариях как улучшить что бы хорошо работало, и примерно такой же тематики, а какое его предназначение в устройстве или связке с другими работающими от электричества.
+
avatar
0
Новогодняя гирлянда, мигающий дополнительный стоп для автомобиля, мигающий знак аварийной остановки для авто. Можно ещё много чего придумать.
+
avatar
  • udavst
  • 13 марта 2016, 09:35
0
Доп.стоп и аварийный знак — это 2 транзистора, микроконтроллер со стабилизатором и силовым ключём для этого ну чрезвычайно круто )
+
avatar
  • ksiman
  • 12 марта 2016, 08:29
0
У меня вопрос, а для чего и где используется это устройство?
Это в основном не бытовое устройство.
+
avatar
  • VG1544
  • 12 марта 2016, 08:49
0
В конкретно вашем случае, где? если не секрет конечно т.к. обзор и скетч к нему. А к предыдущему комментарию это и так понятно что стробоскоп по алгоритму через реле, по видео можно убедиться ещё раз, используют в таких случаях которые вы и перечислили.
+
avatar
  • ksiman
  • 12 марта 2016, 08:53
+3
Например, есть электромагнитный клапан, который начал работать нестабильно. Я его снимаю, помещаю в моющий раствор и подаю импульсы. Аналогия — чистка форсунок в авто.
+
avatar
  • wwest
  • 14 марта 2016, 15:26
0
Круто, я не догадался.Промывал клапана от стиралок просто в растворе или с разборкой.Хотя подавать на мокрый клапан от 110в переменки стрёмно.
+
avatar
+2
не хватает только вольтметра в корпусе для отображения выходного напряжения :)
+
avatar
+2
За наводку на digispark по цене 90% от «голой» attiny85 — огромное спасибо!

А вот последовательно с затвором я бы крайне рекомендовал поставить резистор, хоть 100 ом. Иначе рано или поздно спалите контроллер.
+
avatar
  • YuDaV
  • 12 марта 2016, 08:26
0
Попробуйте flprog, бесплатно, визуально. Мне было с ним гораздо проще сделать вменяемый проект для себя. До этого все какие то наработки копились но в готовое изделие не оформлялись. Не думаешь каким макаром писать код, просто сразу делаешь то, что надо. Не реклама, просто мне удобно показалось.
+
avatar
  • ksiman
  • 12 марта 2016, 08:29
0
Попробуйте flprog, бесплатно, визуально.
Спасибо, обязательно попробую
+
avatar
  • klop
  • 12 марта 2016, 09:13
0
Автор молодец, как всегда, в электронике, но вот скетч с точки зрения программиста ужасен )). Осваивайте функции, массивы, логический тип переменных и получайте удовольствие от красивых, компактных и эффективных программ!
+
avatar
0
Сам во времена симбиан немного кодил на питоне, и как у 99% самоучек поначалу получался реальный «индийский код» То есть много текста, куча функций «на будущее» коменты сопровождали каждую не до конца освоенную функцию. На старом харде нашел свои первые «творения» и ужаснулся.
+
avatar
  • ksiman
  • 12 марта 2016, 13:32
+1
но вот скетч с точки зрения программиста ужасен
Я предупреждал, что программист из меня фиговый
+
avatar
  • yurok
  • 12 марта 2016, 09:42
+3
как то так помоему не хуже… только надо проверить — написал за 5 мин без проверок

// Генератор импульсов, ksiman © //
#define BUTTON_PIN 3
#define SIGNAL_PIN 1

#define BOUNCE_PROTECTION_TIME 50
#define LONG_BUTTON_TIME 500

// globals
byte CurrentMode;
bool ButtonFlag;
unsigned long TimePeriod = 0;
unsigned long TimeDuration = 0;
byte MaxMode = 0; 

typedef struct {
  unsigned int Period;
  unsigned int Duration;
} ModeType; 

ModeType MT[] = {
   {0,    0},    // - off
   {1,    0},    // - all
   {2000, 1000},
   {1000, 100},
   {1000, 900},
   {200,  100},
   {100,  50}
 };

template<typename T, size_t n> inline size_t arraySize(const T (&arr)[n]){return n;}

void setup()
{
  pinMode(BUTTON_PIN, INPUT); //настройка входа
  pinMode(SIGNAL_PIN, OUTPUT); //настройка выхода
  MaxMode = arraySize(MT);
}

void mode_control(byte in_mode){
 if(in_mode==0){
     digitalWrite(SIGNAL_PIN, LOW);
     return;
 }
 if(in_mode==1){
     digitalWrite(SIGNAL_PIN, HIGH);
     return;
 }
 unsigned long CurrentTime = millis();
 if (CurrentTime - TimePeriod > MT[in_mode].Period){
      digitalWrite(SIGNAL_PIN, LOW);
      TimePeriod = TimeDuration = CurrentTime;
 }
 if (CurrentTime - TimeDuration > MT[in_mode].Duration){
      digitalWrite(SIGNAL_PIN, HIGH);
      TimeDuration = CurrentTime;
 }
}

void loop()
{
  ////////////////////////////////////////////////////////////////////////////////
  // Button control
  ////////////////////////////////////////////////////////////////////////////////
  if (digitalRead(BUTTON_PIN) == LOW && !ButtonFlag){
    delay(LONG_BUTTON_TIME);
    CurrentMode++;
    ButtonFlag = true;
    if (digitalRead(BUTTON_PIN) == LOW){
      delay(BOUNCE_PROTECTION_TIME);
      CurrentMode = 1;
    }
    if (CurrentMode > MaxMode){
      CurrentMode = 1;
    }
  }
  if (ButtonFlag && digitalRead(BUTTON_PIN) == HIGH){
    ButtonFlag = false;
  }
  ////////////////////////////////////////////////////////////////////////////////
  
  mode_control(CurrentMode);

}


поддерживать такой код приятнее, помоему. Для добавления и изменения режимов достаточно менять инициализацию массива структур, остальные все настройки вверху. Это наверно не конкретный код реализации — мне просто приятнее так смотреть )
+
avatar
  • klop
  • 12 марта 2016, 09:54
+1
void mode_control(byte in_mode){
if(in_mode==0){
digitalWrite(SIGNAL_PIN, LOW);
return;
}
if(in_mode==1){
digitalWrite(SIGNAL_PIN, HIGH);
return;
}
Вместо всего этого безобразия одна строчка: digitalWrite(SIGNAL_PIN, Flag); где Flag тип bool ))
+
avatar
  • yurok
  • 12 марта 2016, 09:55
+1
флаг тут имеет другое значение, и иногда наглядность важнее краткости
+
avatar
  • klop
  • 12 марта 2016, 09:58
0
флаг тут имеет другое значение
Не имеет
+
avatar
  • yurok
  • 12 марта 2016, 10:00
0
приведите свою реализацию
+
avatar
  • klop
  • 12 марта 2016, 10:07
0
Так уже привел пример выше. Весь код переписать? А насчет минимизации кода разговор с автором начали Вы.
+
avatar
  • yurok
  • 12 марта 2016, 10:24
+1
вникните в код и поймете почему так
+
avatar
  • klop
  • 12 марта 2016, 10:51
0
Если Вам что-то непонятно — спрашивайте конкретнее, объясню. Вам еще учиться и учиться эффективному программированию. И в этом ничего зазорного. Я тоже не так давно узнал, что в среде Ардуино: HIGH = 1, LOW = 0, TRUE = 1, FALSE = 0
+
avatar
  • yurok
  • 12 марта 2016, 10:52
+1
улыбнуло
конкретный код посмотрите и поймете почему и что я написал )
+
avatar
  • notemp
  • 12 марта 2016, 10:58
0
in_mode — здесь номер режима, а не флаг
+
avatar
  • yurok
  • 12 марта 2016, 11:05
0
осталось дождаться автора обзора с тестом програмки )
+
avatar
  • notemp
  • 12 марта 2016, 11:30
0
Желательно еще инициализировать CurrentMode и ButtonFlag
+
avatar
  • yurok
  • 12 марта 2016, 11:35
0
да, хотел про это написать

byte CurrentMode=0;
bool ButtonFlag=false;

в остальном, все настолько просто, что комментарии лишние тут помоему
+
avatar
  • sir0ta
  • 12 марта 2016, 13:19
0
del
+
avatar
  • yurok
  • 12 марта 2016, 13:21
0
от 0 до количества режимов работы.
0- режим выключено
1-всегда присутствует сигнал

это два необычных режима которые нуждаются в спец обработке, другие все обрабатываются по типовому алгоритму
+
avatar
  • sir0ta
  • 12 марта 2016, 13:23
0
Да. Я потом заметил. Извиняюсь.
+
avatar
  • sir0ta
  • 12 марта 2016, 13:22
0
Для облегчения написания кода флаги все можно проверять или скажем if(flag) или if(!flag). Т.е. digitalRead(BUTTON_PIN) == LOW приводится к !digitalRead(BUTTON_PIN)
+
avatar
  • ksiman
  • 12 марта 2016, 13:25
0
как то так помоему не хуже… только надо проверить — написал за 5 мин без проверок
Спасибо, почти работает :)
— при запуске, выход неактивен, что не позволяет отследить запуск программы до нажатия кнопки
— появился дополнительный режим со случайной частотой моргания. Видимо вылет за границу диапазона.
Как работает эта программа — пока не понял…
+
avatar
  • yurok
  • 12 марта 2016, 13:59
0
да — новый режим :) при включении ничего никуда не подается )
byte CurrentMode=0;
bool ButtonFlag=false;
это сделали?

или CurrentMode=1; — тогда начнет с первого

if (CurrentMode > MaxMode){
попробуйте заменить на
if (CurrentMode > MaxMode-1){

либо жестко задать MaxMode = 6 и убрать
MaxMode = arraySize(MT);
+
avatar
  • ksiman
  • 12 марта 2016, 14:01
0
это сделали?
Да, конечно
или CurrentMode=1; — тогда начнет с первого
Помогло :)
+
avatar
  • yurok
  • 12 марта 2016, 14:06
0
ну хоть скомпилировалась и то хорошо )
границы надо посмотреть
+
avatar
  • yurok
  • 12 марта 2016, 14:11
0
выше написал предложения по устранению случайного режима )

вообще доберусь до компа — могу потестить у меня есть спарк, это все писал с телефона
+
avatar
  • ksiman
  • 12 марта 2016, 15:59
0
Случайно затёр загрузчик :(((
Теперь по USB не связывается…
Предстоит весёлая процедура подключения к ISP программатору и восстановление загрузчика.
+
avatar
  • yurok
  • 12 марта 2016, 19:30
0
бывает такое…
ладно хоть это не роутер, где подпаиваться нужно

в общем, жду обратной связи — если что соберу сам такое
+
avatar
  • ksiman
  • 12 марта 2016, 19:42
0
в общем, жду обратной связи — если что соберу сам такое
В понедельник восстановлю — программатор на работе остался
+
avatar
  • ksiman
  • 14 марта 2016, 10:58
0
Восстановил загрузчик, можно продолжать экспериментировать :)
Загрузил Вашу программу со всеми изменениями

// Генератор импульсов, yurok © //
#define BUTTON_PIN 3
#define SIGNAL_PIN 1

#define BOUNCE_PROTECTION_TIME 50
#define LONG_BUTTON_TIME 500

// globals
byte CurrentMode = 1;
bool ButtonFlag = false;
unsigned long TimePeriod = 0;
unsigned long TimeDuration = 0;
byte MaxMode = 0;

typedef struct {
  unsigned int Period;
  unsigned int Duration;
} ModeType;

ModeType MT[] = {
  {0,    0},    // - off
  {1,    0},    // - all
  {2000, 1000},
  {1000, 100},
  {1000, 900},
  {200,  100},
  {100,  50}
};

template<typename T, size_t n> inline size_t arraySize(const T (&arr)[n]) {
  return n;
}

void setup()
{
  pinMode(BUTTON_PIN, INPUT); //настройка входа
  pinMode(SIGNAL_PIN, OUTPUT); //настройка выхода
  MaxMode = arraySize(MT);
}

void mode_control(byte in_mode) {
  if (in_mode == 0) {
    digitalWrite(SIGNAL_PIN, LOW);
    return;
  }
  if (in_mode == 1) {
    digitalWrite(SIGNAL_PIN, HIGH);
    return;
  }
  unsigned long CurrentTime = millis();
  if (CurrentTime - TimePeriod > MT[in_mode].Period) {
    digitalWrite(SIGNAL_PIN, LOW);
    TimePeriod = TimeDuration = CurrentTime;
  }
  if (CurrentTime - TimeDuration > MT[in_mode].Duration) {
    digitalWrite(SIGNAL_PIN, HIGH);
    TimeDuration = CurrentTime;
  }
}

void loop()
{
  ////////////////////////////////////////////////////////////////////////////////
  // Button control
  ////////////////////////////////////////////////////////////////////////////////
  if (digitalRead(BUTTON_PIN) == LOW && !ButtonFlag) {
    delay(LONG_BUTTON_TIME);
    CurrentMode++;
    ButtonFlag = true;
    if (digitalRead(BUTTON_PIN) == LOW) {
      delay(BOUNCE_PROTECTION_TIME);
      CurrentMode = 1;
    }
    if (CurrentMode > MaxMode - 1) {
      CurrentMode = 1;
    }
  }
  if (ButtonFlag && digitalRead(BUTTON_PIN) == HIGH) {
    ButtonFlag = false;
  }
  ////////////////////////////////////////////////////////////////////////////////

  mode_control(CurrentMode);

}


Результаты:
— начинает с 1 режима :)
— нулевой режим пропал :)
— 2 и 3 режимы поменялись местами, пытаюсь понять почему так

p.s. кажись разобрался — второй параметр почему-то программирует паузу вместо импульса

p.p.s. как работает программа так и не понял :(
+
avatar
  • yurok
  • 14 марта 2016, 12:47
0
то есть все хорошо или нет? :)
можете сейчас строчек в инициализации добавить с любыми другими режимами :)
+
avatar
  • ksiman
  • 14 марта 2016, 20:55
0
то есть все хорошо или нет? :)
Всё хорошо, кроме программирования длительности импульса (вместо него программируется пауза)
можете сейчас строчек в инициализации добавить с любыми другими режимами :)
Это тоже проверил — работает :)

Как работает программа так и не понял, надо С++ изучать, а мозги уже не те :(
Привык писать на Ассемблер, Basic, LAD, STL, FBD,…
+
avatar
+1
Как работает исходный код автора — всем предельно ясно. Как работает ваш код — понятно, судя по комментариям, далеко не всем.

И, собственно, это все, что следует сказать про эти два кода. :)
+
avatar
  • yurok
  • 12 марта 2016, 14:14
+1
гениально )
кому захочется понять — наверно поймут — он очень простой
+
avatar
  • udavst
  • 13 марта 2016, 09:55
+2
У автора проще, не нужно быть программером, чтоб понять реализацию. Сам сторонник так писать, пусть будет всё последовательно, чем куча непонятных строк, типа «template<typename T, size_t n> inline size_t arraySize(const T (&arr)[n]){return n;}»

При этом даже моя маленькая метеостанция (темп, давление, влажность дома и на улице), с дисплеем от кассового аппарата, выводом данных на narodmon, с радиоканалом на IRF до кухни с датчикми газа и протечки, спокойно влезла в 328 контроллер вот таким вот последовательным кодом и место осталось, и читается легко, и менять код просто, когда видно сразу куда чего дописать при изменениях.
+
avatar
0
Белая метеостанция? Ул. Стекольная? ))) Такой большой город и всего один датчик.
Я на ESP-12 собрал. Пока один датчик для пробы, остальные жду с Китая. По NRF можно вопрос в личку?
+
avatar
  • udavst
  • 14 марта 2016, 13:10
0
Конечно. Но я просто IRFок в своё время набрал, теперь мучаюсь (не дальнобойные они, через всю квартиру с бетонными стенами очень с трудом). Теперь, когда WiFi по той цене, что IRF стоили, лучше бы на них собрал, но переделывать смысла уже не вижу, и ирфок ещё штук 7 осталось ) (правда засыпают они зачётно, вообще не потребляют практически)
+
avatar
  • yurok
  • 13 марта 2016, 16:37
+1
колхоз дело добровольное
поддерживать приведенный код для меня проще, и раз уж писать на языке предстоит и использовать в дальнейшем программу — немного времени потратить на базовые принципы совсем не повредит.

Хотя… большинство программистов из Индии с вами согласятся :)
+
avatar
0
вообще-то эта плата предназначена для построения устройств на базе софтового усб, причем писать софт для мк уже не нужно, т.к. есть все готовое
littlewire.cc/
+
avatar
  • ksiman
  • 12 марта 2016, 13:43
+1
ообще-то эта плата предназначена для построения устройств на базе софтового усб
Что не мешает её использовать для других благих целей
+
avatar
  • AndrVU
  • 12 марта 2016, 17:26
0
Замечательное устройство! Вот только второй MicroUSB разъем на мой вкус выглядит немного «лишним». Не думали о переносе его функций на разъем PowerBank’а? «Земля» у них общая, линии данных у MicroUSB PowerBank’а не задействованы или закорочены. Остается питание +5V. Его можно было организовать с помощью двухпозиционного переключателя у которого два вывода подключены как у вас – общий на +5V Digispark, второй на OUT+ PowerBank, а третий подключить к IN+ PowerBank.

PS
Упс! Не получится так запитать. Увидел в схеме Digispark диод, включенный встречно между +5V и USB. Ну, тогда можно вместо переключателя поставить тумблер с двумя независимыми группами перекидных контактов. Вы подобный уже пристраивали в эту коробочку в предыдущем отзыве
… Хотя, наверное, лишний весь этот «огород». Провода к MicroUSB разъемам припаивать… Бр-р-р. «Лучшее враг хорошего» © Лучше оставить как есть.
+
avatar
  • ksiman
  • 12 марта 2016, 17:43
0
Лучше оставить как есть.
Рассуждал примерно так-же :)
Сделать маленькое отверстие проще, чем переделывать.
+
avatar
  • xvoland
  • 13 марта 2016, 05:03
0
на базе аппаратного таймера NE555
Решил добавить, что действительно проще и есть этому готовое решение, но авто изучает Digispark

+
avatar
  • yurok
  • 13 марта 2016, 06:29
0
В вашем варианте можно сделать 6 предустановленных режимов, переключаемых одной кнопкой, как у автора?
… значит это совсем иное устройство.

они похожи, как дробовик деда и автомат… оба стреляют
+
avatar
  • escimo
  • 14 марта 2016, 14:03
0
Огромное спасибо за идею размещения своих поделок в корпусе данного банка мощности
+
avatar
  • yurok
  • 15 марта 2016, 03:47
0
вот новый код:
— первый параметр период, второй длительность импульса (в коде автора обзора, также как и в моем предложенном, контролировалось пространство без импульса)
— расписал почти каждую строчку комментариями
— ввел флаг окончания импульса, чтобы лишний раз не дергать
— убрал лишнюю переменную последней длительности импульса
— нулевой режим удален в принципе
— мелкие правки


// Генератор импульсов,  © yurok  //
// конфигурация пинов
#define BUTTON_PIN 3
#define SIGNAL_PIN 1

// временные интервалы в мс
// защита от дребезга
#define BOUNCE_PROTECTION_TIME 50
// длительность длинного нажатия
#define LONG_BUTTON_TIME 500

// текущий режим работы
byte CurrentMode = 1;
// время последней фиксации периода
unsigned long TimePeriod = 0;
// нажата ли клавиша сейчас
bool ButtonFlag = false;
// признак того, что в текущем периоде импульс уже выдавали
bool PulseFlag = false;
// максимальное количество режимов в приборе
byte MaxMode = 0;

// создаем тип данных "режим"
typedef struct {
  unsigned long Period; // период
  unsigned long Duration; // длительность импульса
} ModeType;

// массив структур режимов
ModeType MT[] = {
  {1,    0},    // постоянная составляющая
  {2000, 1000}, // 2
  {1000, 100},  // 3
  {1000, 900},  // 4
  {200,  100},  // 5
  {100,  50}    // 6
};

// конструкция для определения количества элементов в массиве произвольного типа
template<typename T, size_t n> inline size_t arraySize(const T (&arr)[n]){return n;}

////////////////////////////////////////////////////////////////////////////////
// предварительная настройка программы
////////////////////////////////////////////////////////////////////////////////
void setup()
{
  pinMode(BUTTON_PIN, INPUT); // кнопка
  pinMode(SIGNAL_PIN, OUTPUT); //сигнал
  MaxMode = arraySize(MT) - 1; // вычисляем максимальный доступный режим
}

////////////////////////////////////////////////////////////////////////////////
// функция для генерации импульсов в зависимости от режима
////////////////////////////////////////////////////////////////////////////////
void mode_control(byte in_mode) {
  // первый режим не требует контроля времени, поэтому отработаем его тут
  if (in_mode == 1) {
    digitalWrite(SIGNAL_PIN, HIGH);
    return;
  }  

  // все другие режимы отрабатываются одинаково
  // текущее время
  unsigned long CurrentTime = millis();
  // проверка окончания прошлого периода
  if (CurrentTime - TimePeriod > MT[in_mode].Period) {
    // начинаем новый импульс
    digitalWrite(SIGNAL_PIN, HIGH);
     // отсечку периода приводим к текущему времени
    TimePeriod = CurrentTime;
    // сбрасываем флаг текущего периода (в данном периоде импульс еще не завершали)
    PulseFlag=false;
  }
  
  // проверка на окончание импульса
  if ((CurrentTime - TimePeriod > MT[in_mode].Duration) && !PulseFlag) {
    // заканчиваем текущий импульс
    digitalWrite(SIGNAL_PIN, LOW);
    // ставим флаг, что импульс завершили в этом периоде
    PulseFlag=true;
  }
}

// основной цикл
void loop()
{
  ////////////////////////////////////////////////////////////////////////////////
  // контроль кнопки
  ////////////////////////////////////////////////////////////////////////////////
  
  // проверка на нажатие с флагом для исключения повторной отработки
  if (digitalRead(BUTTON_PIN) == LOW && !ButtonFlag) {
    // задержка для проверки долгого нажатия кнопки
    delay(LONG_BUTTON_TIME);
    //сбрасываем флаг сброса текущего импульса
    PulseFlag=false;
    // переходим к следующему режиму
    CurrentMode++;
    // установка флага текущего нажатия кнопки
    ButtonFlag = true;
    // проверка долгого нажатия
    if (digitalRead(BUTTON_PIN) == LOW) {
      // защита от дребезга кнопки
      delay(BOUNCE_PROTECTION_TIME);
      // начинаем с первого режима
      CurrentMode = 1;
    }
    // проверка на достижение максимального режима
    if (CurrentMode > MaxMode) {
      // начинаем с первого режима
      CurrentMode = 1;
    }
  }
  // если кнопка была нажата, а сейчас отпущена - сбрасываем флаг
  if (ButtonFlag && digitalRead(BUTTON_PIN) == HIGH) {
    ButtonFlag = false;
  }
  ////////////////////////////////////////////////////////////////////////////////

  ////////////////////////////////////////////////////////////////////////////////
  // исполнение функции для текущего режима
  ////////////////////////////////////////////////////////////////////////////////
  mode_control(CurrentMode);
  ////////////////////////////////////////////////////////////////////////////////

}
+
avatar
  • ksiman
  • 15 марта 2016, 14:50
0
Не работает 2 режим (меандр) — после 1 режима сразу переключается на 3 режим.
Попробую сам разобраться
+
avatar
  • yurok
  • 15 марта 2016, 16:17
0
ой… :)

нулевой удалил — теперь надо:

byte CurrentMode = 0;

// начинаем с первого режима
CurrentMode = 0; — два раза там

// первый режим не требует контроля времени, поэтому отработаем его тут
if (in_mode == 0) {

на один режим меньше стало и первый стал нулевым
+
avatar
  • ksiman
  • 15 марта 2016, 17:35
0
Завтра проверю, коробочка на работе осталась работать :)
+
avatar
  • ksiman
  • 17 марта 2016, 09:26
0
Проверил, работает нормально :)
Ваш скетч немного отформатировал и добавил в статью.
Листинг и скомпилированная программа стали немного короче, но как она работает до конца не понял
+
avatar
  • yurok
  • 17 марта 2016, 11:17
+2
ну и хорошо
может кому-то пригодится :)

там еще можно оптимизировать — но смысла нет
+
avatar
0
Кстати, странно, что никто не упомянул про EN вход у MT3608. Вероятно, здесь полезнее управлять затвором полевика, но есть ещё способ посылать логический сигнал на enable вход в повышайке, но иногда это очень полезно. При логическом нуле на EN входе (это pin4, левая ножка со стороны входа, спаянная с плюс-питанием вместе, её вполне легко можно отогнуть булавкой, например, либо даже дорожку перерезать) она жрёт 0.1 микроампера. Хотя да, для красивой формы сигналов (в случае высокоимпендансной нагрузки) полевик на выходе уже после кондёров целесообразнее.
А для не-сигнальных задач — Enable вход :)