Как сделать плавное включение светодиодной ленты с ИК приемника?

Уважаемые, приветствую.

Закопался тут в программировании одного скетча для Arduino, в общем есть работающий скетч который включает плавно LED лампу при помощи PIR-датчика:

#define fadePin 3 //пин управления MOSFET транзистором

int pirPin = 2;  //пин подключения управляющего сигнала PIR датчика
int light;       //переменная для хранения состояния света (вкл/выкл)
void setup(){
  pinMode(pirPin, INPUT);  //настариваем 2 пин как вход для сигналов с датчика
  pinMode(fadePin, OUTPUT);// 3 пин на выход, для управления транзисотором
  light = 0;     //устанаваливаем переменную для первого включения света
}

void loop(){
   if(digitalRead(pirPin) == HIGH )  //если сигнал с датчика высокого уровня(т.е. есть движение)
   {
     if(light == 0)   //и если свет не был включен
     {
       for(int i=0; i<=150; i++)  //то плавно включаем свет
       {
       analogWrite(fadePin, i);
       delay(10);   //каждые 10мс увелияение на 1
       }
       light = 1; //и передаем значение переменной, что свет включен
     }
   }
   else  //иначе
   {
     if(light == 1) //если свет включен
     {
       for(int i=150; i>=0; i--)//плавно гасим его
       {
       analogWrite(fadePin, i);
       delay(10);
       }
       light = 0; //и передаем значение переменной, что свет выключен
     }
   }
}


Так же есть простой скетч который включает/выключает LED по заданным кнопка с ПДУ:

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup() {
  irrecv.enableIRIn(); // запускаем прием
}

void loop() {
  if ( irrecv.decode( &results )) { // если данные пришли
    switch ( results.value ) {
    case 0xE0E0E01F:
        digitalWrite( 13, HIGH );
        break;
    case 0xE0E0D02F:
        digitalWrite( 13, LOW );
        break;
    }   
    irrecv.resume(); // принимаем следующую команду
  }
}


Появилась необходимость сделать плавное включение/выключение LED ленты с ПДУ. Я так понимаю мне нужно заменить команду включения светодиода на плавную подачи нагрузки, буду признателен за помощь с кодом ребят. Думаю такая наработка будет многим полезна, схемку потом выложу.
  • Вопрос задан
  • 4696 просмотров
Решения вопроса 1
a_volkov1987
@a_volkov1987
Инженер-схемотехник
Да, можно просто объединить код первого и второго скетча
#include <IRremote.h>
#define fadePin 3

int RECV_PIN = 11;
int light;
IRrecv irrecv(RECV_PIN);

decode_results results;

void setup() {
	irrecv.enableIRIn(); // запускаем прием
	pinMode(fadePin, OUTPUT);
	light = 0;
}

void loop() 
{
	if ( irrecv.decode( &results )) 
	{ // если данные пришли
		switch ( results.value ) 
		{
			case 0xE0E0E01F:
			{
				if(light == 0)   //и если свет не был включен
				{
				for(int i=0; i<=150; i++)  //то плавно включаем свет
					{
						analogWrite(fadePin, i);
						delay(10);   //каждые 10мс увелияение на 1
					}
				light = 1; //и передаем значение переменной, что свет включен
				}
			}
			break;
			case 0xE0E0D02F:
			{
				if(light == 1) //если свет включен
				{
					for(int i=150; i>=0; i--)//плавно гасим его
					{
						analogWrite(fadePin, i);
						delay(10);
					}
					light = 0; //и передаем значение переменной, что свет выключен
				}
			}
			break;
		}   
	irrecv.resume(); // принимаем следующую команду
	}
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы