Подсветка SK6812 для кухни

Sergey_

✩✩✩✩✩✩✩
10 Май 2021
9
3
Всем привет! Хотел поделиться своим проектом, который реализовал у себя дома для кухни, возможно будет для кого-то полезным учесть мои ошибки либо доработать уже имеющийся проект. Также большая просьба подсказать в доработке проекта, ниже все описал. Заранее благодарю за помощь;)

Решил сделать в процессе ремонта. Света достаточно, все видно на видео. Проект выполнил после того как собрал по видео лампу Gyverlamp. Отдельное спасибо Алексу, он вдохновил на создание этого проекта!

Использовал светодиодную ленту SK6812(RGBW), 120 пикселей, и сенсорную кнопку TTP223.
Схема подключения ниже, также установил кнопку на БП для удобства.
scheme-4.jpg
Кнопку скрыл профилем
Фото кнопки2.jpg
БП и Ардуино НАНО спрятал в ящике, Ардуинку повесил в распределительной коробке
изображение_viber_2021-12-27_15-26-57-771.jpgизображение_viber_2021-12-27_15-26-57-809.jpg

Ниже примеры работы


Код
C++:
#define CURRENT_LIMIT 2000
#define AUTOPLAY_TIME 30
#define LED_PIN 6
#define BUTTON_PIN 2
#define MIN_BRIGHTNESS 5
#define BRIGHTNESS 255
#define LED_COUNT  120

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif

Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRBW + NEO_KHZ800);

#include "GyverButton.h"
GButton touch(BUTTON_PIN, LOW_PULL, NORM_OPEN);

boolean oldState = HIGH;
int     mode     = 0;

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  strip.begin();
  strip.show();
  randomSeed(analogRead(0));
  touch.setTimeout(300);
  touch.setStepTimeout(50);
}

void loop() {
  boolean newState = digitalRead(BUTTON_PIN);
  if ((newState == LOW) && (oldState == HIGH)) {
    delay(20);
    newState = digitalRead(BUTTON_PIN);
    if (newState == LOW) {
      if (++mode > 1) mode = 0;
      switch (mode) {
        case 0:
          colorWipe(strip.Color(  0,   0,   0), 25);
          break;
        case 1:
          colorWipe(strip.Color(  0,   0,   0, 255), 25);
          break;
          case 2:
          rainbow(10);
          break;
          case 3:
          theaterChase;
          break;


      }
    }
  }
  oldState = newState;
}


void colorWipe(uint32_t color, int wait) {
  for (int i = 0; i < strip.numPixels(); i++) { // For each pixel in strip...
    strip.setPixelColor(i, color);         //  Set pixel's color (in RAM)
    strip.show();                          //  Update strip to match
    delay(wait);                           //  Pause for a moment
  }
}


void theaterChase(uint32_t color, int wait) {
  for (int a = 0; a < 10; a++) { // Repeat 10 times...
    for (int b = 0; b < 3; b++) { //  'b' counts from 0 to 2...
      strip.clear();         //   Set all pixels in RAM to 0 (off)
      // 'c' counts up from 'b' to end of strip in steps of 3...
      for (int c = b; c < strip.numPixels(); c += 3) {
        strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
      }
      strip.show(); // Update strip with new contents
      delay(wait);  // Pause for a moment
    }
  }
}

// Rainbow cycle along whole strip. Pass delay time (in ms) between frames.
void rainbow(int wait) {
  // Hue of first pixel runs 3 complete loops through the color wheel.
  // Color wheel has a range of 65536 but it's OK if we roll over, so
  // just count from 0 to 3*65536. Adding 256 to firstPixelHue each time
  // means we'll make 3*65536/256 = 768 passes through this outer loop:
  for (long firstPixelHue = 0; firstPixelHue < 3 * 65536; firstPixelHue += 256) {
    for (int i = 0; i < strip.numPixels(); i++) { // For each pixel in strip...
      // Offset pixel hue by an amount to make one full revolution of the
      // color wheel (range of 65536) along the length of the strip
      // (strip.numPixels() steps):
      int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
      // strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
      // optionally add saturation and value (brightness) (each 0 to 255).
      // Here we're using just the single-argument hue variant. The result
      // is passed through strip.gamma32() to provide 'truer' colors
      // before assigning to each pixel:
      strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
    }
    strip.show(); // Update strip with new contents
    delay(wait);  // Pause for a moment
  }
}

