Hoe kan ik dit beter aansluiten

ja, het is steeds twee keer zoveel

knop 1   2 ^ 0 
knop 2   2 ^ 1
knop 3   2 ^ 2 
knop 4   2 ^ 3 
knop 5  2  ^ 4 

dus als ik ze in een lijst zou stoppen, zou de waarde van de knop de index zijn

dus zou ik iets kunnen doen als :

struct Button {
  const uint8_t pin;               ///< The Arduino pin connected to the button
  unsigned long lastDebounceTime;  ///< The last time the button state changed
  uint8_t lastButtonState;         ///< The last known state of the button (before debouncing)
  //
  uint8_t currDebouncedState;  ///< The current debounced state of the button
  uint8_t prevDebouncedState;  ///< The previous debounced state of the button

  uint8_t value; 
};

Button buttonList[] = {
  { 4, 0, !ISPRESSED, !ISPRESSED, !ISPRESSED, 0 },
  { 2, 0, !ISPRESSED, !ISPRESSED, !ISPRESSED, 2  },
  {1, 0, !ISPRESSED, !ISPRESSED, !ISPRESSED, 4}, 
};

int data ; 

void setup() { 
   // de mode zetten voor de twee buttons
  for (uint8_t cnt = 0; cnt < NUMELEMENTS(buttonList); cnt++) {
    pinMode(buttonList[cnt].pin, INPUT_PULLUP);
  }
}

void loop() { 
     readButtons(); 
     }

void readButton() {
  uint8_t buttonState;
  for (uint8_t cnt = 0; cnt < NUMELEMENTS(buttonList); cnt++) {
    buttonState = digitalRead(buttonList[cnt].pin);

    if (buttonState != buttonList[cnt].lastButtonState) {
      buttonList[cnt].lastDebounceTime = millis();
    }

    if ((millis() - buttonList[cnt].lastDebounceTime) > debounceDelay) {
      buttonList[cnt].prevDebouncedState = buttonList[cnt].currDebouncedState;
      buttonList[cnt].currDebouncedState = buttonState;
      
      data = data + buttonList[cnt].value; 
    }

    if (buttonState != buttonList[cnt].lastButtonState) {
      buttonList[cnt].lastButtonState = buttonState;
    };
  }
}

untested en uit mijn hoofd

Ja. Maar je hebt geen lijst / array nodig. Kijk even naar wat je hier eerder neergezet hebt

Voor knop 3 heb je 2^0 * digitalRead(button3), voor knop 2 heb je 2^1 * digitalRead(button2). Wat denk je dat je kunt gebruiken voor knop 1?

Er is dan nog steeds wat niet goed.

met deze code:

byte datapin = 2;
byte clockpin = 3;
byte latchpin = 4;

byte button1 = 10;
byte button2 = 11;
byte button3 = 12;

unsigned long previousMillis = 0;
int interval = 1000; 

int data = 0; 

void setup() {
  pinMode(datapin, OUTPUT);
  pinMode(clockpin, OUTPUT);
  pinMode(latchpin, OUTPUT);

  pinMode(button1, INPUT_PULLUP); 
  pinMode(button2, INPUT_PULLUP); 
  pinMode(button3, INPUT_PULLUP);

  Serial.begin(115200);
}

void loop() {

  data =  2^0 * digitalRead(button1); 
  data += 2^1 * digitalRead(button2) ; 
  data += 2^2  * digitalRead(button3) ;

  Serial.println(data, BIN);  
}
 

krijg ik als alle buttons niet ingedrukt zijn , 101 als output terwijl ik 0 verwacht
ook een ! voor de digitalRead lost het probleem niet op
Hetzelfde met als ik button 1 and button3 omdraai

Alle digitalReads moeten omgedraaid worden met !; dat was ik even vergeten.

Ik zal straks even verder kijken.

oke

Dat had ik ook al geprobeerd maar dan is de output als er geen buttons ingedrukt zijn 110.

IK heb de buttons ook getest en ze doen precies wat ik verwacht.
Dus ergens in de formules zit er een fout denk ik.

met debugging aan :

data na button 1 1 : 10

data na button  2 : 100

data na buttton 3 : 110

110

ben iets verder met deze code:

void loop() {

  data =  (2 ^ 0) * !digitalRead(button3);
   
   Serial.print("data na stap 1 : "); 
   Serial.println(data, BIN); 
   
  data += ( 2 ^ 1) * !digitalRead(button2) ;

   Serial.print("data na stap 2 : "); 
   Serial.println(data, BIN); 

  data += (2 ^ 2)  * !digitalRead(button1) ;

   Serial.print("data na stap 3 : "); 
   Serial.println(data, BIN); 

  Serial.println(data, BIN);

  delay(2000);  
}

maar de buttons geven niet de juiste waardes weer

Ok, ik had de ^ van jou overgenomen (bericht 41). Maar een ^ is geen machtsverheffen in C/C++ maar een XOR. Verder was dat als voorbeeld; machtsverheffen is verder duur en niet noodzakelijkerwijs accuraat; gebruik gewoon de getallen 1, 2 en 4.

oke

Ik had in aan de praat gekregen met deze code :

void loop() {

  data =  pow(2,0) * !digitalRead(button1);
   
   Serial.print("data na stap 1 : "); 
   Serial.println(data, BIN); 
   
  data += pow(2,1) * !digitalRead(button2) ;

   Serial.print("data na stap 2 : "); 
   Serial.println(data, BIN); 

  data += pow(2,2)  * !digitalRead(button3) ;

   Serial.print("data na stap 3 : "); 
   Serial.println(data, BIN); 

  Serial.println(data, BIN);

  delay(2000);  
}

