Hoe kan ik dit beter aansluiten

Ik hoop dat je milliamp bedoelt :slight_smile:

Het absolute maximum voor een 328P processor is 40 mA per pin. Het is echter niet te adviseren dat continu te vragen; een veiliger maximum is 20 mA. Er is echter meer.

Uit de 328P datasheet

Maar je hebt de LEDs niet aangesloten op de Arduino maar op de 74HC595 en daar gelden andere limieten. Van de datasheet

Als je alle LEDs aan wilt hebben (niet in het geval voor het huidige "huiswerk") geldt dus dat je de weerstand moet berekenen gebaseerd op 70 mA / 8 = 8.5 mA per pin.

LEDs trekken geen stroom dus is het niet relevant; de stroom wordt er doorheen "geduwd" en bepaalt de lichtsterkte. De hoeveelheid stroom die je er doorheen mag "duwen" hangt af van de LED; voor de standaard LEDs is het typisch 20 mA hoewel korte pieken hoger mogen zijn.

oke

Dan wordt het dus een weerstand van

3 / 0,0085 = 353 ohm

Dan zie ik dus iets te laag met mijn 330 ohm
Even aanpassen vanmiddag

Zit even vast

Ik heb nu dit :

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; 

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() {

  int data; 

  data = digitalRead(button1); 
  data += digitalRead(button2) * 10; 
  data += digitalRead(button3) * 100;

  digitalWrite(latchpin, HIGH);

  shiftOut(datapin, clockpin, MSBFIRST, data);
  
  digitalWrite(latchpin, LOW);

maar de uitkomst is nu 111 omdat ik "input-pullup" gebruik
Zo even goed nadenken of google gebruiken hoe dit op te lossen

Waarom vermenigvuldig je met 10 en 100? Je hoeft maar tot 7 te tellen :wink:

Dat laat ik verder even aan jou over.

ik zat aan dit te denken

Stel je voor dat button1 aan is en button2 ook.
Dat wordt het dus 1
en dan 1 + 10 * 1 = 11

Ik zat dus digitaal te denken maar dat lost het probleem niet op

Daarom terug naar de tekentafel

Wacht eens
Ik kan het volgende doen

Stel je voor dat alleen de tweede button aan is
dan geeft de button een 0 maar die kan ik naar een 1 laten "overzetten"
dan omdat het button2 is vermenigvuldigen met 2 en dan is 10 in digitaal

Stel je voor dat button1 en button2 ingedrukt is
Dan wordt het beide 0 omzetten naar 1
de eerste 1 vermenigvuldigen met 1 en de tweede 1 vermenigvuldigen met 2
Dan wordt dat 3 . Zie alleen even niet hoe alleen led3 aan moet.
Digitaal is led3 aan 100

hetzelfde geldt voor led 4 digitaal kom ik dan op 100 maar moet 1000 zenden.

led   nodig                   button output
1       1                            1
2       10                           10
3       100                         11
4       1000                        100
5       10000                      101

nee, ik zie nog steeds geen manier
Maar eens over slapen

Je telt nu in zoals je dat op de basisschool geleerd hebt.
Dat is niet de manier waarop dit bedacht is, er zit een strategie achter de opgegeven dimensies.
Je hebt 7 LEDs.
En je hebt 3 knoppen.
Die 3 knoppen geven 8 verschillende mogelijkheden, en we wisten inmiddels al dat we beginnen met tellen bij nul.
Dus in dit geval is nul de achtste mogelijkheid, dan staan er ook nul LEDs aan.
Elke andere mogelijkheid geeft 1 LED als resultaat.
Dit kun je met een ander getalstelsel oplossen en daar ligt dus de kneep.

Deze reply is nog steeds een raadsel want er moet nog wel wat op te lossen zijn, toch ?

Ja. Het gaat er om je een nummer van 0 tot en met 7 krijgt (gebaseerd op de knoppen) dat je later (zie volgende commentaar) kunt gebruiken.

En dat is je volgende puzzel :wink:

Blijf aan het puzzelen.

dacht ook misschien aan de knop nummer maar dan komt ik ook niet uit.

Eens goed nadenken welk getalstelsel.

Eerste idee zou zijn het 3 tallig stelsel maar dan kom je denk ik ook niet uit

1            1e aan
2            2e aan 
3            3e aan 
10          4e aan , maar dat gaat al niet goed
11 
12
13

Voor een 3-tallig stelsel heeft een knop 3 waardes (0, 1, 2). Nummers zien er dan zo uit

10-tallig 3-tallig
0 000
1 001
2 002
3 010
4 011
5 012
7 100

Jouw knop kan (vanuit het standpunt van hardware) geen drie waardes weergeven.

Vraag jezelf af wat iedere knop kan voorstellen? Een getal van 0 of 1; dat zijn twee waardes en is dus een 2-tallig (binair) getalstelsel.

hmm, daar heb ik het al mee geprobeerd maar dat lukte ook niet.

Dat was deze code :

 data = digitalRead(button1); 
  data += digitalRead(button2) * 10; 
  data += digitalRead(button3) * 100;

Maar die werkt ook niet goed.

Zit even goed vast op hoe ik de 0 en 1 van de buttons aan elkaar kan plakken zodat ik de goede uitkomst krijg

ik kan de waarde aflezen en dat als string aan elkaar te plakken.
Maar dan kan ik weer geen switch gebruiken om de leds aan te sturen en om dan heel veel if then's te gebruiken is ook lelijk.

of ik moet een dictonary gebruiken en daar de vertaling instoppen.
Dan wordt de string de key en de waarde die ik naar de chip moet sturen de value.

Zit ik op de goede weg nu ?

Dat is decimaal (omdat je met 10 en 100 vermenigvuldigt), niet binair.

Dat lijkt erg (lees: nodeloos) gecompliceerd; maar dat komt omdat je nog niet weet wat er allemaal mogelijk is. En voel daar je niet beschaamd over, ik heb ook dingen uitgevonden waarbij ik er later achter kwam dat er bestaande functies voor bestaan.

Werk eerst aan het inlezen van het nummer (een int of een byte) zodat je het nummer dat je met de knoppen instelt op de seriΓ«le monitor kunt laten zien in bv binaire vorm.

Serial.println(variable, BIN);

Dat moet 0, 1, 10, 11, 100, 101, 110, 111 printen (voor respectivelijk 0..7) als je het inlezen goed voor elkaar hebt

ik dacht aan dit :

String data; 

 data = !digitalRead(button3); 
 data += !digitalRead(button2);  
 data += !digitalRead(button1); 

 Serial.println(data);  

maar dan geeft die 100 in plaats van 011

nog een keer terug naar de tekentafel

Dit komt in de buurt :

void loop() {

  int data; 

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

  Serial.println(data, BIN);  
}

Alleen komt er nu als er niks ingedrukt is 1010 uit in plaats van 0

Wat is dat?

ik probeer uit te vinden hoe ik als de derde ingedrukt is ik 11 kan laten verschijnen.

dus ik dacht 10 + 1 = 11 maar ik wil dat alleen als de knop ingdrukt is en niet altijd

Ben nu nog steeds druk aan het denken en uitproberen hoe dit op te lossen.

Iedere knop representeert een waarde. Kun je de waardes zoals jij je die voorstelt hier neerzetten?

bv door het onderstaande in te vullen.

knop 1  ...
knop 2  ...
knop 3  ...

Denk dat je dit bedoeld

                         ingedrukt        niet ingedrukt
knop 1                   0                         1
knop 2                   0                         1
knop 3                   0                         1

of bedoel je de binaire waarde

                    waarde
knop 1                1
knop 2                10
knop 3                11

maar denk je ook aan je eigen project in plaats van mij heel veel te helpen :slight_smile:

Nee

Bijna goed maar ik wilde niet de binaire waarde.

Knop 1 heeft de waarde 1, knop 2 heeft de waarde 2 en knop 3 heeft de waarde 4. Knop 4 zou de waarde 8 hebben en knop 5 zou de waarde 16 hebben. Zie je een patroon?