Beschleunigung der Abfrage des Knopfdruckpins am Arduino

LinuxWindows

Cadet 3rd Year
Registriert
Okt. 2018
Beiträge
39
Hallo liebes Forum,
ich habe ein Programm geschrieben, mit dem ich meinen NeoPixel-Led-Streifen mit dem Arduino steuern kann. Ich kann zwischen den Effekten und Lichtern per Knopf hin und her wechseln. Das Problem ist, wenn die Animationen schwieriger werden, wird der Taster seltener Abgefragt. So kommt es das man zum Wechseln der Modi teilsweise den Knopf bis zu einer Minute lang drücken muss. Kann mir jemand sagen, wie ich das beschleunige? Hier ist der Code:
C-ähnlich:
#include <Adafruit_NeoPixel.h>
#define PIN 2
#define NUMPIXELS 15
const int ButtonPin = 7;
;
int Licht = 0;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  // put your setup code here, to run onc.begin();
  strip.begin();
  pinMode(ButtonPin, INPUT);
  Serial.begin(9600);
  strip.show();
  }
int ButtonState = digitalRead(ButtonPin);

void loop() {
  // put your main code here, to run repeatedly:
  for (;;){
    ButtonState = digitalRead(ButtonPin);
Serial.print(ButtonState);
 Knopf();
  }

 
 
}

void Prufen(){
  if (Licht == 10){
  Licht = 0;}
  if (Licht == 1){
    Weis();
  }
   if (Licht == 2){
    ColorWipe();
  }
   if (Licht == 3){
    Rot();
  }
   if (Licht == 4){
    Blau();
  }
   if (Licht == 5){
    Grun();
  }
   if (Licht == 6){
    TheaterChase();
  }
   if (Licht == 7){
    Rainbow();
  }
   if (Licht == 8){
    RainbowCyle();
  }
   if (Licht == 9){
    TheaterChaseRainbow();
   }
}

void Knopf(){
 
  if (ButtonState == HIGH){
    
   ButtonState = 0;
  
    Licht = Licht +1;
     delay(1000);
    
  }
   Prufen();
   strip.show();
}
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}
 
void ColorWipe(){
  colorWipe(strip.Color(255, 0, 0), 50); // Red
colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue

}

void TheaterChase(){
  theaterChase(strip.Color(127, 127, 127), 50); // White
  theaterChase(strip.Color(127, 0, 0), 50); // Red
  theaterChase(strip.Color(0, 0, 127), 50); // Blue
  theaterChase(strip.Color(0, 127, 0), 50); // Blue

}

void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}
void Rainbow(){
  rainbow(20);
}

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

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

void RainbowCyle(){
  rainbowCycle(20);
}

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

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

void TheaterChaseRainbow(){
  theaterChaseRainbow(50);
}

void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

void Weis(){
 strip.setPixelColor(0, 225, 225, 225);
 strip.setPixelColor(1, 225, 225, 225);
 strip.setPixelColor(2, 225, 225, 225);
 strip.setPixelColor(3, 225, 225, 225);
 strip.setPixelColor(4, 225, 225, 225);
 strip.setPixelColor(5, 225, 225, 225);
 strip.setPixelColor(6, 225, 225, 225);
 strip.setPixelColor(7, 225, 225, 225);
 strip.setPixelColor(8, 225, 225, 225);
 strip.setPixelColor(9, 225, 225, 225);
 strip.setPixelColor(10, 225, 225, 225);
 strip.setPixelColor(11, 225, 225, 225);
 strip.setPixelColor(12, 225, 225, 225);
 strip.setPixelColor(13, 225, 225, 225);
 strip.setPixelColor(14, 225, 225, 225);
 
}

void Rot(){
    strip.setPixelColor(0, 225, 0, 0);
 strip.setPixelColor(1, 225, 0, 0);
 strip.setPixelColor(2, 225, 0, 0);
 strip.setPixelColor(3, 225, 0, 0);
 strip.setPixelColor(4, 225, 0, 0);
 strip.setPixelColor(5, 225, 0, 0);
 strip.setPixelColor(6, 225, 0, 0);
 strip.setPixelColor(7, 225, 0, 0);
 strip.setPixelColor(8, 225, 0, 0);
 strip.setPixelColor(9, 225, 0, 0);
 strip.setPixelColor(10, 225, 0, 0);
 strip.setPixelColor(11, 225, 0, 0);
 strip.setPixelColor(12, 225, 0, 0);
 strip.setPixelColor(13, 225, 0, 0);
 strip.setPixelColor(14, 225, 0, 0);
}

void Grun(){
  strip.setPixelColor(0, 0, 225, 0);
   strip.setPixelColor(1, 0, 225, 0);
 strip.setPixelColor(2, 0, 225, 0);
 strip.setPixelColor(3, 0, 225, 0);
 strip.setPixelColor(4, 0, 225, 0);
 strip.setPixelColor(5, 0, 225, 0);
 strip.setPixelColor(6, 0, 225, 0);
 strip.setPixelColor(7, 0, 225, 0);
 strip.setPixelColor(8, 0, 225, 0);
 strip.setPixelColor(9, 0, 225, 0);
 strip.setPixelColor(10, 0, 225, 0);
 strip.setPixelColor(11, 0, 225, 0);
 strip.setPixelColor(12, 0, 225, 0);
 strip.setPixelColor(13, 0, 225, 0);
 strip.setPixelColor(14, 0, 225, 0);
}

void Blau(){
  strip.setPixelColor(0, 0, 0, 225);
  strip.setPixelColor(1, 0, 0, 225);
 strip.setPixelColor(2, 0, 0, 225);
 strip.setPixelColor(3, 0, 0, 225);
 strip.setPixelColor(4, 0, 0, 225);
 strip.setPixelColor(5, 0, 0, 225);
 strip.setPixelColor(6, 0, 0, 225);
 strip.setPixelColor(7, 0, 0, 225);
 strip.setPixelColor(8, 0, 0, 225);
 strip.setPixelColor(9, 0, 0, 225);
 strip.setPixelColor(10, 0, 0, 225);
 strip.setPixelColor(11, 0, 0, 225);
 strip.setPixelColor(12, 0, 0, 225);
 strip.setPixelColor(13, 0, 0, 225);
 strip.setPixelColor(14, 0, 0, 225);
}


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);
}
Kann mir jemand helfen?:confused_alt:
Danke im Voraus
 
Dein Problem ist, dass deine Anwendung nur in einem Thread läuft. Und ein einzelner Thread kann eben nur entweder Code ausführen oder auf Eingabe warten. Für beides gleichzeitig müsstest du mit mehreren Threads / Prozessen arbeiten (siehe: "nebenläufige Programmierung", "parallele Programmierung", "multithreading", "multitasking" )
 
Soll ich dir jetzt sagen wie man Google benutzt? ;)
 
LinuxWindows (1 Jahr alt) weiß nicht wie er millis() in den Code implementieren kann.:D
Nein ich versteh zwar wie der Code läuft, das ist aber kein echtes Multitasking und wie könnte ich es implementieren?
 
Wir haben hier nun 3 Möglichkeiten:

1. Wir geben die Suchbegriffe bei Google ein und schicken dir die ersten 5 Links.
2. Wir geben die Suchbegriffe bei Google ein kopieren den Inhalt der ersten 5 Links.
3. Du gibst sie selbst ein und schaust was du so findest.

Hier wird dir keiner ein neues Tutorial schreiben, das es schon in tausendfacher Ausführung online gibt ;)

Die von @new Account() genannten Interrupts sind aber wahrscheinlich noch viel einfacher in der Anwendung als eine vollständige multithreaded Umsetzung.

Hint:
- arduino interrupts button
- arduino parallel execution
- arduino multithreading
- etc. pp.
 
Ich hab den Interrupt eingebaut, aber es funktioniert trotzdem nicht!
C-ähnlich:
#include <Adafruit_NeoPixel.h>
#define PIN 2
#define NUMPIXELS 15

;
int Licht = 0;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  // put your setup code here, to run onc.begin();
  strip.begin();
 
  Serial.begin(9600);
  strip.show();
  pinMode(3, INPUT);
attachInterrupt(3, Knopf, HIGH);
  }
volatile int ButtonState = 0;

void loop() {
  // put your main code here, to run repeatedly:
  Knopf();

 
 
}

void Prufen(){
  if (Licht == 10){
  Licht = 0;}
  if (Licht == 1){
    Weis();
  }
   if (Licht == 2){
    ColorWipe();
  }
   if (Licht == 3){
    Rot();
  }
   if (Licht == 4){
    Blau();
  }
   if (Licht == 5){
    Grun();
  }
   if (Licht == 6){
    TheaterChase();
  }
   if (Licht == 7){
    Rainbow();
  }
   if (Licht == 8){
    RainbowCyle();
  }
   if (Licht == 9){
    TheaterChaseRainbow();
   }
}

void Knopf(){
  ButtonState = digitalRead (3);
  if (ButtonState == HIGH){
    
   ButtonState = 0;
  
    Licht = Licht +1;
     delay(1000);
    
  }
   Prufen();
   strip.show();
}
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}
 
void ColorWipe(){
  colorWipe(strip.Color(255, 0, 0), 50); // Red
colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue

}

void TheaterChase(){
  theaterChase(strip.Color(127, 127, 127), 50); // White
  theaterChase(strip.Color(127, 0, 0), 50); // Red
  theaterChase(strip.Color(0, 0, 127), 50); // Blue
  theaterChase(strip.Color(0, 127, 0), 50); // Blue

}

void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}
void Rainbow(){
  rainbow(20);
}

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

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

void RainbowCyle(){
  rainbowCycle(20);
}

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

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

void TheaterChaseRainbow(){
  theaterChaseRainbow(50);
}

void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

void Weis(){
 strip.setPixelColor(0, 225, 225, 225);
 strip.setPixelColor(1, 225, 225, 225);
 strip.setPixelColor(2, 225, 225, 225);
 strip.setPixelColor(3, 225, 225, 225);
 strip.setPixelColor(4, 225, 225, 225);
 strip.setPixelColor(5, 225, 225, 225);
 strip.setPixelColor(6, 225, 225, 225);
 strip.setPixelColor(7, 225, 225, 225);
 strip.setPixelColor(8, 225, 225, 225);
 strip.setPixelColor(9, 225, 225, 225);
 strip.setPixelColor(10, 225, 225, 225);
 strip.setPixelColor(11, 225, 225, 225);
 strip.setPixelColor(12, 225, 225, 225);
 strip.setPixelColor(13, 225, 225, 225);
 strip.setPixelColor(14, 225, 225, 225);
 
}

void Rot(){
    strip.setPixelColor(0, 225, 0, 0);
 strip.setPixelColor(1, 225, 0, 0);
 strip.setPixelColor(2, 225, 0, 0);
 strip.setPixelColor(3, 225, 0, 0);
 strip.setPixelColor(4, 225, 0, 0);
 strip.setPixelColor(5, 225, 0, 0);
 strip.setPixelColor(6, 225, 0, 0);
 strip.setPixelColor(7, 225, 0, 0);
 strip.setPixelColor(8, 225, 0, 0);
 strip.setPixelColor(9, 225, 0, 0);
 strip.setPixelColor(10, 225, 0, 0);
 strip.setPixelColor(11, 225, 0, 0);
 strip.setPixelColor(12, 225, 0, 0);
 strip.setPixelColor(13, 225, 0, 0);
 strip.setPixelColor(14, 225, 0, 0);
}

void Grun(){
  strip.setPixelColor(0, 0, 225, 0);
   strip.setPixelColor(1, 0, 225, 0);
 strip.setPixelColor(2, 0, 225, 0);
 strip.setPixelColor(3, 0, 225, 0);
 strip.setPixelColor(4, 0, 225, 0);
 strip.setPixelColor(5, 0, 225, 0);
 strip.setPixelColor(6, 0, 225, 0);
 strip.setPixelColor(7, 0, 225, 0);
 strip.setPixelColor(8, 0, 225, 0);
 strip.setPixelColor(9, 0, 225, 0);
 strip.setPixelColor(10, 0, 225, 0);
 strip.setPixelColor(11, 0, 225, 0);
 strip.setPixelColor(12, 0, 225, 0);
 strip.setPixelColor(13, 0, 225, 0);
 strip.setPixelColor(14, 0, 225, 0);
}

void Blau(){
  strip.setPixelColor(0, 0, 0, 225);
  strip.setPixelColor(1, 0, 0, 225);
 strip.setPixelColor(2, 0, 0, 225);
 strip.setPixelColor(3, 0, 0, 225);
 strip.setPixelColor(4, 0, 0, 225);
 strip.setPixelColor(5, 0, 0, 225);
 strip.setPixelColor(6, 0, 0, 225);
 strip.setPixelColor(7, 0, 0, 225);
 strip.setPixelColor(8, 0, 0, 225);
 strip.setPixelColor(9, 0, 0, 225);
 strip.setPixelColor(10, 0, 0, 225);
 strip.setPixelColor(11, 0, 0, 225);
 strip.setPixelColor(12, 0, 0, 225);
 strip.setPixelColor(13, 0, 0, 225);
 strip.setPixelColor(14, 0, 0, 225);
}


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);
}
Wie kann das sein? Pin3 ist doch Interrupt-Pin? Liegt das daran, das der Arduino ein clon ist?
Ergänzung ()

Na, ja es erkennt den Knopfdruck viel zu fein! Bei der geringsten Bewegung ändert sich der Wert um mehrere Effekte! Wie kann ich das Filtern?
 
Zuletzt bearbeitet:
@benneque Arduino (ich gehe jetzt mal vom Uno aus) kann kein Multithreading, zumindest kein Hardware Multithreading. Man könnte natürlich in Software Multithreading implementieren, aber das macht auf einem Single Core 8-bit Microcontroller nicht wirklich Sinn. Das ist definitiv der falsche Weg um das Problem des TE zu lösen.

Die Lösung des Problems des TE ist, wie @new Account() und @Xenons schon gesagt haben, Interrupts und Button Debouncing. Dazu findet man massenhaft Tutorials im Internet.

Gruß
BlackMark
 
Lies halt die Doku, wenn du wissen willst, was es macht: Bounce2 Wiki

Bounce2 bringt dir jedoch nichts, denn sie löst dein Problem nicht, siehe: bool update()
Because Bounce does not use interrupts, you have to "update" the object before reading its value and it has to be done as often as possible (that means to include it in your loop()). The update() method updates the object and returns true (1) if the pin state changed. False (0) if not. Only call update() once per loop().

Wenn es keine passende Library gibt, wird dir wohl nichts anderes über bleiben, als interrupt driven button debouncing selbst zu implementieren. Aber vielleicht gibt es ja eine Library, die das schon kann. Ich weiß es nicht und habe keine Lust für dich zu googlen, das kannst du selbst, und wenn nicht musst du es lernen.

Gruß
BlackMark
 
Das sollte doch funktionieren:
C-ähnlich:
#include <Adafruit_NeoPixel.h>
#define PIN 2
#define NUMPIXELS 15

;
int Licht = 0;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  // put your setup code here, to run onc.begin();
  strip.begin();
 
  Serial.begin(9600);
  strip.show();
  pinMode(3, INPUT);

  }
 
volatile int ButtonState = 0;

attachInterrupt(1, Knopf, RISING);

int uberprufer = 0;

void loop() {
  // put your main code here, to run repeatedly:
 
  if (uberprufer <= 1){
    uberprufer =0;
  }

 
 
}

void Prufen(){
  if (Licht == 10){
  Licht = 0;}
  if (Licht == 1){
    Weis();
  }
   if (Licht == 2){
    ColorWipe();
  }
   if (Licht == 3){
    Rot();
  }
   if (Licht == 4){
    Blau();
  }
   if (Licht == 5){
    Grun();
  }
   if (Licht == 6){
    TheaterChase();
  }
   if (Licht == 7){
    Rainbow();
  }
   if (Licht == 8){
    RainbowCyle();
  }
   if (Licht == 9){
    TheaterChaseRainbow();
   }
}

void Knopf(){
  if (uberprufer == 0){
  ButtonState = digitalRead (3);
 
  if (ButtonState == HIGH){
    
   ButtonState = 0;
  uberprufer= uberprufer +1;
    Licht = Licht +1;
    Serial.print(Licht);
    
    
    Prufen();
   strip.show();
   delay(1000);
  }
  }
}
 
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}
 
void ColorWipe(){
  colorWipe(strip.Color(255, 0, 0), 50); // Red
colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue

}

void TheaterChase(){
  theaterChase(strip.Color(127, 127, 127), 50); // White
  theaterChase(strip.Color(127, 0, 0), 50); // Red
  theaterChase(strip.Color(0, 0, 127), 50); // Blue
  theaterChase(strip.Color(0, 127, 0), 50); // Blue

}

void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}
void Rainbow(){
  rainbow(20);
}

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

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

void RainbowCyle(){
  rainbowCycle(20);
}

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

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

void TheaterChaseRainbow(){
  theaterChaseRainbow(50);
}

void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

void Weis(){
 strip.setPixelColor(0, 225, 225, 225);
 strip.setPixelColor(1, 225, 225, 225);
 strip.setPixelColor(2, 225, 225, 225);
 strip.setPixelColor(3, 225, 225, 225);
 strip.setPixelColor(4, 225, 225, 225);
 strip.setPixelColor(5, 225, 225, 225);
 strip.setPixelColor(6, 225, 225, 225);
 strip.setPixelColor(7, 225, 225, 225);
 strip.setPixelColor(8, 225, 225, 225);
 strip.setPixelColor(9, 225, 225, 225);
 strip.setPixelColor(10, 225, 225, 225);
 strip.setPixelColor(11, 225, 225, 225);
 strip.setPixelColor(12, 225, 225, 225);
 strip.setPixelColor(13, 225, 225, 225);
 strip.setPixelColor(14, 225, 225, 225);
 
}

void Rot(){
    strip.setPixelColor(0, 225, 0, 0);
 strip.setPixelColor(1, 225, 0, 0);
 strip.setPixelColor(2, 225, 0, 0);
 strip.setPixelColor(3, 225, 0, 0);
 strip.setPixelColor(4, 225, 0, 0);
 strip.setPixelColor(5, 225, 0, 0);
 strip.setPixelColor(6, 225, 0, 0);
 strip.setPixelColor(7, 225, 0, 0);
 strip.setPixelColor(8, 225, 0, 0);
 strip.setPixelColor(9, 225, 0, 0);
 strip.setPixelColor(10, 225, 0, 0);
 strip.setPixelColor(11, 225, 0, 0);
 strip.setPixelColor(12, 225, 0, 0);
 strip.setPixelColor(13, 225, 0, 0);
 strip.setPixelColor(14, 225, 0, 0);
}

