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

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

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

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

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

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

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

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

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

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(Green, g);
      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”.

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

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

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

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

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


Видео версия проекта "RGB контроллер для 140 метров светодиодной ленты. На базе Digispark Attiny85."


RGB контроллер 150 Ампер на базе Digispark Attiny85