Управление трехцветным светодиодом с помощью ИК пульта. (Часть 2)

Тема в разделе "Глядите, что я сделал", создана пользователем atompost, 6 сен 2013.

  1. atompost

    atompost Гик

    "...Нам понадобиться:
    2. Библиотека для работы с ИК приемником, скачать можно здесь ...";)

    И не мешало бы исправить двойку по русскому языку!!!:cool:
     
  2. robokop

    robokop Гик

    Всеравно пишет ту-же ошибку:(
     
  3. atompost

    atompost Гик

    Я так понимаю вы скачали библиотеку, и, что дальше вы с ней делали ???

    если ничего не делали, то смотрите тут
     
    Последнее редактирование: 18 фев 2015
  4. robokop

    robokop Гик

    :confused:пишет,что произошла ошибка при открытии страницы
     
    Последнее редактирование: 19 фев 2015
  5. atompost

    atompost Гик

    Специально для вас

     
  6. robokop

    robokop Гик

    обьясните пожалуйста сами plis !!!! :(:(:(:(:(
     
    Последнее редактирование: 25 фев 2015
  7. VadimKachan

    VadimKachan Нерд

    Предупреждаю сразу, я новичок и нечего не понимаю, вроде все сделал по инструкции, но все равно Aurdino ругается.
    Надеюсь вы сможете помочь, заранее спасибо


    sketch_may23f:27: error: exponent has no digits
    sketch_may23f:39: error: exponent has no digits
    sketch_may23f:51: error: exponent has no digits
    sketch_may23f.ino: In function 'void loop()':
    sketch_may23f:33: error: 'AEB3F' was not declared in this scope
    sketch_may23f:45: error: 'CEB3F' was not declared in this scope
    exponent has no digits


    Код (Text):

    #include <IRremote.h>
    int RECV_PIN = 11;
    int RELAY_PIN_R = 4;
    int RELAY_PIN_G = 7;
    int RELAY_PIN_B = 8;
    IRrecv irrecv(RECV_PIN);
    decode_results results;
    void dump(decode_results *results) {
    int count = results->rawlen;
    }

    void setup() {
    delay (1000);
    pinMode(RELAY_PIN_R, OUTPUT);
    pinMode(RELAY_PIN_G, OUTPUT);
    pinMode(RELAY_PIN_B, OUTPUT);
    Serial.begin(9600);
    irrecv.enableIRIn(); // Start the receiver
    }

    void loop() {
      if (irrecv.decode(&results)) {
      Serial.println(results.value);
      irrecv.resume(); // Receive the next value
      }

    if (results.value == 2EB3F){
    digitalWrite (RELAY_PIN_R, HIGH);
    digitalWrite (RELAY_PIN_G, LOW);
    digitalWrite (RELAY_PIN_B, LOW);
    }

    if (results.value == AEB3F){
    digitalWrite (RELAY_PIN_R,LOW);
    digitalWrite (RELAY_PIN_G,HIGH);
    digitalWrite (RELAY_PIN_B,LOW);
    }

    if (results.value == 4EB3F){
    digitalWrite (RELAY_PIN_R,LOW);
    digitalWrite (RELAY_PIN_G,LOW);
    digitalWrite (RELAY_PIN_B,HIGH);
    }

    if (results.value == CEB3F){
    digitalWrite (RELAY_PIN_R,HIGH);
    digitalWrite (RELAY_PIN_G,HIGH);
    digitalWrite (RELAY_PIN_B,LOW);
    }

    if (results.value == 6EB3F ){
    digitalWrite (RELAY_PIN_R, LOW);
    digitalWrite (RELAY_PIN_G, LOW);
    digitalWrite (RELAY_PIN_B, LOW);
    }

    delay (100);
    }
     
     
    Последнее редактирование: 23 май 2015
  8. geher

    geher Гуру

    Все предельно логично.
    Если я правильно понимаю, то, на что оно ругается, является шестнадцатеричными константами.
    Только записанными неправильно.
    Возьмем первый случай: 2EB3F
    Компилятор воспринимает это поначалу как число с плавающей точкой, записанное в экспоненциальном виде 2Eстепень десятки. Но обнаруживает на месте степени набор букв, о чем на чистом англицком сообщает: "exponent has no digits"
    Четвертая ошибка в выдаче компилятора: AEB3F
    Компилятор воспринимает это как какое-то имя (переменной, типа, еще чего нибудь), но не находит объявления данной конструкции, почему, опять же, на чистом англицком, вещает, что "'AEB3F' was not declared in this scope".
    Остальные ошибки аналогичны двум рассмотренным.
    Логично предположить, что с записью шестнадцатеричных констант что-то не то.
    А не то с ними одно и то же - отсутствие префикса, оповещающего компилятор о том, что это шестнадцатеричная константа. Ее надо предварять сочетанием символов 0x (ноль икс).
    Т.е. для приведенных случаев надо записывать не 2EB3F, а 0x2EB3F и не AEB3F, а 0xAEB3F. В остальных случаях аналогично.

    PS. В принципе необязательно, но я нахожу удобным при записи шестнадцатеричных констант дополнять их нулями слева до размеров целого количества байт, слов, двойных слов, т.е. я бы записал данные константы как 0x0002EB3F и 0x000AEB3F (двойное слово) или 0x02EB3F и 0x0AEB3F (3 байта)
     
    mezhimir нравится это.
  9. VadimKachan

    VadimKachan Нерд

    Так как я нуб и восьмиклассник я почти ничего не понял, но помогло. Огромное вам спасибо! Мне это очень поможет, так как это один из моих проектов в качестве экзамена в 8 классе, остальные 2 просто трехцветный светодиод, и управление сервоприводом пр помощи Aurdino и Java приложения. Возможно, вы помогли мне получить 5 по экзамену по физике, так что ещё раз вам огромное спасибо.
     
    Rassir нравится это.
  10. DrProg

    DrProg Вечный нерд

    А мне вариант NR55RU нравится. Я тоже стараюсь выносить повторяющиеся фрагменты за скобки функции loop, так становится намного проще читать программу и меньше шанс запутаться и ошибиться.
     
  11. Я попробовал дублировать пульт кондиционера Hitachi, но у меня ничего не вышло, ИК светодиод вообще не испускает никакого сигнала, понять немогу, может мощности не хватает, подробно описал проблему с видео здесь в комментариях
     
    Последнее редактирование: 13 июл 2015
  12. a_komolow

    a_komolow Нуб

    Господа Великие Программисты!
    Здесь на форуме большинство новички,я в том же числе, и мы только учимся
    Пусть код написан, по Вашему мнению, громоздко и не оптимально, но нам так проще понять
    Со временем и мы научимся писать красиво и ёмко
    А так автору спасибо, что разложил всё по полочкам
    Вчера собрал, вписал коды кнопок и всё заработало с полтыка
     
  13. rfltn

    rfltn Нуб

    Здравствуйте!
    Интересная статья.Понятная.
    Трёхцветного светодиода у меня нет,чтобы повторить этот урок.
    Зато определил коды всех пультов в доме. ))
    Я хотел сделать дистанционное управление мышкой,но не хватает знаний,как это дело сотворить.
    Умом понимаю,что должен быть ещё скетч, в котором должна быть связь мышки и кнопок,но дальше не продвигается.
    atompost,подскажите,пожалуйста,только так же просто и популярно,как своему племяннику.
    Я далёк от программирования.
     
  14. atompost

    atompost Гик

    Доброго времени суток! давайте тогда по порядку, для чего вы хотите управлять мышкой, я так полагаю чтобы "чего-то там" запускать на компьютере? Если да, то мое личное мнение (ИМХО) почти все на компе можно запустить сочетанием клавиш, при наличии свободного времени попробую "состряпать" статью, ну например "Запуск программ из меню "ПУСК" при помощи ИК пульта"...
     
    rfltn нравится это.
  15. rfltn

    rfltn Нуб

    Здравствуйте!
    Спасибо за быстрый ответ.
    Да,в основном управлять компьютером дистанционно.( XBMC,Simple tv,чтение книг и новостей на большом экране)
    Я дошёл только до того,что научился снимать коды с домашних пультов, дальше передо мной стена )).
    Понимаю,что эти коды надо совместить с сочетанием клавиш ( как Вы говорите),но я не имею представления,как это сделать.

    Ещё раз спасибо за быстрый ответ.
    С уважением,Александр.
    PS
    <<попробую "состряпать" статью, ну например "Запуск программ из меню "ПУСК" при помощи ИК пульта"...>>
    Да,я представляю именно так.
     
  16. RaZZvedos

    RaZZvedos Нуб

    Добрый ночер. Прошу помощи, все извилины уже заплел.)
    Ситуация такая. Делаю подсветку с режимамми дня. Имеется Arduino UNO, на ней ИК-приемник, часы, РГБ диодная лента через транзисторы как нагрузка.
    Проблема вот в чем. При управлении с пульта режим день/ночь переключаются прекрасно, но при нажатии утро или вечер ардуина совершает финт ушами , лента включается в непонятный режим, а коды с пульта читаются случайные, причем разные для одной кнопки. Опытным путем выяснил, что виноваты значения
    Код (C++):
    analogWrite(REDPIN, Х);
    analogWrite(GREENPIN, Х);
    analogWrite(BLUEPIN, Х);
    Если Х = 0 или 255 то все прекрасно работает (т.е. по сути 0 или 1). Если же любое другое значение то дуина прекращает реагировать на пульт. Точнее не прекращает, а начинает видеть абсолютно не те команды.
    Сам код...
    Код (C++):
    #include <IRremote.h>
    int RECV_PIN = 5; //вход ИК приемника
    IRrecv irrecv(RECV_PIN);
    decode_results results;

    //----------Объявляем разные переменные------------
    #define REDPIN 9
    #define GREENPIN 10
    #define BLUEPIN 11

    //----------Настройки времени и продолжительности включения
    unsigned int Morning = 13*60*60+20*60;               //Время срабатывания УТРО (Часы*60*60+Минуты*60)
    unsigned int Day = 13*60*60+21*60;                   //Время срабатывания ДЕНЬ (Часы*60*60+Минуты*60)
    unsigned int Evening = 13*60*60+22*60;               //Время срабатывания ВЕЧЕР (Часы*60*60+Минуты*60)
    unsigned int Night = 13*60*60+23*60;                 //Время срабатывания НОЧЬ (Часы*60*60+Минуты*60)
    int What;


    void setup(){
      pinMode(A3, OUTPUT);
    digitalWrite(A3, HIGH);                           //+5В на 3 ногу, питание часов
    pinMode(A2, OUTPUT);
    digitalWrite(A2, LOW);                            //0В на 2 ногу, питание часов
      Serial.begin(9600);
     
    pinMode(REDPIN, OUTPUT);
    analogWrite(REDPIN, 100);
    pinMode(GREENPIN, OUTPUT);
    analogWrite(GREENPIN, 100);
    pinMode(BLUEPIN, OUTPUT);
    analogWrite(BLUEPIN, 100);

    pinMode(5, INPUT);
    pinMode(6, OUTPUT);
    digitalWrite(6, LOW); //питание ИК
    pinMode(7, OUTPUT);
    digitalWrite(7, HIGH); //питание ИК
    irrecv.enableIRIn(); // включить приемник

      Wire.begin();                                     //Инициируем I2C интерфейс
      RTC.begin();                                      //Инициирум RTC модуль


    }

    void  MorningG()
    {
            analogWrite(REDPIN, 255);                      //Включаем ленту в режим УТРО
            analogWrite(GREENPIN, 0);
            analogWrite(BLUEPIN, 0);
            What=1;
    }
    void  DayG()
    {
            analogWrite(REDPIN, 255);                      //Включаем ленту в режим ДЕНЬ
            analogWrite(GREENPIN, 255);
            analogWrite(BLUEPIN, 255);
            What=2;
    }
    void  EveningG()
    {
            analogWrite(REDPIN, 50);                      //Включаем ленту в режим ВЕЧЕР
            analogWrite(GREENPIN, 50);
            analogWrite(BLUEPIN, 150);
            What=3;
    }
    void  NightG()
    {
            analogWrite(REDPIN, 0);                      //Включаем ленту в режим НОЧЬ
            analogWrite(GREENPIN, 0);
            analogWrite(BLUEPIN, 0);
            What=4;
    }

    void loop()
    {
    if ( irrecv.decode( &results )) { // если данные пришли
      Serial.println(results.value, HEX);
        switch ( results.value ) {
        case 0xFF3AC5:
            MorningG();
            break;
        case 0xFFBA45:
            DayG();
                break;
        case 0xFF827D:
            EveningG();
                break;
        case 0xFF02FD:
            NightG();
                break;
     
        }  
        irrecv.resume(); // принимаем следующую команду
      }


    delay (500);

    }
    Скрин монитора приложил. То что начинается с FF читал нормально. Далее белеберда.(((
     

    Вложения:

  17. Tomasina

    Tomasina Сушитель лампочек Модератор

    для генерации ШИМ на выводах 3, 9, 10 и 11 используются внутренние таймеры 1 и 2.
    Библиотека IRremote.h использует таймер 2, блокируя тем самым работу analogWrite.
    http://bigbarrel.ru/irremote-pwm-error/
     
    atompost и RaZZvedos нравится это.
  18. RaZZvedos

    RaZZvedos Нуб

    Огромное спасибо.)
     
  19. nirotub

    nirotub Нуб

    Сделал вот такой код. Всё работает. Цвета светодиода переключаются. А как сделать, чтобы управлять при этом яркостью светодиода во всех режимах?

    Код (C++):
    #include <IRremote.h>
    #define ledR 5
    #define ledG 6
    #define ledB 9
    #define recv 10
    IRrecv irrecv(recv);
    decode_results results;

    void setup() {
      Serial.begin(9600);
      pinMode(ledR, OUTPUT);
      pinMode(ledG, OUTPUT);
      pinMode(ledB, OUTPUT);
      irrecv.enableIRIn();
    }

    void setLedColor(byte red, byte green, byte blue) {
      analogWrite(ledR, red);
      analogWrite(ledG, green);
      analogWrite(ledB, blue);
    }

    void loop() {
      if (irrecv.decode(&results)) {
        Serial.println(results.value);
        irrecv.resume();
      }
      switch (results.value) {
        case 16738455:
          setLedColor(255, 0, 0); // красный
          break;
        case 16750695:
          setLedColor(0, 255, 0); // зелёный
          break;
        case 16756815:
          setLedColor(0, 0, 255); // синий
          break;
        case 16724175:
          setLedColor(255, 255, 0); // желтый
          break;
        case 16718055:
          setLedColor(80, 0, 80); // фиолетовый
          break;
        case 16743045:
          setLedColor(0, 255, 255); // аквамарин
          break;
        case 16730805:
          setLedColor(0, 0, 0); // выключить светодиод
          break;
      }
    }
     
  20. ostrov

    ostrov Гуру

    RGB светодиоды это прошлый век. Переходите на адресные.
     
    CYITEP_BAC9I нравится это.