void Grun(){
  strip.setPixelColor(0, 0, 225, 0);
   strip.setPixelColor(1, 0, 225, 0);
 strip.setPixelColor(2, 0, 225, 0);
 strip.setPixelColor(3, 0, 225, 0);
 strip.setPixelColor(4, 0, 225, 0);
 strip.setPixelColor(5, 0, 225, 0);
 strip.setPixelColor(6, 0, 225, 0);
 strip.setPixelColor(7, 0, 225, 0);
 strip.setPixelColor(8, 0, 225, 0);
 strip.setPixelColor(9, 0, 225, 0);
 strip.setPixelColor(10, 0, 225, 0);
 strip.setPixelColor(11, 0, 225, 0);
 strip.setPixelColor(12, 0, 225, 0);
 strip.setPixelColor(13, 0, 225, 0);
 strip.setPixelColor(14, 0, 225, 0);
}

void Blau(){
  strip.setPixelColor(0, 0, 0, 225);
  strip.setPixelColor(1, 0, 0, 225);
 strip.setPixelColor(2, 0, 0, 225);
 strip.setPixelColor(3, 0, 0, 225);
 strip.setPixelColor(4, 0, 0, 225);
 strip.setPixelColor(5, 0, 0, 225);
 strip.setPixelColor(6, 0, 0, 225);
 strip.setPixelColor(7, 0, 0, 225);
 strip.setPixelColor(8, 0, 0, 225);
 strip.setPixelColor(9, 0, 0, 225);
 strip.setPixelColor(10, 0, 0, 225);
 strip.setPixelColor(11, 0, 0, 225);
 strip.setPixelColor(12, 0, 0, 225);
 strip.setPixelColor(13, 0, 0, 225);
 strip.setPixelColor(14, 0, 0, 225);
}


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);
}
Ergänzung ()

Der Interrupt muss zwar in
C-ähnlich:
void setup(){}
sein, dann funktioniert es aber hervorragend (man muss nur manchmal Geduld haben, dass
C-ähnlich:
uberprufen
durch
C-ähnlich:
void loop(){}
resettet wird).
 
Zuletzt bearbeitet:
Du missachtest komplett das wichtigste bei der Verwendung von Interrupts, nämlich dass deine Interrupt Routine so kurz wie nur möglich sein soll. Du hast sogar ein sleep in deinem Interrupt, also schlimmer geht es gar nicht.

Alles was dein Interrupt machen soll, ist debouncen und den button state in einer volatile Variable speichern. Checken was der state ist und dementsprechend handeln sollte alles in deinem loop passieren. Wahrscheinlich willst du eh nur das button down event haben und so lange speichern, bis dein loop es gesehen und verarbeitet hat. Also Interrupt setzt ein bit und loop cleared es wieder.

Zum debouncen bietet sich millis() an, damit kannst du die Zeit zwischen button events messen und wenn die zu kurz ist, ignorierst du einfach das event.

Lies dich mal in button debouncing und Interrupts ein, dann siehst du ganz schnell, dass deine Lösung absoluter Blödsinn ist.

Gruß
BlackMark
 
Schwer zu lesen der Code, hab ihn etwas überarbeitet und ein Entprell-Macro reingemacht und einen Makro-Check ob der Button gedrückt wurde, so das die Schleifen sofort verlassen werden:
C-ähnlich:
#include <Adafruit_NeoPixel.h>
#define PIN 2
#define NUMPIXELS 15
#define BUTTON1 3
#define ENTPRELL_MACRO if((millis() - alteZeit) > entprellZeit) { alteZeit = millis(); // letzte Schaltzeit merken    
#define CHECK_CHANGED if (bLichtChanged) return;

volatile unsigned long alteZeit = 0, entprellZeit = 25;
bool bLichtChanged = false;
int Licht = 0;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  // put your setup code here, to run once
  strip.begin();
  Serial.begin(9600);
  strip.show();
  pinMode(BUTTON1, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(BUTTON1), button1pressed, LOW);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  bLichtChanged = false;
  switch (Licht) {
    case 0:
      Black();
      break;
    case 1:
      Weis();
      break;
    case 2:
      ColorWipe();
      break;
    case 3:
      Rot();
      break;
    case 4:
      Blau();
      break;
    case 5:
      Grun();
      break;
    case 6:
      Gelb();
      break;
    case 7:
      Turq();
      break;
    case 8:
      Lila();
      break;
    case 9:
      TheaterChase();
      break;
    case 10:
      Rainbow();
      break;
    case 11:
      RainbowCyle();
      break;
    case 12:
      TheaterChaseRainbow();
      break;
    default:
      Licht = 0;
      break;
  }
}

