Всем привет! Хотел поделиться своим проектом, который реализовал у себя дома для кухни, возможно будет для кого-то полезным учесть мои ошибки либо доработать уже имеющийся проект. Также большая просьба подсказать в доработке проекта, ниже все описал. Заранее благодарю за помощь
Решил сделать в процессе ремонта. Света достаточно, все видно на видео. Проект выполнил после того как собрал по видео лампу Gyverlamp. Отдельное спасибо Алексу, он вдохновил на создание этого проекта!
Использовал светодиодную ленту SK6812(RGBW), 120 пикселей, и сенсорную кнопку TTP223.
Схема подключения ниже, также установил кнопку на БП для удобства.
Кнопку скрыл профилем
БП и Ардуино НАНО спрятал в ящике, Ардуинку повесил в распределительной коробке
Ниже примеры работы
Код
Есть определенные проблемы,
а. я не программист, и писал код из стандартных примеров неопикселя, что-то большее так и не смог сделать кроме эффекта "colorWipe", возможно кто-то сможем подсказать либо увязать те эффекты, которые есть в моем скетче, либо подскажет пример похожей работы с лентами RGBW.
б. При включенной либо выключенный ленте и небольших перепадах напряжения... лента то включается, то выключается, возможно тоже кто-то подскажет.
Решил сделать в процессе ремонта. Света достаточно, все видно на видео. Проект выполнил после того как собрал по видео лампу Gyverlamp. Отдельное спасибо Алексу, он вдохновил на создание этого проекта!
Использовал светодиодную ленту SK6812(RGBW), 120 пикселей, и сенсорную кнопку TTP223.
Схема подключения ниже, также установил кнопку на БП для удобства.
Кнопку скрыл профилем
БП и Ардуино НАНО спрятал в ящике, Ардуинку повесил в распределительной коробке
Ниже примеры работы
Код
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
}
}
}
Есть определенные проблемы,
а. я не программист, и писал код из стандартных примеров неопикселя, что-то большее так и не смог сделать кроме эффекта "colorWipe", возможно кто-то сможем подсказать либо увязать те эффекты, которые есть в моем скетче, либо подскажет пример похожей работы с лентами RGBW.
Идея была следующая:
1. Одно нажатие - включение со стандартным эффектом "colorWipe" - загарается белый свет, и лента переходит в режим ожидание при включении.
2. При включенной ленте(белый свет):
- однократное нажатие - выключение с эффектом "colorWipe" и цикл к первому пункту
- зажатие кнопки - яркость
- тройное нажатие - переход в режим эффектов(радуга, огонь, стробоскоп, и т.д.)
- однократное нажатие переключение эффектов, при троекратном нажатии - выключение и цикл к первому пункту.
б. При включенной либо выключенный ленте и небольших перепадах напряжения... лента то включается, то выключается, возможно тоже кто-то подскажет.
Вложения
-
34.7 KB Просмотры: 88