плавное снижение шим от ик-пульта

holodAleksey
Offline
Зарегистрирован: 19.12.2016

приветствую всех.

сразу поясню - в си - я дубовый. пишу на FBD.

задача была прицепить LED-подсветку через шим, к пульту от телевизора, что б перед сном не вставать, когда лениво.
железяка собрана, работает без сбоев уже 2 месяца, но в урезанном виде.
поскольку с командой повтора FFFFFFFF  разобраться не смог (не поддерживает прога по созданию алгоритмов в FBD), регулируется шагами, при первом включении 62 (из 255), шаг+/- по 10). в-принципе, лучше чем ничего.
рабочий скетч и алгоритм во вложениях.
однако, буду признателен, если кто-то поможет дописать скетч на повтор команды, пока
кнопка нажата и, соответственно, пока летит команда FFFFFFFF .
Спс!

#include <IRremote.h>
IRrecv irRessPin2(2);
decode_results irRessPin2Res;
bool irRessPin220DFBD42 = 0;
bool irRessPin220DF4DB2 = 0;
bool irRessPin220DFCD32 = 0;

bool _trgt1 = 0;
bool _trgt1I = 0;
bool _gen2I = 0;
bool _gen2O = 0;
unsigned long _gen2P = 0UL;
bool _count2I = 0;
int _count2P = 0;
int _swi1;
void setup()
{
irRessPin2.enableIRIn();
}
void loop()
{ if (irRessPin2.decode(&irRessPin2Res)) {
irRessPin2FillVar(&irRessPin2Res);
irRessPin2.resume(); }else {irRessPin2ResVar(); }




bool  _tmp1 = irRessPin220DFBD42;
if (_tmp1)  { if (! _trgt1I) _trgt1 = ! _trgt1; } 
_trgt1I = _tmp1; 
if (!(( (( ((242) > ((62)+((_count2P)*(10)))) && (((62)+((_count2P)*(10))) > (2)) )) || (( (irRessPin220DF4DB2) && ((242) > ((62)+((_count2P)*(10)))) )) || (( (irRessPin220DFCD32) && (((62)+((_count2P)*(10))) > (2)) )) ))) {if (! _gen2I){_gen2I = 1; _gen2O = 1; _gen2P = millis();}} else { _gen2I = 0 ; _gen2O= 0; } if (_gen2I &&  _gen2O)   _gen2O = !( _isTimer( _gen2P , 20 ));
if(( (_trgt1) && (!(_gen2O)) ))
{_swi1=(62)+((_count2P)*(10));}
else
{_swi1=0;}

if (( (( (((62)+((_count2P)*(10))) > (2)) && (irRessPin220DF4DB2) )) || (( ((242) > ((62)+((_count2P)*(10)))) && (irRessPin220DFCD32) )) )) 
   { 
   if (! _count2I)  
      {
        if (( ((242) > ((62)+((_count2P)*(10)))) && (irRessPin220DFCD32) )) {_count2P = _count2P+1;} else {_count2P = _count2P-1;};
       _count2I = 1;
      }
   }
else
   {
   _count2I=0;
   }
analogWrite(5, _swi1);




}
bool _isTimer(unsigned long startTime, unsigned long period )
  {
  unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
  }
void irRessPin2FillVar(decode_results *irRessPin2Res) {
long tempRes;
byte tempType;
tempRes=(irRessPin2Res->value); 
tempType=(irRessPin2Res->decode_type); 
if(!(tempRes == -1)) {if ((tempRes == (0x20DFBD42))&&(tempType == 1)) {irRessPin220DFBD42 = 1;} else {irRessPin220DFBD42=0;}
if ((tempRes == (0x20DF4DB2))&&(tempType == 1)) {irRessPin220DF4DB2 = 1;} else {irRessPin220DF4DB2=0;}
if ((tempRes == (0x20DFCD32))&&(tempType == 1)) {irRessPin220DFCD32 = 1;} else {irRessPin220DFCD32=0;}
}}
void irRessPin2ResVar() {
irRessPin220DFBD42 = 0;
irRessPin220DF4DB2 = 0;
irRessPin220DFCD32 = 0;
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Повтор команды - да легко, как в этом пробном тесте к примеру:

#include "IRremote.h"
IRrecv irrecv(11);          // Указываем пин, к которому подключен приемник
decode_results results;
long keyCode;
unsigned long last = millis();
 
void setup()
{
  Serial.begin(9600); // Выставляем скорость COM порта
  irrecv.enableIRIn(); // Запускаем прием
}
 
void loop() {

  /*
  if (irrecv.decode(&results)) // Если данные пришли 
  {
    Serial.println(results.value, HEX); // Отправляем полученную данную в консоль
    irrecv.resume(); // Принимаем следующую команду
  } */

  if (irrecv.decode(&results)) {
  if (millis() - last > 250) {
  keyCode = results.value;
  Serial.println(keyCode, HEX);
  }
  last = millis();
  irrecv.resume();
}
}             

 

holodAleksey
Offline
Зарегистрирован: 19.12.2016

трабл изначально не в том, как вывести расшифровку команды в сериал принт, а в том, что нековский пульт шлет один раз команду, а потом пока не отпустишь команду повтора

как тут:

http://arduino.ru/forum/programmirovanie/vypolnit-komandy-s-ik-pulta

a5021
Offline
Зарегистрирован: 07.07.2013

Цитата:

if (!(( (( ((242) > ((62)+((_count2P)*(10)))) && (((62)+((_count2P)*(10))) > (2)) )) || (( (irRessPin220DF4DB2) && ((242) > ((62)+((_count2P)*(10)))) )) || (( (irRessPin220DFCD32) && (((62)+((_count2P)*(10))) > (2)) )) ))) {if (! _gen2I){_gen2I = 1; _gen2O = 1; _gen2P = millis();}} else { _gen2I = 0 ; _gen2O= 0; } if (_gen2I &&  _gen2O)   _gen2O = !( _isTimer( _gen2P , 20 ));
if(( (_trgt1) && (!(_gen2O)) ))
{_swi1=(62)+((_count2P)*(10));}
else
{_swi1=0;}

if (( (( (((62)+((_count2P)*(10))) > (2)) && (irRessPin220DF4DB2) )) || (( ((242) > ((62)+((_count2P)*(10)))) && (irRessPin220DFCD32) )) )) 
   { 
   if (! _count2I)  
      {
        if (( ((242) > ((62)+((_count2P)*(10)))) && (irRessPin220DFCD32) )) {_count2P = _count2P+1;} else {_count2P = _count2P-1;};
       _count2I = 1;
      }
   }
else
   {
   _count2I=0;
   }

Вы нечеловеческой логики человек.

holodAleksey
Offline
Зарегистрирован: 19.12.2016

сам вы... человек. Повторю, пишу на фбд, а эта абракадабра выше - для меня как сомалийская газета, и она - результат АВТОМАТИЧЕСКОЙ конвертации из фбд в ардуинский с.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

a5021 пишет:

Вы нечеловеческой логики человек.

Это ИИ :)

holodAleksey
Offline
Зарегистрирован: 19.12.2016

всем участвовавшим, в том числе клоунам и шутам, спасибо, задача полностью реализованна посредством среды разработки FBD.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

holodAleksey пишет:

задача полностью реализованна посредством среды разработки FBD.

За это надо накатить!