Итак, друзья-коллеги, как известно: Лень-двигатель прогресса! и это не шутка.
Именно она побудила идею автоматизировать процесс включения и выключения сабвуфера. Ибо лень! каждый раз вставать с дивана, подходить к сабу, наклоняться, искать на ощуп сзади и щелкать выключателем. Еще больше лень! берет когда нужно запустить обратный процесс) - Выключить онный гаджет.
Ну так вот: с причиной определились. Теперь разберемся со следствием.
Пытливый ум начал генерировать разные методы реализации, искать решения и наткнулся на некий готовый конструктор "собери сам". Цена 700 руб. Не фонтан, конечно, но мозг диктует свои условия - ты же можешь сам собрать?! Не буду останавливаться на этом конструкторе, скажу только, что закупил аж 3! комплекта из которых заработал один и то на очень короткое время: я даже не успел его в корпус Саба собрать.
NM0110 - Набор для сборки автоматического выключателя электроприборов
Плюнул я на это дело и решил прибегнуть к любимым дуням)
Для начала подумал собрать на микрофонном усилителе (статья от Geekmatic), но версия провальна была тем, что чихнет кто и Саб проснется. Так что - Отбой идее! Делаем линейный вход!
Под рукой борд Нано, модуль реле, провода, паяльная станция, кембрики, блок питания от телефона, USB штырь и ведро энтузиазма!
Сначала собираем все это дело на макетной плате, дабы проверить работоспособность, а уж потом внедряем в сам Саб.
Итак, соединяем все как показано на схеме.
Паяем логический вход реле к контакту D6 на Нано.
Далее, как говорится: плюс к плюсу, минус к минусу.
Берем сигнал с предусилителя ресивера на Саб и, через делитель подаем его на аналоговый вход А5 Нано.
На питании ставим конденсатор 470 мкф на 16В - этого будет достаточно, во избежание всяких помех.
Все, блок управления собрали.
Пишем скетч для нашей приблуды.
Назначаем входы и выходы.
// by Imperator
// by Geekmatic
// by Guyver
const int sampleWindow = 50; // время выборки значений mS (50 mS = 20Hz)
unsigned int sample;
#define relay 6 // пин реле
unsigned long timeout;
void setup() {
pinMode(relay, OUTPUT);
//Serial.begin(9600);
}
void loop() {
unsigned long startMillis= millis();
unsigned int peakToPeak = 0; // размах колебаний
unsigned int signalMax = 0;
unsigned int signalMin = 1024;
// собираем данные на протяжении 50 mS
while (millis() - startMillis < sampleWindow) {
sample = analogRead(A5); // пин Входного сигнала
if (sample < 1024) {
if (sample > signalMax) {
signalMax = sample; // сохранение максимального значения
}
else if (sample < signalMin) {
signalMin = sample; // сохранение минимального значения
}
}
}
peakToPeak = signalMax - signalMin; // max - min = размах колебаний
static bool flag = false;
static uint32_t debounce;
if (peakToPeak > 3) {
if (!flag && millis() - debounce > 3000) {
flag = true;
digitalWrite(relay, 1);
}
if (flag) debounce = millis();
} else if (peakToPeak <=2) {
if (flag && millis() - debounce > 180000) {
flag = false;
digitalWrite(relay, 0);
}
if (!flag) debounce = millis();
}
Serial.println(peakToPeak);
}
В скетче делаем выборку значений за каждые 50мс (больше-меньше можете пробовать).
Из этой выборки выделяем размах колебаний и получаем максимальный и минимальный уровень входящего сигнала.
Чтобы все это дело отследить - открываем монитор порта.
После настройки не забудьте закомментить эти строки прежде чем окончательно прошьете плату перед встраиванием в корпус Саба!
В противном случае ваша плата тупо будет сканировать и отсылать в никуда данные о входящем сигнале. Ничего смертельного не случится, но мы ж блюдем за железо и лишними телодвижениями нашего брата не грузим))
Гуд! Собрали, подключили USB, прошиваем и... - смотрим в монитор порта.
Смотрим в книгу и видим ...? Правильно! Бегущие циферки. Если все верно собрано, то видим сплошь нули. А теперь дотронемся до входа на делителе - И! Реле включилось, поползли циферки вверх. Сигнал идет значит.
Плотно зажимаем пальцами вход - видим максимум 1023. Отпускаем - ноль. Работает)
Теперь в скетче указываем пороговые значения, при которых должно включаться и выключаться наше реле. Пусть реле будет включаться с 300 единиц. Пишем 300. И тут самое интересное над чем я мучился 2 дня. В итоге помог Гайвер. Спасибо ему!
В другой версии помог Elephant, но не сработало как надо.
Смысл в чем?
При поступлении сигнала функция отслеживает длительность данного сигнала какое то время прежде чем включить реле. Некая задержка. Проверяет: не наводка ли была или какая-то заблудшая искра откуда-то. Одним словом проверка, во избежание ложных срабатываний.
Итак, ставим задержку 2-3 секунды (у вас может быть другое значение, чуть позже поясню почему*).
Включили. Сигнал подали. Реле замкнулось. Отлично!
Теперь надо как то ее выключить, когда надоест слушать музыку или когда соседи начнут барабанить по батареям.=)
Пишем нижний порог при котором реле в случае отсутствия сигнала должно выключиться. Пусть будет 2. Не ставим 0 потому, что даже мало-мальские наводки выше 0 могут не дать отключится реле и будут поддерживать жизнь Саба до состояния анабиоза.
Пишем задержку отключения минут 2 или 3. Почему так много? Потому что между треками могут быть длинные паузы. А при просмотре фильма и того больше и наш Саб будет мигать как рождественская елка. Что не дело, конечно.
Теперь, когда мы включаем ресивер, Саб гордо молчит. Включаем музыку, прошло 2 сек и реле включилось. Затем мы выключаем ресивер. Саб ждет 2 минуты и выключается. Цель достигнута. Лень породила умную электрическую схему.
Думаю, многим пригодится в хозяйстве. Кроме звукового сигнала на входе так же можно использовать термо- или фото-датчик. Там уже куда ваши фантазии приведут. Дерзайте.
Пользуйтесь и не забывайте ставить лайки если понравилось.))
Позже может сниму видео сборки. Выложу как только так сразу.
*- почему у вас могут быть иные показатели? у каждого ресивера свои прихоти и настройки. На моем, например, я выставил минимум - <=2, а максимум - >3. До окончательной прошивки рекомендую подключить вход к ресиверу, проверить уровни сигналов в мониторе порта, выставить свои пределы, еще раз проверить, закомментить строки кода с выводом в монитор порта и только после всего этого прошить окончательно и внедрить в корпус Саба.