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

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

  1. nirotub

    nirotub Нуб

    Да дело не в светодиоде. Подскажите, что добавить в код, чтобы его яркостью управлять
     
  2. a1000

    a1000 Гуру

    Я так понимаю катоды всех светодиодов подключены к GND? Подключи их тоже через порт и с помощью ШИМ управляй яркостью всех светодиодов скопом. Только так будет наоборот. 0 - это максимальная яркость, а 255 - светиться не будет.
     
  3. nirotub

    nirotub Нуб

    Катоды подключены к цифровым пинам с PWM. Не к GND. Пробовал по разному, не получается яркость регулировать
     
  4. ostrov

    ostrov Гуру

    Разница между тем катоды или аноды к pwm только в том, при каких значениях ярче и при каких тусклее. Это для обычного одинарного светодиода. У стандартного трехцветного (из набора Амперки), насколько помню, общий именно катод, если прицепить как вы, разумеется ничего светить не будет. Сделайте обший GND и шим на аноды цветов уже. Три резистора не забудьта только, один общий не прокатит.
     
  5. a1000

    a1000 Гуру

    Код в студию.
     
  6. nirotub

    nirotub Нуб

    Вот код. Подключена библиотека IRremote 2.2.3
    Код (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;
      }
    }
     
  7. a1000

    a1000 Гуру

    Ну и где здесь реализовано управлению яркостью. Ты-же писал что пробовал
     
  8. atompost

    atompost Гик

    В соседней теме я выкладывал код по управлению (независимо) яркостью трех светодиодов
    делай по аналогии...
    Код (C++):
    int bigLed[] = {3, 5, 6};                            //создаем массив пинов для больших светодиодов
    int smallLed[] = {7, 8, 9};                            //создаем массив пинов для маленьких светодиодов
    int knopka[] = {10,11,12,13};                        //создаем массив пинов для кнопок
    int count = -1;                                        //создаем счетчик
    int brightnes[] = {0, 0, 0};                        //создаем массив из трех элементов для указания яркости каждого (большого) светодиода
    int del=300;                                        //задержка

    void setup() {
      for (int i = 0; i <= 3; i++) {
      pinMode(knopka[i], INPUT);                        //обозначаем, что пины кнопок работают как INPUT
      }
      for (int i = 0; i <= 2; i++) {
        pinMode(bigLed[i], OUTPUT);                        //обозначаем, что пины больших светодиодов работаю как OUTPUT
        pinMode(smallLed[i], OUTPUT);                    //обозначаем, что пины маленьких светодиодов работаю как OUTPUT
      }
    }
    void loop() {
    //----кнопка влево-----
    int value2 = digitalRead(knopka[1]);                //читаем данные пина
      if ( value2 == HIGH ) {                            //если кнопка нажата тогда
        count = count + 1;                                //увеличиваем счетчик на единицу
        if (count > 2) {                                //проверяем значение счетчика если он больше 2 тогда
          count = 2;                                    //счетчик равен 2, что бы значение счетчика не переполнялось
        }
        for (int i = 0; i <= 2; i++) {
          digitalWrite(smallLed[i], LOW);                //тушим все маленькие светодиоды
        }
        digitalWrite(smallLed[count], HIGH);            //зажигаем светодиод с номером хранящемся в count
        delay(del);                                        //задержка
      }
      //----кнопка вправо-----
      int value3 = digitalRead(knopka[2]);                //читаем данные пина
      if ( value3 == HIGH ) {                            //если кнопка нажата тогда
        count = count - 1;                                //уменьшаем счетчик на единицу
        if (count < 0) {                                //проверяем значение счетчика, если он меньше 0 тогда
          count = 0;                                    //счетчик равен 0, что бы значение счетчика не переполнялось
        }
        for (int i = 0; i <= 2; i++) {
          digitalWrite(smallLed[i], LOW);                //тушим все маленькие светодиоды
        }
        digitalWrite(smallLed[count], HIGH);            //зажигаем светодиод с номером хранящемся в count
        delay(del);                                        //задержка
      }
      //----кнопка вверх-----
      int value1 = digitalRead(knopka[0]);                //читаем данные пина
      if ( value1 == HIGH ) {                            //если кнопка нажата тогда
        brightnes[count] = brightnes[count] + 1;        //увеличиваем счетчик яркости для больших светодиодов на единицу
        if (brightnes[count] > 254) {                    //проверяем значение счетчика, если он больше 254, тогда
          brightnes[count] = 254;                        //счетчик равен 254, что бы значение счетчика не переполнялось
        }
        analogWrite(bigLed[count], brightnes[count]);    //зажигаем большой светодиод с номером count, яркостью brightnes
        delay(del);                                        //задержка
      }
      //----кнопка вниз-----
      int value4 = digitalRead(knopka[3]);                //читаем данные пина
      if ( value4 == HIGH ) {                            //если кнопка нажата тогда
        brightnes[count] = brightnes[count] - 1;        //уменьшаем счетчик яркости для больших светодиодов на единицу
        if (brightnes[count] < 0) {                        //проверяем значение счетчика, если он меньше 0, тогда
          brightnes[count] = 0;                            //счетчик равен 0, что бы значение счетчика не переполнялось
        }
        analogWrite(bigLed[count], brightnes[count]);    //зажигаем большой светодиод с номером count, яркостью brightnes
        delay(del);                                        //задержка
      }
      //-----the end :^)-----
    }

     
     
    Последнее редактирование: 14 май 2018
  9. a1000

    a1000 Гуру

    У nirotub немного не так. Он уже использует ШИМ для создания различных цветов смешением базовых цветов трехцветного светодиода. Как-то не хочется вмешиваться в это распределение. Как по мне, легче регулировать с другой стороны, на катоде.