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

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

  1. atompost

    atompost Гик

    Итак, в первой части мы собрали аппаратную основу нашего проекта. Теперь приступим к написанию скетча.

    Нам понадобиться:

    1. Среда разработки Arduino, скачать её можно здесь

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

    3. Конечно же терпение :)

    Начнем.

    Вот собственно говоря сам скетч который читает данные с пульта и зажигает светодиод определенным цветом:

    Код (C):

    #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 == 2155815645){
    digitalWrite (RELAY_PIN_R, HIGH);
    digitalWrite (RELAY_PIN_G, LOW);
    digitalWrite (RELAY_PIN_B, LOW);
    }

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

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

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

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

    delay (100);
    }
     
    Многие из тех кто знаком с программированием начнут кидаться в меня помидорами, с криком "...да вы батенька нуб, зачем использовать условие IF если можно использовать прекрасную функцию switch case???...". Скажу сразу скетч как пример писался для 10 летнего племянника, который только познает азы программирования, а те кто знаком с программированием и сами смогут условие IF заменить на switch case !!! Поэтому ничего менять в скетче не буду.

    Заливаем скетч в Arduino, берем пульт "жмакаем" на кнопочки пульта...

    99.9% ничего не происходит :) если только вы не используете точно такой же пульт как у меня :)

    А зачем мы заливали скетч в ардуино, если все равно ничего не происходит, светодиод не загорается ?
    Спросите вы. Поясню, залитый в ардуино скетч нужен нам для того чтобы определить коды клавиш вашего пульта и соответственно эти коды вставить в условие IF нашего скетча, чтобы ардуино соответствующим образом реагировал на нажатие кнопок именно ВАШЕГО ПУЛЬТА !!!

    Как это сделать ???

    В секции нашего скетча void loop() есть вот такой "кусок кода"

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

    именно этот код отправляет в "сериал порт" считанные и декодированные данные с ИК датчика, и открыв в меню "Сервис" среды разработки Arduino пункт "Мониторинг порта" вы можете увидеть коды ваших кнопоко пульта если в этот момент вы будете на них нажимать.

    Дело осталось за малым.

    я использовал для управления вот такой пульт от IPTV приставки
    [​IMG]

    Собственно говоря этот пульт и подал мне идею создания этого проекта из-за своих четырех цветных кнопочек, собственно, что я и реализовал.

    Итак приступим к настройке. (давайте рассмотрим настройку на примере моего пульта)

    Скетч залит в ардуино, ардуино подключено к компьютеру, открыто окно мониторинга порта (указан правильный порт, он должен быть таким же через который вы заливали скетч, на всякий случай перепроверьте, иначе вы не увидите никаких данных)

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

    2155815645
    2155815645
    2155815645
    2155815645
    2155815645
    2155815645
    ...
    это и есть код красной кнопки на пульте, копируем, записываем эти цифры на листочек, кому как удобно!
    Вставляем в секцию кода

    if (results.value == 2155815645){
    digitalWrite (RELAY_PIN_R, HIGH); // Включаем красный светодиод
    digitalWrite (RELAY_PIN_G, LOW); // Выключаем зеленый светодиод
    digitalWrite (RELAY_PIN_B, LOW); // Выключаем синий светодиод
    }

    повторяем вышеописанную процедуру для остальных кнопок вставляя соответствующее значение кнопки в соответствующее условие.

    немного отвлекусь от темы

    в моем скетче есть код который зажигает сразу 2 светодиода, вот он:

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

    Для чего это??? Немного поясню смешивание цвета это не одно и то же, что смешивание красок !!!
    Например если вы смешаете красную и зеленую краску, что получится ??? Получится грязно серый цвет, а вот если смешать красный и зеленый ЦВЕТ в трехцветном светодиоде то получится ЖЕЛТЫЙ!!!
    В своем скетче я использовал цифровые выходы, которые могут принимать значения только 0 либо 1 (горит - не горит), но если использовать аналоговые выходы (PWM) то можно получить практически любой оттенок цвета в формате RGB.

    Ну, вот вроде бы и все, если будут какие-то вопросы задавайте, будем разбираться!

    З.Ы.

    Видео выложу чуть позже.
     
    Последнее редактирование: 23 окт 2013
    ffffff, Nabla, Megakoteyka и ещё 1-му нравится это.
  2. Festour

    Festour Нерд

    Вы батенька, всё таки нуб, ибо if имеет так же, else if. В принципе не критично, но глаз таки режет. И раз эта статья для начинающих, рекомендую комментировать практически полностью код, можете брать пример из статей в википедии.
    И лично на мой вкус, вы злоупотребляете восклицательными, вопросительными знаками, и капслоком. Опять же, можете сравнить вашу статью со статьями в википедии.
     
    Максимус-Бог нравится это.
  3. atompost

    atompost Гик

    Да нет батенька я не "нуб", когда вы еще не родились даже, я уже осваивал ассемблер на спектруме :) Тлько без обид, ничего личного. Просто хотелось как можно проще донести это для тех кто только начал, а по поводу "капслока" и восклицательных знаков я просто хотел привлечь внимание к той или иной формулировке! По поводу комментирования кода я в конце написал " ... если кому то, что то непонятно, обращайтесь, будем разбираться..."
     
  4. Festour

    Festour Нерд

    Да я и не собирался обижаться ;), но знание ассемблера судя по всему не улучшает ваш код)
    Но комментировать ваш код нужно обязательно, не каждый кто прочитает ваш код имеет аккаунт здесь и ради одного вопроса захочет зарегистрироваться здесь.
     
  5. Festour

    Festour Нерд

    Что вы? Какие обиды? Это конечно хорошо что вы давно знаете ассемблер, да и предположить можно что и не только его знаете, но мы уходим от темы. Возможно использовать if'ы, но имхо это не наш случай, здесь более уместено использовать после первого if'а, else if'ы.
    Вы бы могли бы использовать отступы, для того что бы разделить визуально разные методы? Мне было бы проще читать ваш код.
    Не понятен мне метод dump, а именно -> операция. Что она делает?
    И я всё таки, настаиваю что бы вы подробно комментировали ваш код, если кому то будет не понятно что то, не каждый захочет отписаться здесь и дождаться вашего ответа. Даже если с вашей точки зрения, ваш код понятен, всё равно надо это делать.
     
  6. atompost

    atompost Гик

    хорошо Festour я учту ваше мнение в дальнейшем :) Давайте лучше сотрудничать вместе, и помогать другим разбираться и разбираться самим, а на красоту кода, ну не стоит так сильно обращать внимания, я просто программист старой закалки и для меня важен результат а не красота кода.
     
  7. Megakoteyka

    Megakoteyka Оракул Модератор

    Festour нравится это.
  8. atompost

    atompost Гик

  9. NR55RU

    NR55RU Гик

    Если вы не Нуб, то в данном случае даже If else является не лучшей альтернативой, в данном случае и короче и понятнее была бы такая форма ибо от дублирования кода надо избавляться, а вы предложили поменять шило на мыло по сути.

    Код (Text):
    switch(results.value)
    {
        case 2155815645:
            setLedColor(HIGH, LOW, LOW);
            break;
        case 2155848285:
            setLedColor(LOW, HIGH, LOW);
            break;
        case 2155823805:
            setLedColor(LOW, LOW, HIGH);
            break;
        case 2155831965:
            setLedColor(HIGH, HIGH, LOW);
            break;
        case 2155868175:
            setLedColor(LOW, LOW, LOW);
            break;
    }

    void setLedColor(int redValue, int greenValue, int blueValue)
    {
        digitalWrite (RELAY_PIN_R, redValue);
        digitalWrite (RELAY_PIN_G, greenValue);
        digitalWrite (RELAY_PIN_B, blueValue);
    }
    Более того, тут тоже стоило бы заменить магические значения на именованные константы, тогда бы читалось еще лучше. Да и еще есть аспекты которые можно поправить но суть не в этом.

    Атомпост сделал хорошее дело, написал статейку обучающую, может не очень красивый код, но все и всегда начинают с "прямых" вариантов, изящество и понимание приходит лишь со временем и опытом, да и иногда намеренно код пишут иначе что бы лучше что то донести, гораздо важнее уважаемый Festour не делать подобных заявлений и пытаться тем самым показать что вы круто в чем то разбираетесь, особенно тогда когда вы даже в этом не разбираетесь.
    И по поводу комментариев которые вы так яростно требуете, то в хорошо структурированном коде, с хорошими названиями методов и переменных, где отсутствуют магические числа и тд и тп, комментарий требуется лишь в особых местах но никак ни после каждой строчки.
    А вот такие моменты:
    Код (Text):
    int count = results->rawlen;
    Комментировать не надо, для этого надо читать книги по языку и знать его синтаксис и будет вам счастье.
     
    Последнее редактирование: 23 окт 2013
    Megakoteyka и atompost нравится это.
  10. Festour

    Festour Нерд

    Вообще то я ещё нуб в программировании, но я с вами категорически не согласен по всем пунктам.
    Рекомендую перечитать первый пост топикстартера, там сказанно почему он не использовал switch case. Так что мой вариант самую чуточку лучше его варианта.
    Я с вами категорически не согласен на счёт "красоты" кода, но это уже моё личное мнение и я не буду вам его навязывать, так что не буду спорить с вами по этому пункту.
    Но на счёт комменатриев я всё таки буду спорить, ибо пост всё таки для новичков, а не для тех кто уже умеет программировать. Я всего лишь привёл пример где мне было непонятно, но новичкам то, может быть непонятно многое, и комментарии могли бы им помочь.
     
  11. Megakoteyka

    Megakoteyka Оракул Модератор

    А противный гадкий компилятор любой switch в конце концов переделает в кучу if :)
     
    atompost и Festour нравится это.
  12. Megakoteyka

    Megakoteyka Оракул Модератор

    Если категорически, да еще и по всем пунктам - предложите свой вариант :)
     
  13. Festour

    Festour Нерд

    Вариант чего?
     
  14. NR55RU

    NR55RU Гик

    Festour, все что я хотел сказать своим постом, не надо в такой пафосной форме кого то называть нубом, когда вы сами не знаете даже элементарного синтаксиса языка.
    Показывайте лучше свои знания хорошей помощью и советами тем кто в ней нуждается, это со всех сторон более выгодная позиция.
     
  15. Festour

    Festour Нерд

    Ах, ну тут процитирую топикстартера
    Я не удержался и решил подловить его;). Я хотел выразить это в шутливой форме, к сожалению это у меня плохо получилось.
     
  16. Megakoteyka

    Megakoteyka Оракул Модератор

    Кода, статьи...
     
  17. NR55RU

    NR55RU Гик

    Интернет лишен вербальности, в живую интонация и мимика, дают требуемый подтекст.
    В интернете буквы имеют строгий порядок и не несут в себе эмоциональной окраски, и эти буквы каждый воспринимает в силу его настроения, состояния, знакомства с говорящим и еще кучу кучу других факторов.
    В живую девушку можно назвать "сукой" и это слово можно сказать в десятке разных под текстов от шутки до оскорбления.
    Если написать это, то это будет лишь 5 букв которые будут восприняты девушкой по разному, в зависимости от массы факторов на тот момент.

    Посему, просто используйте в таких случаях смайлики, они хоть как то помогают придать эмоциональную окраску тексту :) А в "тонких" местах, лучше и вовсе воздержатся от некоторых шуток если вы плохо знаете человека и не уверенные на 100% что написанное будет адекватно воспринято.
     
  18. Megakoteyka

    Megakoteyka Оракул Модератор

    Вспомнилось:
    Просто вспомнилось, ничего не хочу этим сказать. Сам не могу без них обойтись, хоть и стараюсь иногда :)
     
  19. Festour

    Festour Нерд

    Зачем мне лекцию читать?:confused: Да я ошибся, но я не первый год в интернете если что...:rolleyes:
     
  20. robokop

    robokop Гик

    ПОЧИМУТО ПРИ ЗАГРУСКЕ ПИШЕТ, ЧТО ЕСТЬ ОШИБКА,И ВЫДЕЛЯЕТСЯ СТРОКА "IRrecv irrecv (RECV_PIN);