плавное снижение шим от ик-пульта
- Войдите на сайт для отправки комментариев
Втр, 20/12/2016 - 00:04
приветствую всех.
сразу поясню - в си - я дубовый. пишу на 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;
}
Повтор команды - да легко, как в этом пробном тесте к примеру:
#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(); } }трабл изначально не в том, как вывести расшифровку команды в сериал принт, а в том, что нековский пульт шлет один раз команду, а потом пока не отпустишь команду повтора
как тут:
http://arduino.ru/forum/programmirovanie/vypolnit-komandy-s-ik-pulta
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; }Вы нечеловеческой логики человек.
сам вы... человек. Повторю, пишу на фбд, а эта абракадабра выше - для меня как сомалийская газета, и она - результат АВТОМАТИЧЕСКОЙ конвертации из фбд в ардуинский с.
Вы нечеловеческой логики человек.
Это ИИ :)
всем участвовавшим, в том числе клоунам и шутам, спасибо, задача полностью реализованна посредством среды разработки FBD.
задача полностью реализованна посредством среды разработки FBD.
За это надо накатить!