приветствую всех. сразу поясню - в си - я дубовый. пишу на FBD. задача была прицепить LED-подсветку через шим, к пульту от телевизора, что б перед сном не вставать, когда лениво. железяка собрана, работает без сбоев уже 2 месяца, но в урезанном виде. поскольку с командой повтора FFFFFFFF разобраться не смог (не поддерживает прога по созданию алгоритмов в FBD), регулируется шагами, при первом включении 62 (из 255), шаг+/- по 10). в-принципе, лучше чем ничего. рабочий скетч и алгоритм во вложениях. однако, буду признателен, если кто-то поможет дописать скетч на повтор команды, пока кнопка нажата и, соответственно, пока летит команда FFFFFFFF . Спс! Код (C++): #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; }
Ну ковыряться в вашем коде не буду. Если есть желание поковыряйтесь вы в моем. Там есть функция долгого нажатия на клавишу ИК Код (C++): /* Ик приемник -> 2 (IR_pin) серва servo1 ->3 (servo_pin[0]) 0-255 0-180 кнопкой "0"<->"1" серва servo2 ->5 (servo_pin[0]) 0-255 0-180 кнопкой "2"<->"3" серва servo3 ->6 (servo_pin[0]) 0-255 0-180 кнопкой "4"<->"5" серва servo4 ->9 (servo_pin[0]) 0-255 0-180 кнопкой "6"<->"7" серва servo5 ->10 (servo_pin[0]) 0-255 0-180 кнопкой "8"<->"9" */ //#1 const int IR_pin = 2; // пин Ик приемника #include "IRremote.h" IRrecv irrecv(IR_pin); decode_results results; //#2 const int servo_pin[] = {3, 5, 6, 9, 10}; // пин сервы servo1-servo5 #include <Servo.h> Servo servo_1, servo_2, servo_3, servo_4, servo_5; uint8_t servo[5] ; uint8_t i ; uint32_t value, value_old; void setup() { Serial.begin(9600); //#1 irrecv.enableIRIn(); //#2 servo_1.attach(servo_pin[0]); servo_1.write(servo[0] = 0); servo_2.attach(servo_pin[1]); servo_2.write(servo[1] = 0); servo_3.attach(servo_pin[2]); servo_3.write(servo[2] = 0); servo_4.attach(servo_pin[3]); servo_4.write(servo[3] = 0); servo_5.attach(servo_pin[4]); servo_5.write(servo[4] = 0); } void loop() { static uint32_t MILLIS ; MILLIS = millis() ; //#1 0,200 сек static uint32_t future1 = 0 ; if (MILLIS >= future1) { future1 = MILLIS + 200 ;// каждые 0,200 сек if ( ! irrecv.decode( &results )) value = 0; else value = results.value; switch (value) { case 0x0 : // нет приема case 0xFF6897: // кнопка "0" case 0xFF30CF: // кнопка "1" case 0xFF18E7: // кнопка "2" case 0xFF7A85: // кнопка "3" case 0xFF10EF: // кнопка "4" case 0xFF38C7: // кнопка "5" case 0xFF5AA5: // кнопка "6" case 0xFF42BD: // кнопка "7" case 0xFF4AB5: // кнопка "8" case 0xFF52AD: // кнопка "9" value_old = value; break; } switch (value_old) { case 0xFF6897: // кнопка "0" servo[0] = servo[0] + 1; if (servo[0] > 170)servo[0] = 170; servo_1.write(servo[0] ); break; case 0xFF30CF: // кнопка "1" servo[0] = servo[0] - 1; if (servo[0] < 10)servo[0] = 10; servo_1.write(servo[0] ); break; case 0xFF18E7: // кнопка "2" servo[1] = servo[1] + 1; if (servo[1] > 170)servo[1] = 170; servo_2.write(servo[1] ); break; case 0xFF7A85: // кнопка "3" servo[1] = servo[1] - 1; if (servo[1] < 10)servo[1] = 10; servo_2.write(servo[1] ); break; case 0xFF10EF: // кнопка "4" servo[2] = servo[2] + 1; if (servo[2] > 170)servo[2] = 170; servo_3.write(servo[2] ); break; case 0xFF38C7: // кнопка "5" servo[2] = servo[2] - 1; if (servo[2] < 10)servo[2] = 10; servo_3.write(servo[2] ); break; case 0xFF5AA5: // кнопка "6" servo[3] = servo[3] + 1; if (servo[3] > 170)servo[3] = 170; servo_4.write(servo[3] ); break; case 0xFF42BD: // кнопка "7" servo[3] = servo[3] - 1; if (servo[3] < 10)servo[3] = 10; servo_4.write(servo[3] ); break; case 0xFF4AB5: // кнопка "8" servo[4] = servo[4] + 1; if (servo[4] > 170)servo[4] = 170; servo_5.write(servo[4] ); break; case 0xFF52AD: // кнопка "9" servo[4] = servo[4] - 1; if (servo[4] < 10)servo[4] = 10; servo_5.write(servo[4] ); break; } Serial.print(value, HEX); Serial.print(" "); Serial.println(value_old, HEX); if (value != 0) irrecv.resume(); } }
а для тех, кто только с пальмы слез - можно подсказук: какой код у Вашей команды повтора? не увидел ничего похожего на FFFFFFFF...
Я давно не ковырял этот скетч. Ик вначале дает код клавиши, а потом FFFF. если идут FF то выполняется передыдущая команда. Соберите загрузите посмотрите. Сервы можно не подключать. в сериал глянете.