arduino if continue

weet iemand wat ik hier fout doe

code:


void setup() {
  void Layer(int A) {
  switch (A) {
    case 0:
      digitalWrite(16, HIGH);
      digitalWrite(17, HIGH);
      digitalWrite(18, HIGH);
      digitalWrite(19, HIGH);
      break;
    case 1:
      digitalWrite(19, HIGH);
      digitalWrite(17, HIGH);
      digitalWrite(18, HIGH);
      digitalWrite(16, LOW);
      break;
    case 2:
      digitalWrite(19, HIGH);
      digitalWrite(16, HIGH);
      digitalWrite(18, HIGH);
      digitalWrite(17, LOW);
      break;
    case 3:
      digitalWrite(19, HIGH);
      digitalWrite(17, HIGH);
      digitalWrite(16, HIGH);
      digitalWrite(18, LOW);
      break;
    case 4:
      digitalWrite(16, HIGH);
      digitalWrite(17, HIGH);
      digitalWrite(18, HIGH);
      digitalWrite(19, LOW);
      break;

  }
}
void Led(int B, int C) {


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

}

}

void loop() {

  for (int i = 49; i <= 64 ; i ++) {
    randNumber = random (49, 65);
    if (i = randNumber) {
      continue;
    }
   Led(i, 1);
  }
  delay(1000);
  Off();
}

het gaat vooral om de if continue
de Layer en Led functie werkt wel.
de random ook.
de bedoeling is dat hij led 49 tot 64 aan zet behalve 1 random gekozen led.

Je kan "continue" alleen gebruiken voor een do, for of while expressie. Een "if" expressie wordt eerst gevalideerd en dan al dan niet éénmaal uitgevoerd.

Op 29 april 2019 09:39:12 schreef Jeroen vrij:
weet iemand wat ik hier fout doe

code:



    if (i = randNumber) {

het gaat vooral om de if continue
de Layer en Led functie werkt wel.
de random ook.
de bedoeling is dat hij led 49 tot 64 aan zet behalve 1 random gekozen led.

Bedoel je hier niet "==" i.p.v. "="?

1. Waarom de Layer functie in de setup definiëren?

2. @RP6Conrad De continue lijkt me in principe goed. Hij zit in een hogere for loop.

3. R-Yenn heeft ook gelijk, voor vergelijken gebruik je ==

4. Ik denk dat je je random buiten de loop moet zetten.. Zo:

c code:



void loop() {

  randNumber = random (49, 65);
  for (int i = 49; i <= 64 ; i ++) {

    if (i == randNumber) {
      continue;
    }
   Led(i, 1);
  }
  delay(1000);
  Off();
}

Als ik het goed ontcijfer loop je van 49 tot 64 en zoals hij het had moet er dan toevallig precies een keer de random op de huidige tellerwaarde vallen, die kans is vrij klein maar kan ook vaker voorkomen (dus nul, 1 of meerdere leds blijven uit). Jij wil maar 1 keer een led uitzetten.. Dus eerst die random led bepalen en dan de boel doorlopen.

Die hele switch(A) zou ik vervangen door:

c code:

      digitalWrite(16, sq(1-A));
      digitalWrite(17, sq(2-A));
      digitalWrite(18, sq(3-A));
      digitalWrite(19, sq(4-A));

Voorbeeld (sq = 2 )
(1-1)2 = 0 = LOW
(1-2)2 = 1 = HIGH
(1-3)2 = 4 = HIGH
(1-4)2 = 9 = HIGH

[Bericht gewijzigd door K7Jz op 29 april 2019 12:20:08 (21%)]

LetterHenk

Golden Member

Inderdaad randNumber buiten het loopje zetten.
En verder zou ik m gewoon uit laten lopen zoals dit. Je moet toch alle ledjes langs om ze aan (of die ene uit) te zetten.

c code:

randNumber = random (49, 65);
for (int i = 49; i <= 64 ; i ++) {
	Led(i, randNumber==i ? 0 : 1 );
}
Action expresses priorities LH

Ik zie nu ook dat die layer eruit kan en bij void led in de functie kan.

Wat ik met die continue wil bereiken is dat er steeds 1 random uit gaat/blijft.

De code is nog niet compleet zo.

49 t/m 65 is de bovenste laag van een 4x4x4 led cube.
En wil random led's naar onder laten vallen.
En hem deels werkend maar zoals hierboven genoemd zet hij er meerdere uit

Je void LED zit ook binnen de accolades van je setup. Als je netjes omgaat met inspringen zou je dat beter zien.

Ik haat continues en breaks, ik gebruik liever vlaggen (ENKELE uitzonderingen daargelaten die ik hier niet ga benoemen).

Heb geduld: alle dingen zijn moeilijk voordat ze gemakkelijk worden.

Op 29 april 2019 14:43:25 schreef Jochem:
Je void LED zit ook binnen de accolades van je setup. Als je netjes omgaat met inspringen zou je dat beter zien.

Ik haat continues en breaks, ik gebruik liever vlaggen (ENKELE uitzonderingen daargelaten die ik hier niet ga benoemen).

Waar zou ik de functie Led dan moeten plaatsen.
Ik heb gemerkt dat het in de Loop uiteindelijk meer Kb,s gebruikt.
Heb daarom al mijn effecten ook in de setup gezet.

Mijn Loop ziet er nu zo uit

code:

 
void loop(){

Effect1();
delay(1000);
Effect2();
delay(1000):

Enz enz. 
} 

Dat is trouwens een tik fout van mij.

Mijn setup bestaat uit pinmode en
De layers op High en de randomseed(0)).
Dan sluit de setup.
En dan komen de functies bij mij.
Maar mijn code heeft momenteel 700+ regels zou een beetje vol worden hier op het Forum

Op 29 april 2019 16:56:16 schreef Jeroen vrij:
Waar zou ik de functie Led dan moeten plaatsen.
Ik heb gemerkt dat het in de Loop uiteindelijk meer Kb,s gebruikt.

Gewoon buiten de setup. (En buiten de loop.)
Zelfde verhaal voor de functie Layer.
Die dingen zijn geen onderdeel van je setup, dus het is raar om ze daar binnen te zetten.

Heb geduld: alle dingen zijn moeilijk voordat ze gemakkelijk worden.

ik heb ze nu na de setup geplaatst.
ga de code proberen te verkleinen want hij is nu heel onoverzichtelijk.

Jeroen,

Volgens mij herken ik jou "layer code" voor een 6x6x6 led kubus. Volgens mij loopt daar al een topic over.

code:


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

31 regels korter dan wat jij hebt.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

ok maar schakelt hij dan de andere ook uit???
de 6x6x6 is tijdelijk op hold gezet. omdat ik steeds mijn IC's verbrand.
en waarom kom ik maar niet achter.

jazeker. Als je de for loop uitschrijft krijg je: (Loop unrolling, soms doet een compiler dat voor je om de boel sneller te maken: Dat bespaart het "gedoe" met de loop variabele).

code:


void Layer(int l) {
  digitalWrite (16, l != 1);
  digitalWrite (17, l != 2);
  digitalWrite (18, l != 3);
  digitalWrite (19, l != 4);
}

Als je dan eerst met l=0 de code analyseert, dan wordt de waarde "true" oftewel "HIGH" geschreven naar pinnetje 16 en alle andere, net als in jou code. (als l gelijk is aan nul is ie dus NIET gelijk aan 1, 2, 3 of 4).

Zelf kijken wat er gebeurt als l een andere waarde heeft.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/