Unterbrechung der Fire Funktion

Guten Morgen liebes Forum,

ich habe folgendes Problem, mein Programm bricht sporadisch immer die Feuerfunktion ab.
Bin schon am verzweifeln. Kann mir einer helfen?

#include <Arduino.h>
#include <FastLED.h>
#include <IRremote.h>
int Lampepow = 250;
int Lampeval = 20;
#define PIN 6
#define COOLING 20
#define SPARKING 50
#define FRAMES_PER_SECOND 80
bool gReverseDirection = false;

int WertTaste1 = 0;
int WertTaste2 = 0;

#define NUM_LEDS 7
#define DATA_PIN 6

CRGB leds[NUM_LEDS];
int RECV_PIN = 3;


IRrecv irrecv(RECV_PIN);

decode_results results;

void setup() {

  Serial.begin(57600);
  Serial.println("resetting");
  LEDS.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  irrecv.enableIRIn();
}

void loop()

{
  if (irrecv.decode(&results)) {
    Serial.print(results.value, DEC  );
    Serial.println();

    if (results.value == 16736925) { // Taste Pfeil oben
      Hell();
      Serial.print(Lampepow);
      Serial.println();
    }
    if (results.value == 16754775) { // Taste Pfeil unten
      Dunkel() ;
      Serial.print(Lampepow);
      Serial.println();
    }
    irrecv.resume();
  }

  if (results.value == 16738455 ) { // Taste 1
    WertTaste1 = 1;
  }
  if (results.value == 16750695) { // Taste 2
    WertTaste1 = 2 ;
  }
  if (results.value == 16712445) {
    WertTaste1 = 3 ;
  }

  switch (WertTaste1) {

    case 1:
      Fire2012();
      FastLED.delay(600 / FRAMES_PER_SECOND);
      WertTaste1 = 0;
      break;
    case 2:
      Rotlich(2);
      WertTaste1 = 0;
      break;
    case 3:
      Aus();
      WertTaste1 = 0;
      break;
  }

}

void Aus() {
  int i = 0;
  int hue = 100;
  for (i; i <= NUM_LEDS; i++) {
    leds[i] = CHSV (0, 0, 0);//165
  }
  FastLED.show();
  

}
void Hell() {
  if (Lampepow <= 255 - Lampeval) {
    Lampepow = Lampepow + Lampeval;

    LEDS.setBrightness(Lampepow);
    FastLED.show();
  }
}

void Dunkel() {
  if (Lampepow >= 0 + Lampeval) {
    Lampepow = Lampepow - Lampeval;

    LEDS.setBrightness(Lampepow);
    FastLED.show();
  }
}



void Rotlich(int wait) {
  int i = 0;
  int hue = 100;
  for (i; i <= NUM_LEDS; i++) {
    leds[i] = CHSV (30, 255, 250);//165
  }
  FastLED.show();
  delay(50);
}

void Fire2012()
{

  static byte heat[NUM_LEDS];

  for ( int i = 0; i < NUM_LEDS; i++) {
    heat[i] = qsub8( heat[i],  random8(0, ((COOLING * 10) / NUM_LEDS) + 2));//2
  }

  for ( int k = NUM_LEDS - 1; k >= 2; k--) {
    heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2] ) / 3;
  }

  if ( random8() < SPARKING ) {
    int y = random8(7);
    heat[y] = qadd8( heat[y], random8(160, 255) );
  }

  for ( int j = 0; j < NUM_LEDS; j++) {
    CRGB color = HeatColor( heat[j]);
    int pixelnumber;
    if ( gReverseDirection ) {
      pixelnumber = (NUM_LEDS - 1) - j;

    } else {
      pixelnumber = j;

    }
    leds[pixelnumber] = color;
  }
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Du hast die Möglichkeit Ausgaben auf den seriellen Monitor zu geben.
Damit kannst du deinen Sketch debuggen und auch das Problem sicher eingrenzen.

Und

gehört ans Ende deiner if-Abfragen.

Leider führt das auch nicht zu dem gewünschten Ergebnis.

if (irrecv.decode(&results)) {
    Serial.print(results.value, DEC  );
    Serial.println();
irrecv.resume();}

Dann bricht er immer noch sporadisch ab.

auch wenn ich

irrecv.resume();

vor die switch Abfrage stelle.

Die IR Abfrage mache ich so

 //IR /////
  unsigned int IRwert = results.value;
  if (irrecv.decode(&results)) {
    irrecv.decode(&results);
    Serial.println(IRwert);
    irrecv.resume();
  }

und es gibt keine Probl.
Beachte wo die schließende Klammer ist.

Grüße

Auch dieses hat leider nicht zum gewünschten Ergebnis geführt.
:frowning:

Hallo,

Mein Deutsch ist nicht super, aber ich werde trotzdem einen Versuch machen zu helfen.

Was mich wundert ist:

 if ( random8() < SPARKING ) {
    int y = random8(7);
    heat[y] = qadd8( heat[y], random8(160, 255) );
  }

2 Sachen die ich anders machen wuerde:

  • die 1. Aufruf von random8() wird viellicht nicht das gleiche Result geben wie die 2. Besser ist es um 1 Aufruf nach random8() zu machen und speichern in y und dann abfragen ob y kleiner ist als SPARKING.
  • welche Werte beskommst du fuer y und muss nicht abgefragt werden ob es kleiner ist als NUM_LEDS? Sonnst ist der Index vielleicht ausser bereich der Array.

Hallo sjonnyc,

für y bekomme ich Werte von 0-6 immer unterschiedlich
grafik
und dabei ist er eben hängen geblieben.

Die Fire Funktion ohne die IR Fernbedienung läuft ohne Probleme.
Das habe ich schon getestet, erst wenn ich die Fernbedienung mit einbinde friert er öfter mal ein.

Kann es damit zufällig zusammenhängen?
The function decode(&results)) is deprecated and may not work as expected! Just use decode() without a parameter and IrReceiver.decodedIRData. .

Es gibt neue Version der Lib (IR) nur muss alles geändert werden, der abruf erfolgt ein wenig anders. Bin Unterwegs ohne Schleptop = kann nix testen

Das sind immer sehr aussagekräftige Infos.
Mach mal das

Du hast die Möglichkeit Ausgaben auf den seriellen Monitor zu geben.
Damit kannst du deinen Sketch debuggen und auch das Problem sicher eingrenzen.

Der IR Empfänger empfängt nach eine ungewissen Zeit einfach ein 0 Signal und somit hält er an.
Das zeigt mir der Monitor an.
Kann ich das irgendwie unterbinden?

Hallo Stefan,

Dass ist moeglich. Wenn es auch sagt: "... may not work as expected", wuerde ich das aendern und die empfohlene Funktion benuetzen. Auch wenn das nicht die Loesung ist, ist es aus jedem Fall ausgeslossen dass es die Ursache sein kann.

Vielen lieben Dank für eure Hilfe. Ich habe es gefixt bekommen, da durch das ich die Null mit abfange die er mir vorher nie angezeigt hat.

Prima, dann hat es ja geklappt.
Danke für die Rückmeldung und du kannst diesen Thread jetzt als erledigt kennzeichnen.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.