Skip to content

Instantly share code, notes, and snippets.

@CODeRUS
Created March 26, 2020 12:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CODeRUS/8a218c4504fa9e9ef2f83078e910b02b to your computer and use it in GitHub Desktop.
Save CODeRUS/8a218c4504fa9e9ef2f83078e910b02b to your computer and use it in GitHub Desktop.
arduino ambilight
/*
Управление лентой на WS2812 с компьютера + динамическая яркость
Создано не знаю кем, допилил и перевёл AlexGyver http://alexgyver.ru/
2017
*/
#include <Arduino.h>
//----------------------НАСТРОЙКИ-----------------------
#define NUM_LEDS 300 // число светодиодов в ленте
#define DI_PIN 13 // пин, к которому подключена лента
#define OFF_TIME 600 // время (секунд), через которое лента выключится при пропадаании сигнала
#define CURRENT_LIMIT 1000 // лимит по току в миллиамперах, автоматически управляет яркостью (пожалей свой блок питания!) 0 - выключить лимит
#define START_FLASHES 1 // проверка цветов при запуске (1 - включить, 0 - выключить)
#define AUTO_BRIGHT 0 // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define MAX_BRIGHT 255 // максимальная яркость (0 - 255)
#define MIN_BRIGHT 50 // минимальная яркость (0 - 255)
#define BRIGHT_CONSTANT 500 // константа усиления от внешнего света (0 - 1023)
// чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define COEF 0.9 // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
//----------------------НАСТРОЙКИ-----------------------
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;
#define serialRate 115200 // скорость связи с ПК
uint8_t prefix[] = {'A', 'd', 'a'}, hi, lo, chk, i; // кодовое слово Ada для связи
#include <FastLED.h>
CRGB leds[NUM_LEDS]; // создаём ленту
boolean led_state = true; // флаг состояния ленты
void setup()
{
FastLED.addLeds<WS2812, DI_PIN, GRB>(leds, NUM_LEDS); // инициализация светодиодов
if (CURRENT_LIMIT > 0) FastLED.setMaxPowerInVoltsAndMilliamps(5, CURRENT_LIMIT);
// вспышки красным синим и зелёным при запуске (можно отключить)
if (START_FLASHES) {
LEDS.showColor(CRGB(255, 0, 0));
delay(500);
LEDS.showColor(CRGB(0, 255, 0));
delay(500);
LEDS.showColor(CRGB(0, 0, 255));
delay(500);
LEDS.showColor(CRGB(0, 0, 0));
}
Serial.begin(serialRate);
Serial.print("Ada\n"); // Связаться с компом
}
void check_connection() {
if (led_state) {
if (millis() - off_timer > (OFF_TIME * 1000)) {
led_state = false;
FastLED.clear();
FastLED.show();
}
}
}
void loop() {
if (AUTO_BRIGHT) { // если включена адаптивная яркость
if (millis() - bright_timer > 100) { // каждые 100 мс
bright_timer = millis(); // сброить таймер
new_bright = map(analogRead(6), 0, BRIGHT_CONSTANT, MIN_BRIGHT, MAX_BRIGHT); // считать показания с фоторезистора, перевести диапазон
new_bright = constrain(new_bright, MIN_BRIGHT, MAX_BRIGHT);
new_bright_f = new_bright_f * COEF + new_bright * (1 - COEF);
LEDS.setBrightness(new_bright_f); // установить новую яркость
}
}
if (!led_state) led_state = true;
off_timer = millis();
for (i = 0; i < sizeof prefix; ++i) {
waitLoop: while (!Serial.available()) check_connection();;
if (prefix[i] == Serial.read()) continue;
i = 0;
goto waitLoop;
}
while (!Serial.available()) check_connection();;
hi = Serial.read();
while (!Serial.available()) check_connection();;
lo = Serial.read();
while (!Serial.available()) check_connection();;
chk = Serial.read();
if (chk != (hi ^ lo ^ 0x55))
{
i = 0;
goto waitLoop;
}
memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));
for (uint8_t i = 0; i < NUM_LEDS; i++) {
byte r, g, b;
// читаем данные для каждого цвета
while (!Serial.available()) check_connection();
r = Serial.read();
while (!Serial.available()) check_connection();
g = Serial.read();
while (!Serial.available()) check_connection();
b = Serial.read();
leds[i].r = r;
leds[i].g = g;
leds[i].b = b;
}
FastLED.show(); // записываем цвета в ленту
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment