Go Down

Topic: Array gebruiken. (Read 310 times) previous topic - next topic

Jeroentje2212

May 11, 2019, 11:58 am Last Edit: May 11, 2019, 08:04 pm by Jeroentje2212
kan iemand mij helpen met het volgende.
ik wil een array gebruiken op een manier waarvan ik niet weet of dat kan werken.
krijg hem wel door de compile maar doet niet wat ik had verwacht.

Code: [Select]


int O[] = {+16,+16,+16,+1,+1,+1,-16,-16,-16};
void setup(){
}

void Layer(int l) {
 
for (int i = 1; i <= 4; i++)
    digitalWrite (15 + i, l != i);
}
void Led(int B, int C) {


  digitalWrite(B % 16, C);
  Layer((B + 15) / 16);

void loop(){

for (int i = 0; i <= 9 ; i+=1) {
 
  Led(1 +O[i],1);             
  delay(100);
  Off();                             /// Off = Write All LOW//
}}


bedoeling is Led1 HIGH. dan +16(Led 17), +16(Led 23),+16(Led 39) +1(Led40). Enz Enz

probeer daarnaast ook dit te realiseren.
randNumber = random (5 || 9);

dus dat de arduino kiest tussen 5 of 9

shooter

allereerst maar even random kijk op random daar staat precies hoe je dat moet doen. een komma ipv ||
de array staatv er zo wel goed in behalve de naam dan maak daar volgorde van of zo ipv 1 letter
want is de ! van een integer? dat werkt alleen met digitale dus low/high of nog beter true en false
ik zie ook nog geen OFF
wat is trouwens 17/16 is zeker geen heel getal.
schrijf eerst de sequence beter voor jezelf op en ga dan eens kijken of het simpeler kan.
maak een array waarin de leds en de layers staan. dus led 17 is layer1 led 1 etc.


paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

Jeroentje2212

allereerst maar even random kijk op random daar staat precies hoe je dat moet doen. een komma ipv ||
de array staatv er zo wel goed in behalve de naam dan maak daar volgorde van of zo ipv 1 letter
want is de ! van een integer? dat werkt alleen met digitale dus low/high of nog beter true en false
ik zie ook nog geen OFF
wat is trouwens 17/16 is zeker geen heel getal.
schrijf eerst de sequence beter voor jezelf op en ga dan eens kijken of het simpeler kan.
maak een array waarin de leds en de layers staan. dus led 17 is layer1 led 1 etc.



zie nergens 17/16.
ik weet als ik random(1,7) doe doet ie kiezen tussen 1 t/m 6 maar niet tussen opvolgende getallen kiezen maar bijvoorbeeld tussen 1 5 of 12, dat ie 1 van die drie kiest.
wat de ! precies inhoud weet ik ook niet maar het werkt hij moet daar 1 layer aan zetten de andere uit.
 de layers gaan automatisch aan met de leds.

ik heb allemaal arrays die werken heb niet de gehele code gepost.

Code: [Select]


int Boog1[] = {1,17,33,49,50,51,52,36,20,4};


void Off() {
  for (int i = 16; i <= 19 ; i++) {
    digitalWrite(i, HIGH);
  }
  for (int i = 0; i <= 15 ; i++) {
    digitalWrite(i, LOW);
  }
}
.

Boog1[] doet nu de {+16,+16,+16,+1,+1,+1,-16,-16,-16} en heb die voor elke boog aangemaakt.
maar dacht als ik een array voor die +16 aan kon maken hoef ik niet zoveel arrays aan te maken.

void Off zet alle leds en layers uit

MAS3

#3
May 12, 2019, 01:00 am Last Edit: May 12, 2019, 01:17 am by MAS3
Hoi Jeroentje2212.

Waarom heb je dit niet in het andere onderwerp geplaatst, want die gaat over hetzelfde project van jou ?

Quote from: Jeroentje2212
wat de ! precies inhoud weet ik ook niet maar het werkt hij moet daar 1 layer aan zetten de andere uit.
Het is een slecht idee om iets te gebruiken wat je niet snapt.
Zo ga je het nooit kunnen debuggen.
Je kunt natuurlijk wel iets gebruiken wat je niet snapt in een sketch waaruit je dan zou gaan leren wat datgene doet, maar daar is de sketch die je nu toonde duidelijk niet voor bedoeld.

Een uitroepteken in een elektronisch schema of in code betekent NOT.
Een binaire waarde die niet (NOT) nul is, is 1, en als ie niet 1 is, dan is ie dus nul want andere mogelijkheden zijn er niet.
Een waarde die !49152 is, kan van alles zijn, maar geen 49152 dus dat gaat natuurlijk nooit werken in code.
Alleen wanneer je iets moet vergelijken met een enkel getal zou de ! kunnen werken, en onder de motorkap word dat dan weer naar een binaire waarde omgebouwd (waar of niet waar, dus 1 of nul).
Dus kun je de ! alleen voor een digitale waarde gebruiken zoals shooter vertelde.
Ik zal je verder niet in verwarring brengen door uit te leggen hoe je dat ook kunt "misbruiken"in je code.

Oww.
Ik heb nog even in je code gekeken, en ik kan wel verklaren waarom de ! werkt.
Op het moment dat je m zo gebruikt, dan word er een vergelijking gemaakt.
Die vergelijking is of de waarde misschien niet waar is.
En niet waar staat voor nul.
Niet niet waar is dan een 1, maar ook alle andere getallen dan nul.
Wat je daar hebt staan is wel geldige code, en daarom werkt het ook.
Maar netjes is het niet echt.
Aangezien i in jouw code nooit nul kan zijn plus de uitleg hierboven, schrijf je dus altijd een nul naar die betreffende uitgang.

En nu heb ik je dus toch een manier verteld hoe je de ! kunt "misbruiken".
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Jeroentje2212

wat ik wel weet dat dit

Code: [Select]

void Layer(int l) {

for (int i = 1; i <= 4; i++)
    digitalWrite (15 + i, l != i);


als ik bijvoorbeeld Layer(1); schrijf hij pin 16 LOW maakt en de andere 3 HIGH

en hieronder
Code: [Select]

void Led(int B, int C) {


  digitalWrite(B % 16, C);
  Layer((B + 15) / 16);


hij de juiste layer schakelt bij de led.
bijv. led 16 (bij mij pin 0) de laatste led op laag 1.

16%16=0 C=1 || 0
Layer((16+15)/16= Layer 1.

de led zet ik aan of uit met c.
de layer hoef ik niey=t uit te zetten want layer 1 gaat automatisch uit als een andere layer aan gaat.

maar goed dat is het probleem niet want dat werkt.
ik waardeer jullie feedback maar ben meer benieuwd hoe ik een random getal kan laten kiezen uit nummers die elkaar niet opvolgen. dus zoals random keuze 10 of 15 en niet 10 t/m 15.

ik ga me wel even verder in de ! verdiepen. tnx

septillion

Door wel random uit twee opvolgende nummers te kiezen en dan aan de hand daarvan voor 10 of 15 te kiezen.

Hoe je dat doet is aan jou en hangt sterk van van de samenstelling van je te kiezen nummers. Voor je voorbeeld kan dat zij:
Code: [Select]

byte val = random(0, 2);
if(val == 0){
  val = 10;
}
else{
  val  15;
}


Maar wil je bijvoorbeeld laten kiezen uit 10, 15, 20, 25, 30 zou je het slimmer kunnen doen:
Code: [Select]
byte val = random(0, 5);
val = val * 5 + 10;


Zijn de waarden waaruit je wilt kiezen ook "random" dan zou je een zogenoemde lookup table kunnen gebruiken:
Code: [Select]
const byte ValuesToPick[] = {4, 2, 44, 67, 89, 90, 101};
byte val = random(0, sizeof(ValuesToPick));
val =  ValuesToPick[val];
Use fricking code tags!!!!
I want x => I would like x, I need help => I would like help, Need fast => Go and pay someone to do the job...

NEW Library to make fading leds a piece of cake
https://github.com/septillion-git/FadeLed

Go Up