IRremote запуск команд.

Тема в разделе "Arduino & Shields", создана пользователем sanik, 21 ноя 2014.

  1. sanik

    sanik Гик

    Добрый вечер! Подскажите пожалуйста как запустить режимы в этом коде.
    Сам вопрос в коментариях с 97 строки
    Код (Text):

    #include "Tlc5940.h"
    #include "tlc_shifts.h"
    #include <IRremote.h>
    int recvLED = 13;
    int recvPin = 11; //вход ИК приемника
    #define ANALOG_PIN      0

    #define SCOPE_PERIOD    (2000 * NUM_TLCS)
    #define LED_PERIOD      SCOPE_PERIOD / (NUM_TLCS * 16)

    IRrecv irReciver(recvPin);
    decode_results results;
    byte pinsled[] = {
      2, 5, 6 };// пины светодиодов

    byte digits[][3] = {
      {
        1, 0, 0  }
      , // digit 0
      {
        0, 1, 0  }
      , // digit 1
      {
        0, 0, 1  }
      , // digit 2
    }; // переключение светодиодов

    const unsigned long decodeHASH[] = {
      0xC101E57B, // Digit 0
      0x9716BE3F, // digit 1
      0x3D9AE3F7, // digit 2
    }; // запись кодов с пульта

    unsigned long lastTime = 0;

    void setup()
    {
      pinMode(recvLED, OUTPUT); //Все пины на выход
      digitalWrite(recvLED, LOW); //выключаем при старте

      Serial.begin(9600);

      irReciver.enableIRIn(); // Start the receiver

      for (int i=0; i<3; i++)
      {
        pinMode(pinsled[i], OUTPUT); //установка пинов на выход
      }
      Tlc.init();
    }

    void loop()
    {
      unsigned long recv_value;

      if (irReciver.decode(&results)) {
        recv_value = results.value;

        if (  recv_value != 0xFFFFFFFF ) //Игнорировать значения 0x00 Recived в результате нажатия и удерживания кнопки на пульте дистанционного управления для долго
        {
          // Blink the LED each time a button is pressed
          digitalWrite(recvLED, HIGH);
          delay(10);
          digitalWrite(recvLED, LOW);

          // Выход декодированная хэш-значение для й серийный монитор. Это только для отладки.
          Serial.println(recv_value, HEX);

          // Просмотр декодированными значений хеш найти соответствие
          for (int i=0; i<3; i++)
          {
            if ( recv_value == decodeHASH[i] ) // Если полученное значение совпадает с одним из значений в хеш
            {
              lastTime = millis();  //Запуск  таймер задержки
              for (int j=0; j<=3; j++)
                // Установить соответствующие сегменты высокой или низкой, как это определено в цифры [] [] двойной массив
                digitalWrite(pinsled[j], digits[i][j]);

              break; // Выход из внутреннего цикла, как мы теперь переключать все необходимые сегменты для отображения соответствующего значения
            }
          }
        }
        irReciver.resume(); // Читать следующее значение
      }

      //Чтобы сохранить выключатель питания всех диодов, если 5 секунд прошло с момента
      if ( millis() - lastTime >= 5000 )
      {
        for (int k=0; k<=3; k++)
          digitalWrite(pinsled[k], LOW);

        lastTime = 0; //Сброс таймер задержки энергосбережение до нуля '0'
      }
      if (pinsled[2] == HIGH)
      {
      //  regim1(); // Как здесь записать чтоб гонялся по кругу void regim1() ????
        //и  правильно ли я записал условие?
      }
      if (pinsled[5] == HIGH)
      {
      //  void regim2();
      }
      if (pinsled[6] == HIGH)
      {
      //  void regim0();
      }
          void regim1();
      {
        uint16_t sum = tlc_shiftUp() + analogRead(ANALOG_PIN) * 4;
        sum = 0;
        Tlc.set(0, sum);
        Tlc.update();
        delay(LED_PERIOD);
      }

      void regim2();
      {
        int direction = 1;
        for (int channel = 0; channel < NUM_TLCS * 16; channel += direction)
        {
          Tlc.clear();
          if (channel == 0)
          {
            direction = 1;
          }
          else
          {
            Tlc.set(channel - 1, 1000);
          }
          Tlc.set(channel, 4095);
          if (channel != NUM_TLCS * 16 - 1)
          {
            Tlc.set(channel + 1, 1000);
          }
          else
          {
            direction = -1;
          }
          Tlc.update();
          delay(75);
        }
      }
      void regim0();
    }
     
     
  2. sanik

    sanik Гик

    Немного продвинулся в коде Оказывается есть странность в библиотеках не могу понять как только в void setup() убираю инициализацию Tlc.init(); Начинают работать светодиоды от пульта стоит подключить тлс пульт не читается. Кто знает в чем проблема?
    Код (Text):

    #include "Tlc5940.h"
    #include "tlc_shifts.h"
    #include <IRremote.h>

    #define msg7RESET 8
    #define msg7Strobe 12
    #define msg7DCout 0
    int spectrumRead[8];
    int spectrum[7]={
      0,0,0,0,0,0,0};
    int delaylValue = 0;
    int outputValue = 0;
    int chanelValue = 0;
    int recvLED = 14;
    int recvPin = 15; //вход ИК приемника
    int bridge; // переменая для sum

    int pinLED = 3;
    //#define CLEAR_PIN      12
    #define ANALOG_PIN      5

    #define SCOPE_PERIOD    (2000 * NUM_TLCS)
    #define LED_PERIOD      SCOPE_PERIOD / (NUM_TLCS * 16)

    IRrecv irReciver(recvPin);
    decode_results results;
    // пины светодиодов
    byte pinsled[] = {
      2, 5, 6 };

    // переключение светодиодов
    byte digits[][3] = {
      {
        0, 1, 1      }
      , // режим 0
      {
        1, 0, 1      }
      , // режим 1
      {
        1, 1, 0      }
      , // режим 2
    };


    const unsigned long decodeHASH[] = {
      0x8C03F, // режим 0
      0x820DF, // режим 1
      0x8A05F, // режим 2
    }; // запись кодов с пульта



    void setup()
    {
      pinMode(msg7RESET, OUTPUT);
      pinMode(msg7Strobe, OUTPUT);
      pinMode(recvLED, OUTPUT); //Все пины на выход
      digitalWrite(recvLED, LOW); //выключаем при старте

      Serial.begin(9600);

      irReciver.enableIRIn(); // Start the receiver

      for (int i=0; i<3; i++)
      {
        pinMode(pinsled[i], OUTPUT); //установка пинов на выход
        digitalWrite(pinsled[i],HIGH);//выключаем при старте
      }
      Tlc.init();
    }

    void loop()
    {
      unsigned long recv_value;
      if (irReciver.decode(&results)) {
        Serial.println(results.value, HEX);
        recv_value = results.value;
        if (recv_value != 0xFFFFFFFF ) //Игнорировать значения 0x00 Recived в результате нажатия и удерживания кнопки на пульте дистанционного управления для долго
        {
          // Blink the LED each time a button is pressed
          digitalWrite(recvLED, HIGH);
          delay(10);
          digitalWrite(recvLED, LOW);

          // Выход декодированная хэш-значение для й серийный монитор. Это только для отладки.
          Serial.println(recv_value, HEX);

          // Просмотр декодированными значений хеш найти соответствие
          for (int i=0; i<3; i++)
          {
            if ( recv_value == decodeHASH[i] ) // Если полученное значение совпадает с одним из значений в хеш
            {
             
              for (int j=0; j<=3; j++)
                // Установить соответствующие сегменты высокой или низкой, как это определено в цифры [] [] двойной массив
                digitalWrite(pinsled[j], digits[i][j]);

              break; // Выход из внутреннего цикла, как мы теперь переключать все необходимые сегменты для отображения соответствующего значения
            }
          }
        }
        irReciver.resume(); // Читать следующее значение
      }
     
     
  3. ИгорьК

    ИгорьК Гуру

    Доподлинно известно, что библиотека IRremote.h задействует таймер, который, который обеспечивает ШИМ на 3 и 11 ногах Ардуино. Если его же задействует Tlc5940.h - возникают проблемы. Видимо это ваш случай.
     
  4. sanik

    sanik Гик

    И как с этим бороться?
     
  5. ИгорьК

    ИгорьК Гуру

    Разобраться, во-первых, верно ли мое предположение, путем исследования обоих библиотек.
    Посмотреть, можно-ли что-то изменить в библиотеках, задействовав другой таймер.
    Возможно, заменить плату на Мегу, потому что там таймеров больше. Это общее направление размышлений.