Плавная подсветка на кухне

Нет ответов
ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011
/*****************************************************************************************************************************/
// Управление подсветкой мойки на кухне звуком хлопка на 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();
    
    } 
}