Главная » Статьи » Проекты

Включаем свет по хлопку

 Вот представьте, заходишь в комнату, темнота, ничего не видно, ползком по стеночке идешь до включателя освещения... Или просто лень встать и дойти до выключателя чтобы выключить свет в комнате.... а лень как известно двигатель прогресса. Захотелось собрать такую девайсину, чтобы свет вырубала по хлопку, но по одному хлопку слишком просто и не эффективно - будет светомузыка не по делу, поэтому сделал детектор двух хлопков с определенным интервалом. Заодно разобрался как задействовать прерывание от встроенного в МК компаратора.


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


  При появлении первого хлопка, фиксируем его появление, запускаем таймер, выжидаем некоторое время чтобы эхо утихло и ждем появление следующего хлопка. Если следующий импульс пришел слишком рано и попал в красную зону, считаем что это посторонний шум и объявляем сессию ошибочной. Останавливаем и сбрасываем таймер, обнуляем переменные. Если импульс попал в зеленую зону (зону ожидания хлопка), фиксируем его появление увеличением значения переменной и ждем пока таймер переполнится и вызовет прерывание. Если после второго импульса была тишина, то в обработчике прерывания таймера переключим нагрузку. Если второй хлопок пришел слишком поздно и попал в красную зону будем считать, что это тоже был шум. Если после второго удачного хлопка, во время ожидания переполнения таймера, появился еще один импульс, так же будем считать что это шум и объявим ошибку. 

  С общим алгоритмом разобрались, теперь к железу. В качестве мозга выбран attiny2313, с задачей бы справилась и attiny13, но такой мелочи у меня не оказалось. Да и памяти в мк остается свободной достаточно, чтобы навесить на устройство еще какую-нибудь задачку. Поэтому свободные ноги не помешают. Например, можно навесить фотодиод и позволять включать свет только когда достаточно темно. Или объединить устройства в общую сеть посредством UART и мониторить в какое время и на сколько включалось освещение. В общем почвы для фантазии более чем достаточно.

  В качестве исполнительного устройства, взял симистор BTB16-600CW и оптопару для него MOC3022 без детектора нуля. Хотя пойдет и с зеро-кросс, лампочке пофиг. 

  Роль звукоуловителя у меня выполняет пьезопищалка от китайских часов, такие еще в системниках пищат. Пробовал динамик 3-ГДШ, ловит хлопки замечательно, а вот размеры совсем не те.... 

 Если есть динамик КМЭ-3 его тоже можно применить в этой схеме (спасибо товарищу Вольдемору за испытания):



 Использовав предусилитель, как на схеме:


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

Вот что получилось:


плата в SL5






$regfile = Attiny2313.dat
$crystal = 4000000  'частота 4 МГЦ

Dim I As Byte       'проверяем эту переменную на число срабатываний,
                    'если равно 2 тогда нагрузку включаем/выключаем

Dim R As Byte       'инкрементируем переменную в прерывании от компаратора

Dim A As Word       'переменная которую приравниваем со значением таймера 1

Dim Fail As Bit     'переменная ошибки, если не равно 0, тогда в сессии
                    'произлошла ошибка. Нагрузка переключена не будет

'конфигурация перефирии

'настройка таймера1, переполнение будет происходить ~ каждую 1 сек
Config Timer1 = Timer , Prescale = 64 , Capture Edge = Falling

'настраиваем компаратор на прерывание по нисхдящему фронту
Config Aci = On , Trigger = Falling

'настраиваем выход для исполнительного устройство включения/выключения
Config Portb.2 = Output

'настраиваем выход для подключения светодиода
Config Portd.4 = Output

'настраиваем прерывание INT0, подключается кнопка
Config Int0 = Falling

'ссылки на обработчики прерываний
On Timer1 Res:
On Aci Comp:
On Int0 Button:

'разрешаем все что включили
Enable Interrupts
Enable Aci
Enable Capture1
Enable Timer1
Enable Int0

'останавливаем и сбрасываем таймер
Stop Timer1
Timer1 = 0

Portd.4 = 0         'выставляем на ноге светодиода 0


Do 'основной цикл программы

If I = 2 Then

Disable Interrupts

Toggle Portb.2

I = 0

Reset Portd.4

Wait 1

Enable Interrupts

End If

Loop

Comp:               'обработчик прерываний от компаратора

Acsr.3 = 0          'вырубаем прерывания от компаратора

If R = 0 Then       'проверяется значение переменной, если значение переменной равно 0,
                    'значит это первое срабатывание компаратора

Incr R              'инкрементируем переменную
Start Timer1        'запускаем таймер1
Set Portd.4         'зажигаем светодиод
Waitms 110          'ждем некоторое время, чтобы не ловить эхо


Else                'в противном случае (если переменная не равна 0) считаем, что
                    'это не первый импульс

A = Timer1          'присваиваем переменной текущее значение таймера1 (для Т1 от 0 до 65535)

If A <= 26000 Then  'если значение переменной меньше заданной величины (примерно 400 мс),
                    'тогда считаем что пришедший сигнал является шумом

R = 0               'сбрасываем переменную

Stop Timer1         'останавливаем таймер
Timer1 = 0          'сбрасываем таймер в 0
Reset Portd.4       'гасим светодиод

Else                'в противном случае, сравниваем переменную с другим значением

If A > 40000 Then   'если переменная больше заданного значения (примерно 600 мс),
                    'считаем что сигнал пришел слишком поздно и он тоже является шумом

Fail = 1            'ставится флаг ошибки

Else                'в противном случае (второй сигнал пришел тогда когда нужно)

Incr R              'увеличиваем значение переменной
Waitms 110          'ждем чтобы исключить эхо

End If
End If
End If

Acsr.3 = 1      'снова включаем прерывания от компаратора
Acsr.4 = 1      'сбрасываем флаг прерывания от компаратора, так как импульс пришедший
                'вслед за предыдущим записывается сюда и как только закончится обработка
                'первого события тут же произойдет обработка второго события, что вызовет ошибку.

Return          'возращаемся в основной цикл и ждем прерывания от Т1

Res:               'прерывание от таймера1

Stop Timer1        'останавливаем таймер
Timer1 = 0         'сбрасываем значение таймера1 в 0
Reset Portd.4      'гасим светодиод

If Fail = 0 Then      'проверка флага ошибки, если ошибки нет тогда
I = R                 'присваиваем переменной значение другой переменной)
R = 0                 'сбрасываем первую переменную в 0

Else                  'иначе, если флаг ошибки > 0

Fail = 0              'сбрасываем флаг ошибки в 0
R = 0                 'сбрасываем переменную в 0

End If

Return


Button:               'прерывание от кнопки, можем включать/выключать нагрузку кнопкой

Toggle Portb.2
Wait 1
Gifr = 64             'сбрасываем регистр хранения внешнего прерывания INT0
Return

End

 А это уже испытания. Предупреждаю тех, кто захочит повторить: хоть развязка контроллера в схеме предусмотрена, все равно имеются открытые участки находящиеся под высоким сетевым напряжением. Лучше использовать симисторы в герметичных корпусах TO220FP или залить всю плату после сборки эпоксидкой....или постараться работать аккуратно. Короче я предупредил =)






 В архиве ниже можно скачать откомпилированный файл. В нем также находятся исходник
и hex файлы для детектирования 3х хлопков по тому же алгоритму. 

 Скачать

 Печатная плата в формате .lay

Категория: Проекты | Добавлено: 17.02.2011
Просмотров: 59479 | Комментарии: 185 | Теги: bascom-avr, sensor, attiny2313 | Рейтинг: 4.7/19
Всего комментариев: 1851 2 3 ... 6 7 »
0  
185 exersizze   (14.05.2016 01:11)
Я не пробовал подключать энергосберегающую, возможно будет моргать. Как подключить реле к микроконтроллеру можно глянуть здесь http://www.getchip.net/posts....agruzku

184 FoxS_1   (12.05.2016 21:25)
Добрый вечер. Подскажите, пожалуйста, как к схеме подключить реле вместо симистора, если можно схему. Просто надо включать енергосберегайку, а с симистором, как я понял, будут проблеммы в работе. Большое спасибо за ответ.

