2 Schieberegister und 3 Taster hilfe

Hallo, ich habe nun folgendes Problem, ich möchte mit 1. Taster alle 16 Leds Aus und alle wieder An schalten und mit den 2. und 3. Taster ein Bitmuster anzeigen. Es soll der 1. Taster immer vorrang haben, also egal was gerade angezeigt wird, alle An oder Aus.
Ich bin nun am versuchen aber so richtig gehts nicht, nur wenn der zähler2 auch null ist, funktioniert der 1.Taster.
Zum Üben hängen jetzt noch Leds an den Schieberegistern, später kommem Relais dran. Es wird eine kleine Steuerung für 16 Ledspots ( 230V). Ich schreibe nur den Code und ein Freund (Elektroniker) bastel die Hardware dazu.
Gesteuert wird es jetzt mit einem Arduino Nano und später soll ein Atmega 8 das ganze übernehemen.
Hier nun der Code (funktioniert schon)

#include <Bounce.h>

const int taktPin = 8;								//Schieberegister Takt, Speicher, Daten  Pin:
const int speicherPin = 9;
const int datenPin = 10;
const int S1 = 4;										//Schalter 1  ==  AN / AUS alle
const int S2 = 3;										//Schalter 2 == Muster rauf
const int S3 = 2;										//Schalter 3 == Muster runter

int S1wert = 0;										// Werte für Schalter
int S2wert = 0;
int S3wert = 0;

int vorherS1wert = 0;								// Werte für vorher Schalterwerte
int vorherS2wert = 0;
int vorherS3wert = 0;

int zaehler1 = 0;								   // zaehler 1 und 2
int zaehler2 = 0;

int LampenPin [6] = {       0B1111111111111111,				// Bitmuster für Schieberegister ---alle AN
					   0B0000000000000000,            //alle AUS
					   0B1111111100000000,            //hälfte AN hinten
					   0B0000000011111111,            // häfte AN vorn
                                           0B0001001001000100,            //schräg 
					   0B1000010010000010,
				 
	                };
					
Bounce schalter1 = Bounce(S1, 10 );						//Bounce = entprellen der Schalter
Bounce schalter2 = Bounce(S2, 10 );
Bounce schalter3 = Bounce(S3, 10 );

void setup()
{
	pinMode(taktPin, OUTPUT);
	pinMode(speicherPin, OUTPUT);
	pinMode(datenPin, OUTPUT);
	Serial.begin(9600);
 

}

void loop()
{
	schalter1.update();						// update für Schalter
	schalter2.update();
	schalter3.update();
	
	S1wert = schalter1.read();				// Schalter 1 einlesen High / Low
	if (vorherS1wert != S1wert)
	{
		if (S1wert == HIGH)
		{
			zaehler1++;						// zähler +1
			
		}
		
	}
	
	vorherS1wert = S1wert;
	Serial.println(zaehler1);
	
	if (zaehler1 == 1)
	{ 
		sendeLampe(LampenPin[0]);			// in Funktion "sende Lampe" springen und Arry 0 senden
	}
	else
	{
		sendeLampe(LampenPin[1]);
	}
	
		 zaehler1 = zaehler1 % 2;			// zähler wieder auf 0 setzen
	
	S2wert = schalter2.read();				// in Funktion "sende Lampe1" springen und Arry ab  2 senden
	if (vorherS2wert != S2wert)
	{
		if (S2wert == HIGH)
		{
			zaehler2++;
		}
	}
		
		S3wert = schalter3.read();
		if (vorherS3wert != S3wert)
		{
			if (S3wert == HIGH)
			{
				zaehler2--;
			}
			
		}

		vorherS2wert = S2wert;
		vorherS3wert = S3wert;
		Serial.println(zaehler2);
		
		sendeLampe1(LampenPin[zaehler2]);
		
		zaehler2 = zaehler2 % 6;

}

void sendeLampe (int wert){
	digitalWrite(speicherPin, LOW);								// Ansteuerung der 2 Schieberegister 
	shiftOut(datenPin, taktPin, LSBFIRST, wert >> 8);
	shiftOut(datenPin, taktPin, LSBFIRST, wert & 255);
	digitalWrite(speicherPin, HIGH);
	
	
	
}

void sendeLampe1 (int wert1){
	digitalWrite(speicherPin, LOW);
	shiftOut(datenPin, taktPin, LSBFIRST, wert1 >> 8);
	shiftOut(datenPin, taktPin, LSBFIRST, wert1 & 255);
	digitalWrite(speicherPin, HIGH);
	
}

/*void sendeReset (){
	digitalWrite(speicherPin, LOW);
	shiftOut(datenPin, taktPin, LSBFIRST, LampenPin[1] >> 8);
	shiftOut(datenPin, taktPin, LSBFIRST, LampenPin[1] & 255);
	digitalWrite(speicherPin, HIGH);
	
}
*/

MfG Marco

Hallo, keiner eine Idee?

MfG Marco

Da Du die 6 Muster durch die Taster 2 und 3 definierst mußt Du die Variable zaehler2 auch durch den schalter1 ändern ( auf 0 oder 1 setzen je nach Zustand von zaehler1.
Jetzt mußt Du entscheiden ob bei Tastendruck von schalter1 nach einem Tastendruck von schalter2 ider schalter3 immer die LED aus sein sollen oder ein oder je nach vorherigem Zustand durch schalter1.

Du brauchst nur an einer Stelle "sendeLampe1(LampenPin[zaehler2]);" und nicht an 2 Stelllen die sich gegenseitig überschreiben
Außerdem mußt Du auch nicht bei jeden loop() Durchlauf die Ausgänge setzen sondern nur wenn sich was ändert.

Grüße Uwe