// Rainbow-enhanced theater marquee. Pass delay time (in ms) between frames.
void theaterChaseRainbow(int wait) {
  int firstPixelHue = 0;     // First pixel starts at red (hue 0)
  for (int a = 0; a < 30; a++) { // Repeat 30 times...
    for (int b = 0; b < 3; b++) { //  'b' counts from 0 to 2...
      strip.clear();         //   Set all pixels in RAM to 0 (off)
      // 'c' counts up from 'b' to end of strip in increments of 3...
      for (int c = b; c < strip.numPixels(); c += 3) {
        // hue of pixel 'c' is offset by an amount to make one full
        // revolution of the color wheel (range 65536) along the length
        // of the strip (strip.numPixels() steps):
        int      hue   = firstPixelHue + c * 65536L / strip.numPixels();
        uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB
        strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
      }
      strip.show();                // Update strip with new contents
      delay(wait);                 // Pause for a moment
      firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames
    }
  }
}



Есть определенные проблемы:rolleyes:,

а. я не программист, и писал код из стандартных примеров неопикселя, что-то большее так и не смог сделать кроме эффекта "colorWipe", возможно кто-то сможем подсказать либо увязать те эффекты, которые есть в моем скетче, либо подскажет пример похожей работы с лентами RGBW.

Идея была следующая:​
1. Одно нажатие - включение со стандартным эффектом "colorWipe" - загарается белый свет, и лента переходит в режим ожидание при включении.​
2. При включенной ленте(белый свет):​
- однократное нажатие - выключение с эффектом "colorWipe" и цикл к первому пункту​
- зажатие кнопки - яркость​
- тройное нажатие - переход в режим эффектов(радуга, огонь, стробоскоп, и т.д.)​
- однократное нажатие переключение эффектов, при троекратном нажатии - выключение и цикл к первому пункту.​


б. При включенной либо выключенный ленте и небольших перепадах напряжения... лента то включается, то выключается, возможно тоже кто-то подскажет.
 

Вложения

  • Лойс +1
Реакции: Slenk, VanUliK и Sher

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
в соответствии с п. 3.9 норматива Москвы по эксплуатации жилищного фонда ЖНМ-2004/03 «Газопроводы и газовое оборудование жилых зданий», утвержденного и введенного в действие постановлением Правительства Москвы от 02.11.2004 № 758-ПП,

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

Sergey_

✩✩✩✩✩✩✩
10 Май 2021
9
3
Избыточное цитирование. Отредактируй или сообщение будет удалено
в соответствии с п. 3.9 норматива Москвы по эксплуатации жилищного фонда ЖНМ-2004/03 «Газопроводы и газовое оборудование жилых зданий», утвержденного и введенного в действие постановлением Правительства Москвы от 02.11.2004 № 758-ПП,
я из Украины, но спасибо за инфу

помоги лучше с кодом
 
Изменено:

Sergey_

