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
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
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"
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.