Bounce2.h Was mache ich falsch?

Hallo liebe Gemeinde,
ich habe ein Problem bei meinem vorerst kleinem Sketch.
Ich möchte zu “debouncen” die Bibliothek “Bounce2” benutzen.
Mein Sketch sieht so aus:

#include <Bounce2.h>

#pragma region Variablen



#pragma region Taster Define

#define tasterKreis1 11
#define tasterKreis2 12
#define tasterPWMHoch 2
#define tasterPWMRunter 3  
#pragma endregion


#pragma region LED Define
#define ledKreis1 9
#pragma endregion

#pragma region Bounce Initialisieren
Bounce debTasterKreis1 = Bounce();
Bounce debTasterKreis2 = Bounce();
Bounce debTasterPWMHoch = Bounce();
Bounce debTasterPWMRunter = Bounce();
#pragma endregion


//int ledPin = 9; 
//int tasterPin1 = 11;
//int tasterPin2 = 12;
//int tasterPWMRunter = 2;
//int tasterPWMHoch = 3;

int LEDHelligkeit = 0;
bool lastButton = LOW;
bool lastButton2 = LOW;
bool lastButtonHoch = LOW;
bool lastButtonRunter = LOW;
bool istAn = false;
bool currentButton = LOW;
bool isChangeanaus = false;
bool isChangeHelligkeitRunter = false;
bool isChangeHelligkeitHoch = false;
#pragma endregion


void setup(){
 pinMode(ledKreis1, OUTPUT);

 pinMode(tasterKreis1, INPUT_PULLUP);
 debTasterKreis1.attach(tasterKreis1);
 debTasterKreis1.interval(50); // interval in ms

 pinMode(tasterKreis2, INPUT_PULLUP);
 debTasterKreis2.attach(tasterKreis2);
 debTasterKreis2.interval(50); // interval in ms

 pinMode(tasterPWMHoch, INPUT_PULLUP);
 debTasterPWMHoch.attach(tasterPWMHoch);
 debTasterPWMHoch.interval(50); // interval in ms

 pinMode(tasterPWMRunter, INPUT_PULLUP);
 debTasterPWMRunter.attach(tasterPWMRunter);
 debTasterPWMRunter.interval(50); // interval in ms

 Serial.begin(9600);
}

void loop(){
 
#pragma region Debounce Update
 debTasterKreis1.update();
 debTasterKreis2.update();
 debTasterPWMHoch.update();
 debTasterPWMRunter.update();
 
 //Zustand auslesen
 int zustandTasterKreis1 = debTasterKreis1.read();
 int zustandTasterKreis2 = debTasterKreis2.read();
 int zustandTasterPWMHoch = debTasterPWMHoch.read();
 int zustandTasterPWMRunter = debTasterPWMRunter.read();
#pragma endregion


 
 
 if (zustandTasterKreis1==LOW)
 {
 istAn = !istAn;
 Serial.println(istAn);
 }
 
 if (!istAn)
 {
 analogWrite(ledKreis1, 0);
 }
 else
 {
 analogWrite(ledKreis1, 255);
 }

 
 
}

Das Problem welches ich habe: debouncing funktioniert nicht.
Was mache ich flasch?

Bitte vorerst keine Alternativen vorschlagen.ich weiß ,dass so was hardware- technisch geht oder mit millis().ich möchte verstehen warum es bei mir mit dieser Bibliothek nicht klappt.
Habe ich diese vlt falsch includiert?
Sketch->Include Library->Bounce2-Master

Was soll “#pragma” machen?
Grüße Uwe

Pragmas sind Anweisungen an den Compiler. Damit kann man viele Dinge machen. #pragma region ist ein Visual Studio Pragma um Code Regionen zu erzeugen. Die kann man dann im Editor zusammenklappen: http://de.wikipedia.org/wiki/Code-Faltung https://msdn.microsoft.com/en-us/library/b6xkz944.aspx

uwefed: Was soll "#pragma" machen? Grüße Uwe

Moin Uwe, ich muss gestehen, ich weiß nicht was das Wort "pragma" bedeutet.Hab den Code aus VS kopiert und dort ist es für das ausblenden zuständig.. Wie auch immer, ich habs grad alles was mit #region zutun hat gelöscht. Debouncing funktioniert trotzdem nicht.Mal geht LED aus,mal nicht.

Ohne Kenntnis der Signale sieht der Code sehr seltsam aus. Was soll denn wann passieren?

Habs jetzt anders gelöst.Da gibts ne tolle Funktion die ich jetzt benutze.
Soweit funktioniert das ganze auch, aber leider habe ich so viel ähnliches Code und weiss nicht wie ich das ganze in Funktionen verpacken könnte.

#pragma region Variablen
#include <Bounce2.h>


#pragma region Taster Define
// Taster Makros
#define tasterKreis1 11
#define tasterKreis2 12
#define tasterPWMHoch 2
#define tasterPWMRunter 3  
#pragma endregion


#pragma region LED Define
// LED Makros
#define ledKreis1 9
#define ledKreis2 10
#pragma endregion

#pragma region Bounce Initialisieren
// Debouncing Klasse instanzieren
Bounce debTasterKreis1 = Bounce();
Bounce debTasterKreis2 = Bounce();
Bounce debTasterPWMHoch = Bounce();
Bounce debTasterPWMRunter = Bounce();
#pragma endregion

#pragma region Globale Variablen

// Helligkeit speichern. Anfangswertt liegt bei 1 damit die Lampen angehen
int LEDHelligkeitKreis1 = 1;
int LEDHelligkeitKreis2 = 1;
// Ist Kreis an oder aus?
bool istAnKreis1 = false;
bool istAnKreis2 = false;

#pragma endregion

#pragma endregion


void setup(){
	// LED
	pinMode(ledKreis1, OUTPUT);
	pinMode(ledKreis2, OUTPUT);

	// Taster AN/AUS
	pinMode(tasterKreis1, INPUT_PULLUP);
	debTasterKreis1.attach(tasterKreis1);
	debTasterKreis1.interval(5); // interval in ms

	pinMode(tasterKreis2, INPUT_PULLUP);
	debTasterKreis2.attach(tasterKreis2);
	debTasterKreis2.interval(5); // interval in ms

	// Taster PWM
	pinMode(tasterPWMHoch, INPUT_PULLUP);
	debTasterPWMHoch.attach(tasterPWMHoch);
	debTasterPWMHoch.interval(5); // interval in ms

	pinMode(tasterPWMRunter, INPUT_PULLUP);
	debTasterPWMRunter.attach(tasterPWMRunter);
	debTasterPWMRunter.interval(5); // interval in ms

	Serial.begin(9600);
}

void loop(){
	
#pragma region Debounce Update
		
	// Update Taster AN/AUS
	debTasterKreis1.update();
	debTasterKreis2.update();
	// Update PWM
	debTasterPWMHoch.update();
	debTasterPWMRunter.update();

#pragma endregion

	// Wenn Taster AN/AUS betätigt
	if (debTasterKreis1.fell()) 	
		istAnKreis1 = !istAnKreis1;
		
	if (debTasterKreis2.fell())
		istAnKreis2 = !istAnKreis2;
	
	// LED Ansteuern
	if (!istAnKreis1)
	{
		analogWrite(ledKreis1, 0);
	}
	else
	{
		analogWrite(ledKreis1, LEDHelligkeitKreis1);
	}
	if (!istAnKreis2)
	{
		analogWrite(ledKreis2, 0);
	}
	else
	{
		analogWrite(ledKreis2, LEDHelligkeitKreis2);
	}
	
	// PWM Taster überprüfen
	PWMRegelnRunter();
	PWMRegelnHoch();
		
}

void PWMRegelnRunter()
{	
	if (debTasterPWMRunter.fell() )
	{
		if (istAnKreis1 && LEDHelligkeitKreis1 >= 10)
		{
			LEDHelligkeitKreis1 -= 25;
			if (LEDHelligkeitKreis1 < 24)
			{
				LEDHelligkeitKreis1 = 1;
			}
		}
		if (istAnKreis2 && LEDHelligkeitKreis2 >= 10)
		{
			LEDHelligkeitKreis2 -= 25;
			if (LEDHelligkeitKreis2 < 24)
			{
				LEDHelligkeitKreis2 = 1;
			}
		}
		Serial.println(LEDHelligkeitKreis1);
	}
			
}

void PWMRegelnHoch()
{

	if (debTasterPWMHoch.fell() )
	{
		if (istAnKreis1 && LEDHelligkeitKreis1 < 250)
		{
			LEDHelligkeitKreis1 += 25;
			if (LEDHelligkeitKreis1 > 255 || (LEDHelligkeitKreis1 < 255 && LEDHelligkeitKreis1>249))
			{
				LEDHelligkeitKreis1 = 255;
			}
		}
		if (istAnKreis2&& LEDHelligkeitKreis2 < 250)
		{
			LEDHelligkeitKreis2 += 25;
			if (LEDHelligkeitKreis2 > 255 || (LEDHelligkeitKreis2 < 255 && LEDHelligkeitKreis2>249))
			{
				LEDHelligkeitKreis2 = 255;
			}
		}

		Serial.println(LEDHelligkeitKreis1);
	
	}

}

Also das ganze sind zwei LEDs (eigentliche mehrere über einen Transistor) und diese werden mit zwei Tastern (je eins für eine LED) ein und ausgeschaltet.
Und zwei weitere Taster regeln durch PWM in 10er Schritten die Helligkeit.
Vlt kann mir jemand ein Tip geben wie man den gleichen Code in eine Funktion umwandelt.ich denke mal man müsste mit zeigern arbeiten?

Hallo,

was möchtest Du hier kürzen? Irgendwie muß man Dinge definieren. Du deckst in der loop Deine 4 Tasterzustände ab und läßt jeweils bestimmte Dinge machen. Da ist nichts doppelt gemoppelt aus meiner Sicht.

Was man machen kann ist die Objekte in einem Array abzulegen. Dann kann man einfach darüber iterieren um sie zu initialisieren oder aktualisieren. Aber was du dann mit den Taster-Zuständen genau machst musst du trotzdem für jeden einzeln schreiben.

ich denke mal man müsste mit zeigern arbeiten?

Man verwendet Parameter im Funktionsaufruf, wenn die Funktion zwei mal aufgerufen, aber mit anderen Objekten machen soll.
z.B.

PWMregeln(led,richtung);

Wenn mehr als nur die Pin-Nummer der led und ein boolean für die Richtung übergeben werden muss, kann man mit struct oder class alles erforderliche für ein Objekt zusammenfassen und einen Zeiger oder eine Referenz darauf als Parameter übergeben.

Oder kleinere Funktionen machen (z.B. das if rausverlagern)

void PWMRegelnRunter(int& LEDHelligkeitKreis)
{	
	if (LEDHelligkeitKreis >= 10)
	{
		LEDHelligkeitKreis -= 25;
		if (LEDHelligkeitKreis < 24)
		{
			LEDHelligkeitKreis = 1;
		}
	}
	Serial.println(LEDHelligkeitKreis);
}

Die Helligkeit wird als Referenz übergeben, damit die Änderungen in der Funktion sich auf die übergebene Variable auswirken.