+1   Спам
183 sparic   (04.01.2016 20:38)
Собрал и я. Давно хотел такую штуку, но бороздя интернет ничего стоящего не попадалось. Поначалу были проблемы с очень низкой чувствительностью и усилитель не помогал. Но после, заменил в схеме R6 и R2 на 4.7 кОм и немного подстроил RV1, как у автора в печатной плате, а не на схеме (почему то!?), и теперь удалось добиться реагирования с полуметра на клацанье шариковой авторучки, ну и соответственно на хлопки по всей однокомнатной квартире :) В конструкции применен микрофон с радиотелефона, так же подходят с мобильных телефонов, только для каждого из микрофонов необходимо подстраивать RV1. Спасибо за девайс!

182 nevec   (05.12.2015 19:54)
Всем привет. Собрал сие чудо на макетке. Творится лютая дичь. Лампа загорается не только от того, что кнопку нажмешь, но и просто от поднесения пальца в район кнопки, при этом ничего не касаясь, и также поднесением пальца и выключается. На хлопки и дуновения микрофоны не реагируют. Пробовал на пищалке от системника, на элекретном микрофоне и на пьезоизлучателе. Прошивал через ком порт программой юнипруф, фьюзы смотрел здесь в таблицах, но инвертировал ибо у юнипруф как я понял в отличии от понипрог если стоит галочка это значит выключено. Остальные элементы идентичны схеме, разве что пару резюков немного другого номинала. В чем может быть соль?

181 Leosix   (25.06.2015 21:13)
Здравствуйте
Можно переделать этот код для тини13?
буду очень благодарен

+1   Спам
180 m1x   (15.06.2015 01:02)
Еще одно видео работы девайса
https://www.youtube.com/watch?v=w_Zwn_Pa0Gk

179 m1x   (12.06.2015 02:31)
Спасибо автору! Собрал данную схему, заработала сразу. Пришлось только усердно искать ту грань чувствительности для срабатывания на звук. Усилители не собирал. Работает на капсюле повышенной чувствительности.
*В lay файле всетаки надо было дорисовать дорожку от резистора 4к7 до 6 вывода Attiny2313.

178 m1x   (11.06.2015 18:00)
В печатке, что в lay, ошибка? Там один из резисторов на 4к7 не попадает на 6 ногу тиньки.

177 sany2   (17.03.2015 00:26)
Ну практически весь этот форум "посвящён" одной программе-BASCOM-AVR.Попробуйте-у вас всё получится.

176 kirusha   (16.03.2015 16:09)
А может в личку кто скинуть свои варианты прошивки? sany2 а это в какой программе? я в Notepad programmers пробовал

+1   Спам
175 sany2   (13.03.2015 20:05)
kirusha ,в программе:настройка->компилятор->вывод->файлы пректа->галочка на hex

174 kirusha   (13.03.2015 14:04)
:) да наверно жестко звучит, но я реально в этой теме... )) находил я значения мс для всего что мне надо, а компиляция в .hex у меня почему то не выходит, потому и попросил помощи у знающих

0  
173 exersizze   (12.03.2015 22:04)
Ну человек и просит "подредактировать прошивку":)

172 sany2   (10.03.2015 17:22)
"Постепенный разгар лампы"-вроде здесь функция диммера не заложена

171 kirusha   (10.03.2015 14:44)
Может кто помочь подредактировать прошивку? Надо чтоб при нажатии кнопки включения не гасла лампа при доходе до максимальной яркости, снизить время на проведение двух хлопков и постепенный разгар лампы чуть увеличить. Может кто помочь все это сделать? Пытался сам, но моих знаний в этой сфере недостаточно даже чтоб файл скомпилировать

170 olexadr_r   (30.12.2014 13:07)
За неправильных фьюзов хлопок может не распознаваться?

169 sany2   (30.12.2014 00:44)
Ребята,смотрите фузе-бит skdiv8.В программе задержка Wait 1-если skdiv8 не отключён,то восемь секунд у вас программа будет просто висеть и не что не реагировать!И подтягивайте всегда ногу ресет к плюсу через резистор 10 килоом.

168 olexadr_r   (29.12.2014 16:35)
Пробовал микрофоны: МКЭ-3 и пищалку из системного блока, устройство не срабатывает.Что делать?

0  
167 exersizze   (02.12.2014 13:59)
Светодиод показывает что компаратор сработал и первый сигнал прошел. Для того чтобы загорелась лампочка нужно два последовательных сигнала с определенный задержкой между ними (читайте внимательно логику работы девайса)

