• 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
Wyłączenie Neopixel Ring Led po 10 sekundach
#1
Cześć,

Dopiero zaczynam i proszę pomoc ponieważ od tygodnia nie mogę sobie poradzić.
Płytka Arduino UNO plus Neopixel Ring LED 24 Diody.
Przeglądałem chyba wszystkie posty dotyczące delay, mills, times etc... ale nie znalazłem rozwiązania.
Zależy mi na tym aby po uruchomieniu Ring Leda, który będzie sobie świecił na różne sposoby zgasł po 10 sekundach.
Uruchomienie ponowne ma nastąpić dopiero po resecie albo z przycisku na płytce albo stworzonego przeze mnie pliku *.bat gdzie po uruchomieniu programu sam się resetuje - reset mam opanowany Wink

Poniżej kod, który chciałbym zmodyfikować tak aby Ring Led po rozpoczętej pracy zgasł po 10 sekundach.
Pewne rzeczy wiem a pewnych nie rozumiem mimo, iż poświęciłem teraz na to cały weekend Sad
Zastanawiam się czy jest opcja aby w void loop gdzie jest określony sposób przebiegu zapalania Ring Leda z góry określić, że ma się wyłączyć po tych 10 sekundach.
Pomyślałem, że może coś z fade wykombinować ale to dla mnie chyba jeszcze nie ten poziom.
Jestem w stanie napisać podstawowe rzeczy, rozumiem gdzie mają być zdefiniowane biblioteki, pisane komendy dla stałych i zapętlonych zdarzeń ale chyba porwałem się jeszcze z motyką na słońce.

Kod mam z www.tweaking4all.com.

Jeżeli jest ktoś chętny i pomoże?


Kod:
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define NUM_LEDS 24
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.show();

}

void loop() {

  theaterChaseRainbow(75);
}

void theaterChaseRainbow(int SpeedDelay) {
  byte *c;

  for (int j = 0; j < 256; j++) {   // cycle all 256 colors in the wheel
    for (int q = 0; q < 3; q++) {
      for (int i = 0; i < NUM_LEDS; i = i + 3) {
        c = Wheel( (i + j) % 255);
        setPixel(i + q, *c, *(c + 1), *(c + 2)); //turn every third pixel on
      }
      showStrip();

      delay(SpeedDelay);

      for (int i = 0; i < NUM_LEDS; i = i + 3) {
        setPixel(i + q, 0, 0, 0);    //turn every third pixel off
      }
    }
  }
}

byte * Wheel(byte WheelPos) {
  static byte c[3];

  if (WheelPos < 85) {
    c[0] = WheelPos * 3;
    c[1] = 255 - WheelPos * 3;
    c[2] = 0;
  } else if (WheelPos < 170) {
    WheelPos -= 85;
    c[0] = 255 - WheelPos * 3;
    c[1] = 0;
    c[2] = WheelPos * 3;
  } else {
    WheelPos -= 170;
    c[0] = 0;
    c[1] = WheelPos * 3;
    c[2] = 255 - WheelPos * 3;
  }

  return c;
}

void showStrip() {
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  FastLED.show();
#endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip.setPixelColor(Pixel, strip.Color(red, green, blue));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  leds[Pixel].r = red;
  leds[Pixel].g = green;
  leds[Pixel].b = blue;
#endif
}

void setAll(byte red, byte green, byte blue) {
  for (int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue);
  }
  showStrip();
}
 
Odpowiedź
#2
Odmierzanie czasu znajdziesz w przykładach arduino blinkWhithOutDelay, zamiast migać ledem to sobie zliczaj sekundy do jakieś zmiennej, po 10s jak mniemam należy użyć metod strip.clear() i strip.show() i wejść w jakąś pętlę oczekującą albo na przycisk albo reset. W ogóle jak się bawisz nową biblioteką, to otwórz jej katalog, tam jest keywords.txt i spis wszystkiego co możesz użyć, ewentualnie można przejrzeć pliki *.cpp, *.c, *h.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości