• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Rezygnacja z Delay w kodzie
#1
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źć ?

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.
 
Odpowiedź
#2
Pokaz kod z delay.
 
Odpowiedź
#3
OK, wystarczyło z break skorzystać Smile
Ale teraz pytanie, jak spowolnić zmianę koloru dość znacząco ? Bo zmiana prarametru w rainbow(2600); przynosi rezultat ale dalej leci to dużo za szybko dla mnie
Kod:
#include <Adafruit_NeoPixel.h>
const int ledPin  = 4;
const int numLeds = 36;
const int STP     = 20;

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);
}

void loop() {
if (digitalRead(7) == LOW){
  brakemode();
}
else {
  rainbow(2600);
}
    
}


void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
      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();
      
      if (digitalRead(7) == LOW) {
      break;}
      
      delay(wait);
  }
}


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.setPixelColor(20, 0, STP, 0);
strip.setPixelColor(21, 0, STP, 0);
strip.setPixelColor(22, 0, STP, 0);
strip.setPixelColor(23, 0, STP, 0);
strip.setPixelColor(24, 0, STP, 0);
strip.setPixelColor(25, 0, STP, 0);
strip.setPixelColor(26, 0, STP, 0);
strip.setPixelColor(27, 0, STP, 0);
strip.setPixelColor(28, 0, STP, 0);
strip.setPixelColor(29, 0, STP, 0);
strip.setPixelColor(30, 0, STP, 0);
strip.setPixelColor(31, 0, STP, 0);
strip.setPixelColor(32, 0, STP, 0);
strip.setPixelColor(33, 0, STP, 0);
strip.setPixelColor(34, 0, STP, 0);
strip.setPixelColor(35, 0, STP, 0);
strip.setPixelColor(36, 0, STP, 0);
strip.show();
}
 
Odpowiedź
#4
Masz źle napisaną funkcję "rainbow" która zawiera pętlę. Jak używasz millis, to nie możesz mieć pętli, w której trzeba czekać.
 
Odpowiedź
#5
(23-10-2019, 08:58)semi napisał(a): Masz źle napisaną funkcję "rainbow" która zawiera pętlę. Jak używasz millis, to nie możesz mieć pętli, w której trzeba czekać.

Ale wyjście z pętli działa bez problemu.

Więc zostaje tylko, jak spowolnic animacje mocniej niż w parametrze (on działa dobrze od 1 do 500-600, powyżej bez zmian).
 
Odpowiedź
#6
(23-10-2019, 09:59)PiegowatyGuziec napisał(a): Więc zostaje tylko, jak spowolnic animacje mocniej niż w parametrze
Pozostaje napisać to inaczej, bez pętli z wykorzystaniem millis i maszyny stanów.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości