Переделка автоматического освежителя Airwick
Введение
Бренд автоматического спрея AirWick давно известен. Давным давно и я как-то поверил рекламе и купил себе это чудо. Но недолгий "ВАУ!!!!" эффект сменился быстрым разочарованием. Прежде всего меня не устраивало время работы от одного баллончика.
Действующий режим срабатывания таймера через 9, 18 или 36 минут, меня тоже не радовал. Во первых это неоправданный расход баллона, соответственно (160, 80, 40 срабатываний в сутки соответственно), ненужная работа в ночное время или в отсутствии хозяев. Так что после пары заправок чудо распылитель был закинут в самый дальний и темный ящик стола на долгие годы.
И вот совсем недавно у меня что-то очень сильно зачесались руки модернизировать это чудо китайской мысли.
Концепция проекта
Путем недолгих размышлений была выдвинута цепочка следующих умозаключений. Распыления спрея требуется лишь после длительных заседаний в туалете по великим делам. В темноте там сидеть как-то не очень комфортно, значит необходимость освежения воздуха возникает лишь при включенном свете. Значит надо привязать работу устройства ко включению света в санузле. Но в туалет-то ходят не только по великим делам. Значит и освежать воздух требуется не при каждом включении света, а лишь по прошествии определенного промежутка времени. Например поход по маленькому редко занимает по времени больше 2 минут. Значит надо как-то учитывать этот момент распылитель не включать.
С этими мыслями понял, что для заводской платы управления это слишком сложно поэтому решил все управление свежестью воздуха доверить Arduino Nano. Батарейки менять постоянно, тоже не очень интересно, поэтому питание схемы решал сделать от аккумулятора. Отслеживание включения света решил сделать по простому. С помощью фоторезистора. При превышении порогового значения уровня света ардуино подавало бы питание на затвор MOSFET транзистора, а тот, в свою очередь, подавал бы питание на привод открытия клапана баллончика.
Схема проекта
В результате получилась следующая схема
Техническая часть и размещение в корпусе
Ардуино сам по себе довольно прожорливый так что для уменьшения энергопотребления сразу была перерезана дорожка на светодиод питания и выпаян стабилизатор напряжения
Вся электроника довольно компактно, размещается в корпусе распылителя. Ардуино на место заводской платы садится как влитая. Аккумулятор разместился в батарейном отсеке
А фоторезистор в крышке
Написание скетча
Настало время скетча. Для написания были использованы сторонние библиотеки: GyverPower - уменьшение энергопотребления устройства и перевод его в спящий режим. а также GyverTimer, для более удобной работы с таймерами. Скачать их можно через Менеджер билиотек Arduino IDE просто вбив их название в поиске
Логика работы
Теперь непосредственно по логике работы. При подаче питания распылитель выполняет калибровку внутренних таймеров и тут же уходит в глубокий сон. Потребление при этом падает до 1-2 мА. Через 8 секунд он просыпается и опрашивает фоторезистор. Если полученное значение больше порогового, то устройство понимает, что свет включен и начинается работа основного цикла программы
Запускается 2 минутный таймер. Если по истечении времени свет не был выключен, то распылитель понимает, что вы тут надолго и по истечении 4 минут после включения света произойдет распыление освежителя. Если уложились в 2 минуты и выключили свет, то устройство уходит в спячку на 8 секунд, чтобы потом проснуться на 0.5 секунды, проверить не включили ли вы свет и снова уснуть на следующие 8 секунд.
Теперь рассмотрим вариант, что вы уложились от 2 до 4 минут. Тогда после выключения света - аэрозоль распыляется, по истечении 4 минут после первого включения света и устройство переключается в спящий режим с низким энергопотреблением.
Ну и, наконец, если вы в туалете сидите больше 4 минут, то аэрозоль просто будет распыляться каждые 4 минуты, пока вы не уйдет и не выключите свет
Все интервалы и пороговые значения яркости проверяются в скетче в этом условии
if (val>500)
if (waitFart.isEnabled()!=true) waitFart.setInterval(240000); //4 минуты
if (wePiss.isEnabled()!=true && fart==false) wePiss.setInterval(120000); // 2 минуты
}
val>500 - вместо 500 ставим любое число от 1 до 1023. Пороговое занчение яркости света. Подбирается индивидуально. Например для одной лампочки накаливания 60W значение будет в районе 300-400
waitFart.setInterval(240000) - здесь 240000 - это время в миллисекундах интервал распыления аэрозоля. 1сек=1000мс . Соответственно 1 минута это 60000мс
wePiss.setInterval(120000) - здесь настраивается задержка по истечении которой распыление аэрозоля гарантированно произойдет
Функции энергосбережения
- Для более экономного расхода аккумулятора в проект интегрированы функции энергосбережения:
- Отключены шины I2C и SPI
- Установлен режим POWERDOWN_SLEEP. Наиболее глубокий сон, отключается всё кроме WDT и внешних прерываний, просыпается от аппаратных (обычных + PCINT) или WDT.
- Предделитель системной частоты установлен на 2. То есть, частота процессора и памяти уменьшена вдвое. Можно и больше урезать, но стабильность работы будет не очень.
Заключение
После данной модификации пользуюсь автоматическим распылителем по назначению уже больше месяца. За это время не менял ни баллон, которого раньше хватало меньше чем на месяц, ни заряжал аккумулятор емкостью 1200 mAh. Заряда там еще месяца на 3 хватит, если верить мультиметру. Так что считаю, что эксперимент удался
Ссылка на скетч во вложении