22-10-2019, 19:22
(Ten post był ostatnio modyfikowany: 22-10-2019, 19:41 przez PiegowatyGuziec.)
Hej, mam kod jak poniżej i staram się pozbyć delay z pętli FOR by zachować responsywność programu - a jak wiemy delay w niczym nie pomaga. Starałem się z biblioteki Timers coś podziałać ale efekt jest taki że kolor paska nie zmienia się płynnie jak przy DELAY stąd mam pytanie do was, jak to ugryźć ?
Czyli po naciśnięciu guzika cały pasek robi się czerwony pomijając pętlę. Niestety nawet z millis nie wiem jak to przeskoczyć by było dalej płynnie.
Kod:
#include <Adafruit_NeoPixel.h>
const int ledPin = 4;
const int numLeds = 36;
const int STP = 20;
#include <Timers.h>
Timer ledBlinkTimer;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(numLeds, ledPin, NEO_RGB + NEO_KHZ800);
void setup() {
strip.begin();
strip.setBrightness(80); // 1/3 brightness
pinMode(7, INPUT_PULLUP);
ledBlinkTimer.begin(1500);
}
void loop() {
if (digitalRead(7) == LOW){
brakemode();
}
else {
rainbow(3500);
}
}
void rainbow(uint8_t wait) {
uint16_t i, j;
for(j=0; j<256; j++) {
if (ledBlinkTimer.available()){
strip.setPixelColor(0, Wheel((i*1+j) & 255));
strip.setPixelColor(1, Wheel((i*1+j) & 255));
strip.setPixelColor(2, Wheel((i*1+j) & 255));
strip.setPixelColor(3, Wheel((i*1+j) & 255));
strip.setPixelColor(4, Wheel((i*1+j) & 255));
strip.setPixelColor(5, Wheel((i*1+j) & 255));
strip.setPixelColor(6, Wheel((i*1+j) & 255));
strip.setPixelColor(7, Wheel((i*1+j) & 255));
strip.setPixelColor(8, Wheel((i*1+j) & 255));
strip.setPixelColor(9, Wheel((i*1+j) & 255));
strip.setPixelColor(10, Wheel((i*1+j) & 255));
strip.setPixelColor(11, Wheel((i*1+j) & 255));
strip.setPixelColor(12, Wheel((i*1+j) & 255));
strip.setPixelColor(13, Wheel((i*1+j) & 255));
strip.setPixelColor(14, Wheel((i*1+j) & 255));
strip.setPixelColor(15, Wheel((i*1+j) & 255));
strip.setPixelColor(16, Wheel((i*1+j) & 255));
strip.setPixelColor(17, Wheel((i*1+j) & 255));
strip.setPixelColor(18, Wheel((i*1+j) & 255));
strip.setPixelColor(19, Wheel((i*1+j) & 255));
strip.setPixelColor(20, Wheel((i*1+j) & 255));
strip.setPixelColor(21, Wheel((i*1+j) & 255));
strip.setPixelColor(22, Wheel((i*1+j) & 255));
strip.setPixelColor(23, Wheel((i*1+j) & 255));
strip.setPixelColor(24, Wheel((i*1+j) & 255));
strip.setPixelColor(25, Wheel((i*1+j) & 255));
strip.setPixelColor(26, Wheel((i*1+j) & 255));
strip.setPixelColor(27, Wheel((i*1+j) & 255));
strip.setPixelColor(28, Wheel((i*1+j) & 255));
strip.setPixelColor(29, Wheel((i*1+j) & 255));
strip.setPixelColor(30, Wheel((i*1+j) & 255));
strip.setPixelColor(31, Wheel((i*1+j) & 255));
strip.setPixelColor(32, Wheel((i*1+j) & 255));
strip.setPixelColor(33, Wheel((i*1+j) & 255));
strip.setPixelColor(34, Wheel((i*1+j) & 255));
strip.setPixelColor(35, Wheel((i*1+j) & 255));
strip.setPixelColor(36, Wheel((i*1+j) & 255));
strip.show();
ledBlinkTimer.restart();
}
}
}
uint32_t Wheel(byte WheelPos) {
if(WheelPos < 85) {
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
else if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
else {
WheelPos -= 170;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
}
void brakemode(void){
//strip.setPixelColor(i, G, R, B, W);
strip.setPixelColor(0, 0, STP, 0);
strip.setPixelColor(1, 0, STP, 0);
strip.setPixelColor(2, 0, STP, 0);
strip.setPixelColor(3, 0, STP, 0);
strip.setPixelColor(4, 0, STP, 0);
strip.setPixelColor(5, 0, STP, 0);
strip.setPixelColor(6, 0, STP, 0);
strip.setPixelColor(7, 0, STP, 0);
strip.setPixelColor(8, 0, STP, 0);
strip.setPixelColor(9, 0, STP, 0);
strip.setPixelColor(10, 0, STP, 0);
strip.setPixelColor(11, 0, STP, 0);
strip.setPixelColor(12, 0, STP, 0);
strip.setPixelColor(13, 0, STP, 0);
strip.setPixelColor(14, 0, STP, 0);
strip.setPixelColor(15, 0, STP, 0);
strip.setPixelColor(16, 0, STP, 0);
strip.setPixelColor(17, 0, STP, 0);
strip.setPixelColor(18, 0, STP, 0);
strip.setPixelColor(19, 0, STP, 0);
strip.show();
}
Czyli po naciśnięciu guzika cały pasek robi się czerwony pomijając pętlę. Niestety nawet z millis nie wiem jak to przeskoczyć by było dalej płynnie.