void button1pressed(){
  ENTPRELL_MACRO
    Licht++;
    Serial.print(Licht);
    bLichtChanged = true;
  }
}
 
void ColorWipe(){
  colorWipe(strip.Color(255, 0, 0), 50); // Red
  CHECK_CHANGED
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  CHECK_CHANGED
  colorWipe(strip.Color(0, 0, 255), 50); // Blue
}

void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++)
    strip.setPixelColor(i, c);

  CHECK_CHANGED
  strip.show();
  delay(wait);
}
 
void TheaterChase(){
  theaterChase(strip.Color(127, 127, 127), 50); // White
  CHECK_CHANGED
  theaterChase(strip.Color(127, 0, 0), 50); // Red
  CHECK_CHANGED
  theaterChase(strip.Color(0, 0, 127), 50); // Blue
  CHECK_CHANGED
  theaterChase(strip.Color(0, 127, 0), 50); // Green
}

void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3)
        strip.setPixelColor(i+q, c);    //turn every third pixel on

      CHECK_CHANGED
      strip.show();
      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3)
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
    }
  }
}

void Rainbow(){
  rainbow(20);
}

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

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++)
      strip.setPixelColor(i, Wheel((i+j) & 255));

    CHECK_CHANGED
    strip.show();
    delay(wait);
  }
}

void RainbowCyle() {
  rainbowCycle(20);
}

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

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++)
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));

    CHECK_CHANGED
    strip.show();
    delay(wait);
  }
}

void TheaterChaseRainbow(){
  theaterChaseRainbow(50);
}

void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3)
        strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on

      CHECK_CHANGED
      strip.show();
      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3)
        strip.setPixelColor(i+q, 0);        //turn every third pixel off

    }
  }
}

void Black(){
  SetStripColor(strip.Color(0, 0, 0));
}

void Weis(){
  SetStripColor(strip.Color(225, 225, 225));
}

void Rot(){
  SetStripColor(strip.Color(225, 0, 0));
}

void Grun(){
  SetStripColor(strip.Color(0, 225, 0));
}

void Blau(){
  SetStripColor(strip.Color(0, 0, 225);
}

void Gelb() {
  SetStripColor(strip.Color(225, 225, 0);
}

void Turq(){
  SetStripColor(strip.Color(0, 225, 225);
}

void Lila(){
  SetStripColor(strip.Color(225, 0, 225);
}

void SetStripColor(uint32_t c) {
  for (uint16_t i=0; i < strip.numPixels(); i++)
    strip.setPixelColor(i, c);
}

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);
}
Testen kann ich nicht da ich keine NeoPixel habe, aber das ausbügeln kleiner Bugs traue ich Dir schon zu. :)
 
  • Gefällt mir
Reaktionen: LinuxWindows
new Account() schrieb:
Wieso muss man denn direkt die Funktionen als Makros schreiben? :confused_alt::o
Muss man nicht, aber ich hab z.B ein Arduino-Projekt mit 8 Knöpfen, die alle den selben Code fürs Entprellen brauchen, aber als Unterroutine ist das schlecht möglich/umständlich.
Das gleiche gilt hier für den Check ob den Button gedrückt wurde und dann die Schleifen verlässt, als Unterroutine schlecht möglich da ja definiert zurückgekehrt werden soll wenn der Button mal gedrückt wurde. Und da der Code ansich immer der gleiche ist macht ein Makro Sinn, da man sich dabei nicht vertippen kann/die Funktion gleich klar ist.
 
Zurück
Oben