Плавная подсветка на кухне
- Войдите на сайт для отправки комментариев
Чт, 14/12/2017 - 20:50
/*****************************************************************************************************************************/
// Управление подсветкой мойки на кухне звуком хлопка на ATtiny85
// Версия 1.03 от 23-11-2017
// Используется микрофонный модуль на основе микрофона и компаратора LM393,
// блок питания на 12В-5А, стабилизатор на 5 вольт, 4 элемента 2-И-НЕ (561ЛА7),
// ToDo:
// 1. добавить фоторезистор для контроля внешнего освещения
// 2. яркость свечения ленты зависит от тока не пропорционально, возможно нужно менять ток нелинейно
//
// Состояние: включен (0) или выключен (1)
int _statusLight;
// Функция сброса RS-триггера в исходное состояние
void fnSetRsTrigger()
{
digitalWrite(3, LOW);
delay(20);
digitalWrite(3, HIGH);
}
// Функция плавного зажигания (плавного гашения) светодиодной ленты
// Если параметр равен 0, то плавно зажигаем, если равен 1, то плавно гасим
void fnLightOnOff(int OnOff)
{
switch(OnOff)
{
// Плавно зажигаем
case 0:
{
for(int i = 255; i >= 0; i--)
{
analogWrite(4, i);
delay(10);
}
break;
}
// Плавно гасим
case 1:
{
for(int i = 0; i <= 255; i++)
{
analogWrite(4, i);
delay(5);
}
break;
}
}
}
void setup()
{
// Начальное состояние - подсветка выключена
_statusLight = 1;
// Выход RS-триггера подключен ко входу D2
// Данный пин будет анализировать состояние RS-триггера
// При поступлении сигнала с датчика звука триггер (выход ЛА7 4) устанавливается в 0
pinMode(2,INPUT);
// Пин D3 управляет сбросом RS-триггера - сбрасывает его в исходное состояние (1)
pinMode(3, OUTPUT);
// Устанавливваем триггер в исходное состояние - выход 4 в лог. 1
fnSetRsTrigger();
// Данный пин D4 управляет транзистором подсветки
pinMode(4, OUTPUT);
// Выключаем подсветку
digitalWrite(4, LOW);
}
void loop()
{
delay(10);
// В цикле начинаем читать вход D2 и если он будет равен 1, то это значит, пришел "хлопок"
if(digitalRead(2) == 1)
{
// Проверяем статус выключателя
switch(_statusLight)
{
// Если выключен, то включаем
case 1:
{
_statusLight = 0;
fnLightOnOff(_statusLight);
break;
}
// Если включен, то выключаем
case 0:
{
_statusLight = 1;
fnLightOnOff(_statusLight);
break;
}
}
// Сбрсываем триггер в исходное состояние
fnSetRsTrigger();
}
}