dit is ook duur ?
Dus ik kan beter de getallen gebruiken ?

Moet nog even verder puzzelen.

Als ik het probeer op wokwiki dan gaat het niet zoals jouw tabel vanaf nummer 3

Bij de 3e button gaat de 3e button aan in plaats van de 4e
en als ik alles indruk gaan de eerste 3 aan in plaats van de 7e

zie : https://wokwi.com/projects/445630266670740481

probeer nu eentje met een delay maar die werkt ook niet zoals ik wil

/*
Knop 2 	Knop 1 	Knop 0 	   LED
0 	      0 	      0      allemaal uit
0 	      0       	1 	   eerste led aan, alle anderen uit
0 	      1       	0 	   tweede led aan, alle anderen uit
0 	      1       	1 	   derde led aan, alle anderen uit
1 	      0        	0      vierde led aan, alle anderen uit
1 	      0 	      1    	 vijfde led aan, alle anderen uit
1       	1        	0 	   zesde led aan, alle anderen uit
1 	      1       	1 	   zevende led aan, alle anderen uit
*/


byte dataPin = 2;
byte clockPin = 3;
byte latchPin = 4;

byte button1 = 10;
byte button2 = 11;
byte button3 = 12;

int data = 0; 

unsigned long previousMillis = 0;
const int interval = 1000;

void setup() {
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);

  pinMode(button1, INPUT_PULLUP); 
  pinMode(button2, INPUT_PULLUP); 
  pinMode(button3, INPUT_PULLUP);

  Serial.begin(115200);
}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    data =  2 * !digitalRead(button1);
    data += 4 * !digitalRead(button2);
    data += 8 * !digitalRead(button3);

    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, data);
    digitalWrite(latchPin, HIGH);
  }
}

Morgen maar eens verder experimenteren
Ik heb het gevoel dat ik zo dicht bij ben maar ook heel ver weg

Ja, dat is ook duur; machtsverheffen is duur. Vervang die pow dingen door 1, 2 en 4.

Hoeveel is 20? 1 of 2? Zelfde voor de anderen.

Dat heb ik al opgelosd in de wokwi

 data =  2 * !digitalRead(button1);
  data += 4 * !digitalRead(button2) ;
  data += 8  * !digitalRead(button3) ;

Ben nu aan het puzzelen hoe ik meerdere button presses tegelijkertijd kan oplossen..

Dit werkt in ieder geval nog niet

In wokwi kun je <ctrl> plus klik gebruiken om een knop vast te houden. Opnieuw klikken en de knop is weer losgelaten.

Dat weet ik

Probeer op te lossen dat als er drie buttons presses zijn dat led 7 aangaat en niet led 1 , 2 en 3 .

Edit

Dit idee werkt dus niet

/*
Knop 2 	Knop 1 	Knop 0 	   LED
0 	      0 	      0      allemaal uit
0 	      0       	1 	   eerste led aan, alle anderen uit
0 	      1       	0 	   tweede led aan, alle anderen uit
0 	      1       	1 	   derde led aan, alle anderen uit
1 	      0        	0      vierde led aan, alle anderen uit
1 	      0 	      1    	 vijfde led aan, alle anderen uit
1       	1        	0 	   zesde led aan, alle anderen uit
1 	      1       	1 	   zevende led aan, alle anderen uit
*/


byte dataPin = 2;
byte clockPin = 3;
byte latchPin = 4;

byte button1 = 10;
byte button2 = 11;
byte button3 = 12;

int data = 0; 

unsigned long previousMillis = 0;
const int interval = 1000;

void setup() {
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);

  pinMode(button1, INPUT_PULLUP); 
  pinMode(button2, INPUT_PULLUP); 
  pinMode(button3, INPUT_PULLUP);

  Serial.begin(115200);
}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    data =  2 * !digitalRead(button1);
    data += 4 * !digitalRead(button2);
    data += 8 * !digitalRead(button3);

    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, data);
    digitalWrite(latchPin, HIGH);
  }
}
 

Daar zit in ieder geval nog steeds dezelfde fout in.

Ik had je al gevraagd hoeveel 20 is.

2 tot de macht 0 is 1

maar als ik dit verander :

 data =  1 * !digitalRead(button1);

dan gaat led 1 nooit aan.

Raar, ik deed net wat debugging en data bevat alle "goede" getallen
Alle leds gaan aan behalve the eerste

We hebben nog de volgende "problemen"

  • de eerst led brandt niet.
  • als je de derde knop indrukt, gaat de derde led branden en niet de vierde
  • als ik meerdere knoppen indruk, worden ze niet gezien

Ik heb vanochtend naar je wokwi gekeken en daar zitten twee software fouten in. Hieronder verbeterd

    data =  1 * !digitalRead(button1);  // sterretje
    data += 2 * !digitalRead(button2);
    data += 4 * !digitalRead(button3);  // sterretje

Dat is een hardware fout. De reden is dat de eerste LED, voor de 74HC595 niet de eerste LED is (Q0) maar de tweede LED is (Q1).

Je kunt de hardware aanpassen of je kunt een software oplossing bedenken (er zijn er drie). Twee hebben de voorkeur, de derde zal ik proberen uit te leggen in een later antwoord.

Ik wil graag dat je de twee (drie) software oplossingen bedenkt en de hardware voor nu hetzelfde houdt.

Je kunt later besluiten of je de hardware wilt veranderen.