166 olexadr_r   (30.11.2014 23:28)
Здраствуйте. Собрал этот прибор. Подую в микрофон светодиод включается, а лампочка никак не реагирует. Может кто сталкивался с таким?

165 sany2   (21.06.2014 22:08)
Отвечу за автора:Bascom-avr(Бейсик для avr)

164 r1   (21.06.2014 22:03)
добрый день,подскажите пожалуйста на каком языке писался ваш программный продукт
$regfile = Attiny2313.dat
$crystal = 4000000 'частота 4 МГЦ
....???

163 sany2   (21.06.2014 22:00)
Я вообще-то спрашивал не про галочки(в разных программах галочки могут стоять по разному).Фузе биты должны стоять на 4мгц от внутреннего генератора.skdiv8 должен быть отключён.Выставьте эту конфигурацию в своей программе.По cvar и ponyprog помочь не смогу - уже больше года с ними не работал и забыл всё.

162 Gacko2005   (21.06.2014 21:18)
Галочки стоят:
SUT0=0
CKSEL3=0
CKSEL2=0
CKSEL0=0
SPIEN=0

161 sany2   (21.06.2014 21:05)
Для начала:фузе-биты какие стоят?
Если заводские,то устройство будет работать в 4 раза медленнее

160 Gacko2005   (21.06.2014 20:27)
Дело происходит так! Подключаю питание 220В, потом подаю питание для микроконтроллера , светодиод в момент подачи 5В мгновенно включится и выключится! На все возможные хлопки устройство не реагирует, при любом положении переменного сопротивления! Далее щёлкаю кнопку - загорается лампа 220В!!! Если сразу нажать повторно, нет ни какой реакции! Через какое то время повторным нажатием отключается лампа 220В!!! Вот как то так!!!

159 sany2   (21.06.2014 19:48)
Чёт опять не пойму-кнопка для этого и есть:включать-выключать лампу.Опишите прблему точней.

158 Gacko2005   (21.06.2014 12:27)
Нет, наверное не правильно выразился! Загорается лампа 220В!!! Повторное нажатие через некоторое время приводит к отключению лампы!!!

157 sany2   (21.06.2014 12:19)
Да вроде кнопка для этого и сделана

156 Gacko2005   (21.06.2014 11:48)
Здравствуйте! Собрал данную схему, но при подаче питания и включения кнопки на плате сразу загорается лампа! В чём может быть проблема?!

1-30 31-60 61-90 ... 151-180 181-185
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






   EasyEDA:  бесплатный редактор схем

   ✓ Создание схем
   ✓ Возможность симуляции
   ✓ Быстрое создание печатных плат
   ✓ Интуитивно понятный интерфейс

   Нарисуй свою схему прямо сейчас!
   Изготовление печатных плат   https://easyeda.com/order
авторизация
Логин:
Пароль:
Комментарии
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
08.12.2016 - exersizze:
yorx выдалось немного свободного времени, проверил в симуляторе. Проблема...
Логгер температуры 2.0
05.12.2016 - Evgeny6873:
Хотел повторить схему и долго ждал дисплей, два раза заказывал с Китая, пришел. ...
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
01.12.2016 - yorx:
Доброго времени суток, exersizze попробовал Ваш код все равно не работает как на...
Помни об усадке!
30.11.2016 - pchela5:
Автомобильные никакие не лезут?
Помни об усадке!
29.11.2016 - AlekS:
Виктор, спасибо.
С заменой транса в зиму, перестройка не комельфо) Валяет...
Управляем микроконтроллером с ПК по UART
29.11.2016 - exersizze:
Михаил, для работы с инфракрасными датчиками и диодами есть команды RC5SE...
Управляем микроконтроллером с ПК по UART
29.11.2016 - Михаил:
Всем привет.
Подскажите как переменную S передать по инфракрасному каналу...
Помни об усадке!
29.11.2016 - pchela5:
> Если ленту светодиодную порезать и соединить последовательно
Только ...
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
29.11.2016 - exersizze:
yorx, вывод Q7 ' первой микросхемы соединен с DS второй микросхемы? С...


Лучшие цены на 3D принтеры
успей сделать себе подарок к Новому Году! ;)


Prusa i3

Prusa i3 от 12500 р.



Rostoсk

Rostock от 15000 р.