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

Тема в разделе "Arduino & Shields", создана пользователем holodaleksey, 19 дек 2016.

  1. holodaleksey

    holodaleksey Нуб

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

    сразу поясню - в си - я дубовый. пишу на 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;
    }

     
     

    Вложения:

    • _1.07.3.ino
      Размер файла:
      2,3 КБ
      Просмотров:
      170
    • 1.07.3.png
      1.07.3.png
      Размер файла:
      114,1 КБ
      Просмотров:
      638
    Последнее редактирование: 19 дек 2016
  2. qwone

    qwone Гик

    Ну ковыряться в вашем коде не буду. Если есть желание поковыряйтесь вы в моем. Там есть функция долгого нажатия на клавишу ИК
    Код (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();
      }
    }
     
  3. holodaleksey

    holodaleksey Нуб

    а для тех, кто только с пальмы слез - можно подсказук: какой код у Вашей команды повтора? не увидел ничего похожего на FFFFFFFF...
     
  4. qwone

    qwone Гик

    Я давно не ковырял этот скетч. Ик вначале дает код клавиши, а потом FFFF. если идут FF то выполняется передыдущая команда. Соберите загрузите посмотрите. Сервы можно не подключать. в сериал глянете.
     
  5. holodaleksey

    holodaleksey Нуб

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