Всем привет. Сегодня я покажу как можно доработать подсветку мыши. Сделал я её на светодиодах ws2812b, которые ещё называют адресными.
Решил я это сделать, потому что у моей мыши была обычная подсветка синего цвета.
Внутри стояли три светодиода, которые просто горели и никак не управлялись.
Приделал на двухсторонний скотч 8 светодиодов. Справа в посадочном месте стоял грузик, вместо него отлично встала ардуинка.
Световые эффекты в прошивке поделил на четыре зоны: левая кнопка, правая, четыре светодиода в центре, два внизу. Для реализации одного из эффектов подключил потенциометр колёсика к ардуине, чтобы определять вращается колёсико или нет.
Перейдём к коду прошивки.
********************************************
#include <Thread.h>
Thread bodyT = Thread();
Thread lbT = Thread();
Thread rbT = Thread();
Thread counterT = Thread();
Thread idlT = Thread();
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 7
#define NUM_LEDS 8
#define IDLS 600 //idle mode delay in seconds
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
const int wheelPin = A0;
uint16_t i=0, j=0; //body
uint16_t ti=0, tj=0; //tail
uint16_t jlb=0; //left button
uint16_t jrb=150; //right button
int bo[]={0,2,3,4,5,1}; //body order
int idlo[]={0,2,3,7,6,4,5,1}; //idle order
int wos=0; //wheel order position
byte wh=0;
bool idle=false; //idle state
int idlet=0; //idle time counter
int idlei=0; //idle led pos 1
int idlen=0; //idle led pos 2
void setup() {
#if defined (__AVR_ATtiny85__)
if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
strip.begin();
strip.setBrightness(50);
strip.show();
bodyT.onRun(bodyF);
bodyT.setInterval(20);
lbT.onRun(lbF);
lbT.setInterval(15);
rbT.onRun(rbF);
rbT.setInterval(70);
counterT.onRun(counterF);
counterT.setInterval(1000);
idlT.onRun(idlF);
idlT.setInterval(3000);
}
void loop() {
if (counterT.shouldRun()) counterT.run();
if (!idle) {
if (bodyT.shouldRun()) bodyT.run();
if (lbT.shouldRun()) lbT.run();
if (rbT.shouldRun()) rbT.run();
} else {
if (idlT.shouldRun()) idlT.run();
}
if(wh==1) {
if(analogRead(wheelPin)>500) {tail();wh=2;}
} else {
if(analogRead(wheelPin)<500) {tail();wh=1;}
}
}
void counterF() {
if(!idle) idlet++;
if(idlet>IDLS) idle=true;
}
void idlF() {
strip.setPixelColor(idlo[idlei], Wheel(((idlei * 256 / strip.numPixels()) + j) & 255));
strip.show();
delay(75);
if(idlei==0) idlen=7; else idlen=idlei-1;
strip.setPixelColor(idlo[idlen], strip.Color(0, 0, 0));
strip.show();
if(idlei==7) idlei=0; else idlei++;
j++;
if(j>=256*5) j=0;
}
void tail() {
idle=false;
idlet=0;
for(ti=0; ti< 2; ti++) {
strip.setPixelColor(ti, Wheel(((ti * 256 / strip.numPixels()) + tj) & 255));
}
strip.show();
tj+=20;
if(tj>=256*5) tj=0;
}
void bodyF() {
for(i=2; i< strip.numPixels()-2; i++) {
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
}
strip.show();
j++;
if(j>=256*5) j=0;
}
void lbF() {
strip.setPixelColor(7, Wheel((7+jlb) & 255));
strip.show();
jlb++;
if(jlb>=106) jlb=0;
}
void rbF() {
strip.setPixelColor(6, Wheel((6+jrb) & 255));
strip.show();
jrb++;
if(jrb>=256) jrb=150;
}
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if(WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
***************************************************
Вкратце по коду. Три функции: для каждой кнопки и средней зоны. Ещё одна функция для нижней зоны, которая срабатывает при вращении колёсика. Функция счетчика времени простоя. И функция для эффекта во время простоя, запускающаяся после 10 минут бездействия.
Также в этом проекте я освоил библиотеку Thread.h. Она позволяет как бы одновременно выполнять несколько функций. Но это не настоящая многозадачность конечно же. Ведь это ардуино.
Эффекты такие: на левой кнопке переход с оранжевого на зелёный цвет, на правой с синего на красный с меньшей скоростью, в центральной зоне эффект радуги и в нижней зоне меняющиеся цвета при вращении колёсика. В режиме простоя один бегущий светодиод разными цветами.