Контроллер для 3 RGB лент на базе Digispark Attiny85, своими руками.

Здравствуйте!

Возможно кто то захочет сделать собственную RGB гирлянду, со своими индивидуальными алгоритмами.

Контроллер для 3 RGB лент на 150 Ампер на базе Digispark Attiny85, своими руками.

Для этого понадобятся:

Плата Digispark на базе микроконтроллера Attiny85.

3 двенадцати вольтовые RGB ленты, кнопка и сопротивление 1-10 килоом.

3 мосфет транзистора 50N06 или любые другие N-канальные подходящие по мощности.

Я для сборки устройства использую макетную плату и соединительные провода, вы при желании можете сразу все спаять.

Контроллер для 3 RGB лент на 150 Ампер на базе Digispark Attiny85, своими руками.

Сначала рассмотрим скетч.

Как прошить плату Digispark на базе микроконтроллера ATtiny 85 смотрите по этой ссылке www.kolotushkin.com/Как прошить плату Digispark на базе микроконтроллера ATtiny 85

или по этой www.youtube.com/Как прошить плату Digispark на базе микроконтроллера ATtiny 85


//Начало скетча


#define Red 4
#define Green 1
#define Blue 0

int r = 0, g = 0, b = 0, sensorVal, x = 3, i = 0, j = 1;
int Speed1 = 5, Speed2 = 5, Speed3 = 5;

void setup() {
  pinMode(Red, OUTPUT); pinMode(Green, OUTPUT);
  pinMode(Blue, OUTPUT); pinMode(2, INPUT_PULLUP);
}

void button2() {
  sensorVal = digitalRead(2); if (sensorVal == HIGH) {
    delay(500); i++; if (i > x) {
      i = 0;
    }
  }
}

void offRGB() {
  digitalWrite(Red, LOW); digitalWrite(Green, LOW);
  digitalWrite(Blue, LOW); r = 0; g = 0; b = 0;
}

void program1() {
  b = 255; analogWrite(Blue, b);
  if (i == 1) {
    while (r < 256) {
      analogWrite(Red, r); delay(Speed1);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } r++;
    }
  }
  if (i == 1) {
    while (b > 0) {
      analogWrite(Blue, b); delay(Speed1);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } b--;
    }
  }
  if (i == 1) {
    while (g < 255) {
      analogWrite(Green, g); delay(Speed1);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g++;
    }
  }
  if (i == 1) {
    while (r > 0) {
      analogWrite(Red, r); delay(Speed1);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } r--;
    }
  }
  if (i == 1) {
    while (b < 256) {
      analogWrite(Blue, b); delay(Speed1);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } b++;
    }
  }
  if (i == 1) {
    while (g > 0) {
      analogWrite(Green, g); delay(Speed1);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g--;
    }
  }
}

void program2() {
  if (i == 2) {
    while (r < 255) {
      analogWrite(Red, r); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } r++;
    }
  }
  if (i == 2) {
    while (r > 0) {
      analogWrite(Red, r); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } r--;
    }
  }
  if (i == 2) {
    while (r < 255) {
      analogWrite(Red, r);
      analogWrite(Blue, r); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } r++;
    }
  }
  if (i == 2) {
    while (r > 0) {
      analogWrite(Red, r);
      analogWrite(Blue, r); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } r--;
    }
  }
  if (i == 2) {
    while (b < 256) {
      analogWrite(Blue, b); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } b++;
    }
  }
  if (i == 2) {
    while (b > 0) {
      analogWrite(Blue, b); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } b--;
    }
  }
  if (i == 2) {
    while (b < 256) {
      analogWrite(Blue, b);
      analogWrite(Green, b); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } b++;
    }
  }
  if (i == 2) {
    while (b > 0) {
      analogWrite(Blue, b);
      analogWrite(Green, b); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } b--;
    }
  }
  if (i == 2) {
    while (g < 255) {
      analogWrite(Green, g); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g++;
    }
  }
  if (i == 2) {
    while (g > 0) {
      analogWrite(Green, g); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g--;
    }
  }
  if (i == 2) {
    while (g < 255) {
      analogWrite(Green, g);
      analogWrite(Red, g); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g++;
    }
  }
  if (i == 2) {
    while (g > 0) {
      analogWrite(Red, g); delay(Speed2);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g--;
    }
  }
}

void program3() {
  if (i == 3) {
    while (g < 255) {
      analogWrite(Green, g); analogWrite(Red, g);
      analogWrite(Blue, g); delay(Speed3);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g++;
    }
  }
  if (i == 3) {
    while (g > 0) {
      analogWrite(Green, g); analogWrite(Red, g);
      analogWrite(Blue, g); delay(Speed3);
      sensorVal = digitalRead(2); if (sensorVal == HIGH) {
        delay(500); i++; offRGB(); if (i > x) {
          i = 0;
        }
      } g--;
    }
  }
}

void loop() {
  button2();
  if (i == 0) {
    offRGB();
  }

  if (i == 1) {
    program1();
  }
  
  if (i == 2) {
    program2();
  }

  if (i == 3) {
    program3();
  }
}


//Конец скетча


В скетче имеется 5 функции:

“button2” - для опроса кнопки, и если кнопка нажата то перейти к следующей функции

“offRGB” - служит для отключения каналов RGB и обнуления переменных “r, g, b”

“program1, program2 и program3” - содержат алгоритмы для RGB ленты

Переменные “Speed1, Speed2 и Speed3” имеют значение “5”. Оно является задержкой, и влияет на скорость выполнения алгоритмов, чем больше это значение тем медленнее скорость выполнения, и наоборот.

Переменная “х” служит для хранения количества режимов для RGB. Значение “3” означает 4 программы (0, 1, 2, 3) = (offRGB, program1, program2, program3). Если вы измените количество программ, то для корректной работы также необходимо изменить значение переменной “x”.

Можете настроит этот скетч, как вам нравится.

Или просто как есть, загрузите на плату, и соберите все, как показано на этой схеме.

Обратите внимание что все 3 ленты подключены по разному!

Контроллер для 3 RGB лент на 150 Ампер на базе Digispark Attiny85, своими руками.

После сборки можно можно подавать питание 12 вольт. При запуске будет выполняться нулевая программа с функцией “offRGB” и ленты светиться не будут! Нажмите кратковременно на кнопку и цикл перейдет к программе с функцией “program1”, после второго нажатия “program2”, после третьего “program3” и после четвертого нажатия опять “offRGB”.

В этой схеме я применил мосфет транзисторы 50N06. Они выдерживают напряжение до 60 вольт и ток до 50 ампер. Этого хватит для подключения 140 метров таких RGB лент как у меня. Вы можете применить любые другие N-канальные мофеты которые подойдут вам по мощности, главное соблюдайте распиновку при их подключении, ОНА МОЖЕТ ОТЛИЧАТЬСЯ от распиновки 50N06!

Удачных вам экспериментов!


Видео версия проекта "Контроллер для 3 RGB лент на 150 Ампер на базе Digispark Attiny85, своими руками."


Контроллер RGB