Еще о rgb светодиоде

Тема в разделе "Глядите, что я сделал", создана пользователем sanik, 19 фев 2020.

Метки:
  1. sanik

    sanik Гик

    Понадобилась подсветка на RGB ленте просмотрев готовые варианты ламп настроения и т п не очень устроило пришлось написать свой код Огромная благодарность пользователю
    Daniil За помощь в освоении структур сообразил интересный нестандартный вариант. Решил поделиться может кому еще понадобится.


    Сам код
    Код (C++):
    #define pin1 9 // red
    #define pin2 10//green
    #define pin3 11//blue

    int regim = 0;
    int Speed = 100;
    byte fsp = 0;

    struct timer_t {
     // uint16_t period_ms;
      uint32_t last_time;
    };

    struct pin_t {
      uint8_t Name; // номер пина
      timer_t PWM;
      uint32_t count;
    };

    const uint8_t kol_Pins = 3; // количество пинов
    pin_t pins[kol_Pins];

    void init_mas() {
      pins[0].Name = pin1;
      pins[0].PWM.last_time = 0;
      pins[0].count = 255;
      pins[1].Name = pin2;
      pins[1].PWM.last_time = 0;
      pins[1].count = 255;
      pins[2].Name = pin3;
      pins[2].PWM.last_time = 0;
      pins[2].count = 255;
    }

    void setup() {
      init_mas();
      for (uint8_t i = 0; i < kol_Pins; i++) {
        pinMode(pins[i].Name, OUTPUT);
        digitalWrite(pins[i].Name, HIGH);
      }
      // Пины D3 и D11 - 4 кГц
      TCCR2B = 0b00000010;
      TCCR2A = 0b00000001;

      // Пины D9 и D10 - 4 кГц
      TCCR1A = 0b00000001;
      TCCR1B = 0b00000010;
    }
    void loop() {
      for (uint8_t num = 0; num < kol_Pins; num++) {
        if (millis() - pins[num].PWM.last_time > Speed) {
          pins[num].PWM.last_time = millis();
          switch (regim) {
            case 0: //зажигаем красный
              if (pins[0].count != 0) {
                pins[0].count--;
              } else {
                regim = 1;
              }
              break;
            case 1: //зажигаем зеленый
              if (pins[1].count != 0) {
                pins[1].count--;
              } else {
                regim = 2;
              }
              break;
            case 2:  //гасим красный
              if (pins[0].count < 255) {
                pins[0].count++;
              } else {
                regim = 3;
              }
              break;
            case 3: // зажигаем синий
              if (pins[2].count != 0) {
                pins[2].count--;
              } else {
                regim = 4;
              }
              break;
            case 4: // гасим зеленый
              if (pins[1].count < 255) {
                pins[1].count++;
              } else {
                regim = 5;
              }
              break;
            case 5://зажигаем красный
              if (pins[0].count != 0) {
                pins[0].count--;
              } else {
                regim = 6;
              }
              break;
            case 6://зажигаем зеленый
              if (pins[1].count != 0) {
                pins[1].count--;
              } else {
                regim = 7;
              }
              break;
            case 7://гасим синий и зеленый
              if ((pins[2].count < 255) && (pins[1].count < 255)) {
                pins[2].count++;
                pins[1].count++;
              } else {
                if ((Speed < 1000) && (fsp == 0)) {
                  Speed ++;
                }
                if (Speed == 1000) {
                  fsp = 1;
                }
                if ((fsp == 1) && (Speed > 100)) {
                  Speed --;
                }
                if (Speed == 100) {
                  fsp = 0;
                }
                regim = 0;
              }
              break;
          }
        }
        analogWrite(pins[num].Name, pins[num].count);
      }
    }
     
     
    Последнее редактирование: 24 фев 2020
    Daniil нравится это.