✩✩✩✩✩✩✩
10 Май 2021
9
3
@Sergey_, А чего вы не захотели использовать готовый скетч из проекта Алекса ? Там есть все, что вам нужно: и белый свет, и эффекты, и перебор эффектов.
я приобрел ленту RGBW, хотел, чтобы был более четкий и яркий белый цвет, для подсветки стола. И планировал использовать библиотеку FASTLED для этой ленты, из этого же проекта. Но потом как оказалось, она не подходит для моей ленты(SK6812 RGBW), и пользоваться либо нужно NEO_PIXEL, либо изменять код Fastled с RGB ленты на RGBW-ленту и читал статью, но так и не смог разобраться, не программист, практики ноль, не совсем пойму принципы.
Поэтому и прошу помощи, кто сталкивался, возможно подскажут примерный проект, либо сбросят свой скетч. Заранее такому человеку хвала и "низчайшие поклоны"!
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
Сейчас проверил скетч Алекса: указал в нем в настройках Вашу ленту. прекрасно все скомпилилось. В реале проверить не могу-нет в наличии этой ленты. Там в разделе сетам, в 79 строке (вроде) указывается тип ленты. Что вам мешает проверить этот скетч? :)
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
другие цвета показывает лента
Ну так поменяйте порядок вывода цвета,делов то :),
В строке FastLED.addLeds<WS2811, LED_PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); переставить местами буквы :) ( я выделил какие буквы переставлять)
 
Изменено:

Sergey_

✩✩✩✩✩✩✩
10 Май 2021
9
3
@Leon111_09, идея хорошая, но как быть с белым диодом W? то есть он фактически работать вообще не будет?
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
как быть с белым диодом W
и фиг с ним: белый цвет в этой прошивке реализован включением всех трех цветов: там тройной тап по кнопке включает белый свет. Зайдите на страницу проекта у Алекса на сайте и посмотрите видео-он там подробно все показывает и рассказывает :)
 

bort707

★★★★★★✩
21 Сен 2020
3,056
910
Ну так поменяйте порядок вывода цвета,делов то
@Leon111_09, по-моему вы ошибаетесь. Так легко эту ленту в проекте Алекса не запустить.
В этой ленте в каждом пикселе 4 диода (R G B + W), поэтому ей требуется передавать по 32 бита на пиксель вместо 24 у обычной адресной.
Тут как не меняй настройки цвета - RGB GRB BRG - правильных цветов не получить.
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
Так легко эту ленту в проекте Алекса не запустить.
В этой ленте в каждом пикселе 4 диода (R G B + W), поэтому ей требуется передавать по 32 бита на пиксель вместо 24 у обычной адресной.
Тут как не меняй настройки цвета - RGB GRB BRG - правильных цветов не получить.
Может быть-я не имел дела с этой лентой. Просто помню,там в скетче в настройках ленты (в строке) даже в комментарии она упоминалась.Я и подумал что можно цвет обычным способом задать.
 

Sergey_

✩✩✩✩✩✩✩
10 Май 2021
9
3
@Leon111_09, по-моему вы ошибаетесь.
поддерживаю, не получиться через fastled, два пути:
1)
изменять код Fastled с RGB ленты на RGBW-ленту и читал статью, но так и не смог разобраться, не программист, практики ноль, не совсем пойму принципы.
2) использовать библиотеку Neo_Pixel
 

railways

✩✩✩✩✩✩✩
7 Янв 2022
1
0
@bort707, ну сходу даже не захотел компилироваться. выдает ошибку компиляции
 

Slenk

★★★★★★✩
21 Янв 2020
382
591
34
Краснодар
@railways, отличная статья на первый взгляд. (Бегло просмотрел и ничего не проверял). Но да, с наскоку действительно не получится.
Если взять модифицированную библиотеку из статьи и запустить скетч-пример из этой же статьи, то 99,9%, что все запустится с пол тычка. Но вот если попытаться запустить скетч Гайвера с этой библиотекой, то 100% он не заработает. Потому что в нём нужно будет сделать поправки на модифицированную библиотеку, ибо в ней цвет задается несколько иначе, чем в обычной фастлед.
 

Sergey_

✩✩✩✩✩✩✩
10 Май 2021
9
3
Если взять модифицированную библиотеку из статьи и запустить скетч-пример из этой же статьи, то 99,9%, что все запустится с пол тычка.
@Slenk, хотел бы к Вам обратиться с просьбой помощи в разработке скетча. Можете взять мой скетч и отредактировать согласно рекомендаций в статье, не совсем разбираюсь в коде. Буду Вам очень признателен.
 

bort707

★★★★★★✩
21 Сен 2020
3,056
910
Нет смысла не имея на руках соответствующей ленты