Arduino - If else werkt niet

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • thomasv.w
  • Registratie: Maart 2021
  • Laatst online: 07-09-2021
Mijn vraag
ik krijg telkens de melding ''else without a previous if''

Relevante software en hardware die ik gebruik

Dit is mijn programma:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
int button = 8;   // GPIO 8 for the button
int led1 = 22;    // led van ledstrip groen 10x
int led2 = 23;    // led van ledstrip groen 10x
int led3 = 24;    // led van ledstrip groen 10x
int led4 = 25;    // led van ledstrip groen 10x
int led5 = 26;    // led van ledstrip groen 10x
int led6 = 27;    // led van ledstrip groen 10x
int led7 = 28;    // led van ledstrip groen 10x
int led8 = 29;    // led van ledstrip groen 10x
int led9 = 30;    // led van ledstrip groen 10x
int led10 = 31;   // led van ledstrip groen 10x
int led11 = 32;   // led van ledstrip rood 10x
int led12 = 33;   // led van ledstrip rood 10x
int led13 = 34;   // led van ledstrip rood 10x
int led14 = 35;   // led van ledstrip rood 10x
int led15 = 36;   // led van ledstrip rood 10x
int led16 = 37;   // led van ledstrip rood 10x
int led17 = 38;   // led van ledstrip rood 10x
int led18 = 39;   // led van ledstrip rood 10x
int led19 = 40;   // led van ledstrip rood 10x
int led20 = 41;   // led van ledstrip rood 10x


void setup() {
  pinMode(button, INPUT);        // define button as an input
  pinMode(led1, OUTPUT);          // define LED as an output
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
  pinMode(led7, OUTPUT);
  pinMode(led8, OUTPUT);
  pinMode(led9, OUTPUT);
  pinMode(led10, OUTPUT);
  pinMode(led11, OUTPUT);
  pinMode(led12, OUTPUT);
  pinMode(led13, OUTPUT);
  pinMode(led14, OUTPUT);
  pinMode(led15, OUTPUT);
  pinMode(led16, OUTPUT);
  pinMode(led17, OUTPUT);
  pinMode(led18, OUTPUT);
  pinMode(led19, OUTPUT);
  pinMode(led20, OUTPUT);
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  digitalWrite(led5, LOW);
  digitalWrite(led6, LOW);
  digitalWrite(led7, LOW);
  digitalWrite(led8, LOW);
  digitalWrite(led9, LOW);
  digitalWrite(led10, LOW);
  digitalWrite(led11, LOW);
  digitalWrite(led12, LOW);
  digitalWrite(led13, LOW);
  digitalWrite(led14, LOW);
  digitalWrite(led15, LOW);
  digitalWrite(led16, LOW);
  digitalWrite(led17, LOW);
  digitalWrite(led18, LOW);
  digitalWrite(led19, LOW);
  digitalWrite(led20, LOW);
}

  void loop() {
    
      if (digitalRead(button) == HIGH)
      {  

        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led4, HIGH);
        digitalWrite(led5, HIGH);
        digitalWrite(led6, HIGH);
        digitalWrite(led7, HIGH);
        digitalWrite(led8, HIGH);
        digitalWrite(led9, HIGH);
        digitalWrite(led10, HIGH);
        digitalWrite(led11, HIGH);
        digitalWrite(led12, HIGH);
        digitalWrite(led13, HIGH);
        digitalWrite(led14, HIGH);
        digitalWrite(led15, HIGH);
        digitalWrite(led16, HIGH);
        digitalWrite(led17, HIGH);
        digitalWrite(led18, HIGH);
        digitalWrite(led19, HIGH);
        digitalWrite(led20, HIGH);
      }
  
       else  (digitalRead( button) == LOW)
       {
           (digitalWrite(led1, LOW);
           (digitalWrite(led2, LOW);
           (digitalWrite(led3 LOW);
           (digitalWrite(led4, LOW);
           (digitalWrite(led5, LOW);
           (digitalWrite(led5, LOW);
           (digitalWrite(led6, LOW);
           (digitalWrite(led7, LOW);
           (digitalWrite(led8, LOW);
           (digitalWrite(led9, LOW);
           (digitalWrite(led10, LOW);
           (digitalWrite(led11, LOW);
           (digitalWrite(led12, LOW);
           (digitalWrite(led13, LOW);
           (digitalWrite(led14, LOW);
           (digitalWrite(led15, LOW);
           (digitalWrite(led16, LOW);
           (digitalWrite(led17, LOW);
           (digitalWrite(led18, LOW);
           (digitalWrite(led19, LOW);
           (digitalWrite(led20, LOW);
       }
      
  
       }


Iemand enig idee?

[ Voor 0% gewijzigd door _ferry_ op 10-03-2021 12:09 ]

Alle reacties


Acties:
  • +2 Henk 'm!

  • Maks
  • Registratie: September 2005
  • Laatst online: 16-05 14:42
Er kan geen conditie in het else statement staan, anders is het een if else (documentatie).

Topic maken is meer werk dan dat artikel lezen ;). Ook een tip voor het debuggen; ik zou het eerst even met 1 led proberen, dat is overzichtelijker. Dit is sowieso een onhandige manier om zoveel pinnen aan te sturen maar dat terzijde.

Acties:
  • 0 Henk 'm!

  • Luc S
  • Registratie: April 2015
  • Laatst online: 16-05 22:30
Je else is eigenlijk verkleed als else if nu?

6930Wp Oost-West PV_Output | 7.5 kW Ecodan + 300L


Acties:
  • 0 Henk 'm!

  • Thy...
  • Registratie: April 2006
  • Laatst online: 10:02
Een Else heeft geen condition nodig.
Dus maak er of else van zonder (digitalRead( button) == LOW)
of else if (digitalRead( button) == LOW)

https://www.arduino.cc/re...e/control-structure/else/

Acties:
  • 0 Henk 'm!

  • InFamous
  • Registratie: Januari 2010
  • Laatst online: 14-05 22:45

InFamous

excommunicado

Gooi ook even je code in [code] tags, dat leest wat makkelijker.

Formerly known as Ragdoll


Acties:
  • 0 Henk 'm!

  • thomasv.w
  • Registratie: Maart 2021
  • Laatst online: 07-09-2021
Ik weet niet precies hoe ik de codetag kan gebruiken.

Ik heb mn code nu aangepast maar dan krijg ik steeds de melding: expected ')' before ';' token

void loop() {

if (digitalRead(button) == HIGH)
{

digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led5, HIGH);
digitalWrite(led6, HIGH);
digitalWrite(led7, HIGH);
digitalWrite(led8, HIGH);
digitalWrite(led9, HIGH);
digitalWrite(led10, HIGH);
digitalWrite(led11, HIGH);
digitalWrite(led12, HIGH);
digitalWrite(led13, HIGH);
digitalWrite(led14, HIGH);
digitalWrite(led15, HIGH);
digitalWrite(led16, HIGH);
digitalWrite(led17, HIGH);
digitalWrite(led18, HIGH);
digitalWrite(led19, HIGH);
digitalWrite(led20, HIGH);
}

else
{
(digitalWrite(led1, LOW);
(digitalWrite(led2, LOW);
(digitalWrite(led3 LOW);
(digitalWrite(led4, LOW);
(digitalWrite(led5, LOW);
(digitalWrite(led5, LOW);
(digitalWrite(led6, LOW);
(digitalWrite(led7, LOW);
(digitalWrite(led8, LOW);
(digitalWrite(led9, LOW);
(digitalWrite(led10, LOW);
(digitalWrite(led11, LOW);
(digitalWrite(led12, LOW);
(digitalWrite(led13, LOW);
(digitalWrite(led14, LOW);
(digitalWrite(led15, LOW);
(digitalWrite(led16, LOW);
(digitalWrite(led17, LOW);
(digitalWrite(led18, LOW);
(digitalWrite(led19, LOW);
(digitalWrite(led20, LOW);
}


}

Acties:
  • 0 Henk 'm!

  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 14-05 13:16

BLACKfm

o_O

Als ik alle onnodige meuk weg laat;

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void setup() {
//code
}

void loop() {
  if (digitalRead(button) == HIGH)
    {
    //code
    }

  else (digitalRead( button) == LOW)
    {
    //code
    }
}


Dan mist blijkbaar de benodigde 'Else if' statement voor een afsluitende 'else' aldus de voorgaande reacties.

Goede om te weten dat het zo werkt blijkbaar, bij PHP (waar ik zelf meer bekend mee ben) heb je daar geen last van.

Beetje vreemde wijze van uitvoeren, je moet blijkbaar 3 situaties programmeren terwijl er maar 2 zijn (high of low).

Dus dan zal het wel moeten zoals @Thy... aangeeft.


En code tag is [ code ] begin en [/ code] aan het eind (maar dan zonder de spatie).

Litebit.eu voorraad check :).


Acties:
  • 0 Henk 'm!

  • Thy...
  • Registratie: April 2006
  • Laatst online: 10:02
thomasv.w schreef op woensdag 10 maart 2021 @ 12:13:
Ik weet niet precies hoe ik de codetag kan gebruiken.

Ik heb mn code nu aangepast maar dan krijg ik steeds de melding: expected ')' before ';' token
Tel het aantal ( en het aantal ) tekens in je else statement eens. Het moeten er evenveel zijn, en dat is niet het geval ;)

Acties:
  • 0 Henk 'm!

  • Tadango
  • Registratie: April 2000
  • Laatst online: 16-05 10:33
Thy... schreef op woensdag 10 maart 2021 @ 12:15:
[...]


Tel het aantal ( en het aantal ) tekens in je else statement eens. Het moeten er evenveel zijn, en dat is niet het geval ;)
?????

Acties:
  • 0 Henk 'm!

  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 14-05 13:16

BLACKfm

o_O

(digitalWrite(led20, LOW);
Dat is 'OPEN' 'OPEN' en 'SLUITEN'.. '(' '(' ')' dus. Daar mist nog een ')' voor een gelijk aantal, of er staat een '(' teveel O-)

Met een goede code editor (Notepad++ bijvoorbeeld) kun je makkelijk zien welk tekentje bij welke regel hoort en of je iets te veel of te weinig hebt.

[ Voor 19% gewijzigd door BLACKfm op 10-03-2021 12:19 ]

Litebit.eu voorraad check :).


Acties:
  • 0 Henk 'm!

  • Tadango
  • Registratie: April 2000
  • Laatst online: 16-05 10:33
BLACKfm schreef op woensdag 10 maart 2021 @ 12:18:
[...]


[...]


Dat is 'OPEN' 'OPEN' en 'SLUITEN'.. '(' '(' ')' dus. Daar mist nog een ')' voor een gelijk aantal, of er staat een '(' teveel O-)
Ja, maar dat is een ander probleem :)

Acties:
  • 0 Henk 'm!

  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 14-05 13:16

BLACKfm

o_O

Tadango schreef op woensdag 10 maart 2021 @ 12:19:
[...]


Ja, maar dat is een ander probleem :)
Buiten of het een ander probleem is, is dat een voorbeeld. En ik verwacht overigens wel dat het in die regels code niet juist is. Of het moet weer een arduino dingetje zijn dat het zo wel goed gecode is...

Litebit.eu voorraad check :).


Acties:
  • 0 Henk 'm!

  • Accretion
  • Registratie: April 2014
  • Laatst online: 07:21

Accretion

⭐⭐⭐⭐⭐ (5/5)

Druk eens op "ctrl+t"

Voor elke 'digitalWrite' in het tweede stuk, staat een '(', dat gaat helemaal mis; en dat zie je ook bij auto-format.

Acties:
  • 0 Henk 'm!

  • thomasv.w
  • Registratie: Maart 2021
  • Laatst online: 07-09-2021
Ik krijg nu geen foutmeldingen meer, maar mijn ledjes gaan meteen aan als ik mn programma upload...

Acties:
  • 0 Henk 'm!

  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 14-05 13:16

BLACKfm

o_O

thomasv.w schreef op woensdag 10 maart 2021 @ 12:21:
Ik krijg nu geen foutmeldingen meer, maar mijn ledjes gaan meteen aan als ik mn programma upload...
En hoe is de button? Quick check is natuurlijk de LOW en HIGH omwisselen en op de knop drukken.

En is het een momentary switch? (die dus enkel werkt of onderbreekt bij het indrukken.

[ Voor 15% gewijzigd door BLACKfm op 10-03-2021 12:28 ]

Litebit.eu voorraad check :).


Acties:
  • 0 Henk 'm!

  • Thy...
  • Registratie: April 2006
  • Laatst online: 10:02
Tadango schreef op woensdag 10 maart 2021 @ 12:19:
[...]


Ja, maar dat is een ander probleem :)
Zijn tweede probleem was
"expected ')' before ';' token"
Dat kwam door de ( teveel voor elke digitalwrite in het else statement.

Acties:
  • 0 Henk 'm!

  • thomasv.w
  • Registratie: Maart 2021
  • Laatst online: 07-09-2021
Oke, dus..

Ik heb dit programma nu ingeladen en wel, alleen zonder dat mijn pin 8 aangesloten is op een schakelaar/knop gaan de leds al aan. Dit zou toch niet moeten kunnen?

int button = 8; // GPIO 8 for the button
int led1 = 22; // led van ledstrip groen 10x
int led2 = 23; // led van ledstrip groen 10x
int led3 = 24; // led van ledstrip groen 10x
int led4 = 25; // led van ledstrip groen 10x
int led5 = 26; // led van ledstrip groen 10x
int led6 = 27; // led van ledstrip groen 10x
int led7 = 28; // led van ledstrip groen 10x
int led8 = 29; // led van ledstrip groen 10x
int led9 = 30; // led van ledstrip groen 10x
int led10 = 31; // led van ledstrip groen 10x
int led11 = 32; // led van ledstrip rood 10x
int led12 = 33; // led van ledstrip rood 10x
int led13 = 34; // led van ledstrip rood 10x
int led14 = 35; // led van ledstrip rood 10x
int led15 = 36; // led van ledstrip rood 10x
int led16 = 37; // led van ledstrip rood 10x
int led17 = 38; // led van ledstrip rood 10x
int led18 = 39; // led van ledstrip rood 10x
int led19 = 40; // led van ledstrip rood 10x
int led20 = 41; // led van ledstrip rood 10x


void setup() {
pinMode(button, INPUT); // define button as an input
pinMode(led1, OUTPUT); // define LED as an output
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
pinMode(led7, OUTPUT);
pinMode(led8, OUTPUT);
pinMode(led9, OUTPUT);
pinMode(led10, OUTPUT);
pinMode(led11, OUTPUT);
pinMode(led12, OUTPUT);
pinMode(led13, OUTPUT);
pinMode(led14, OUTPUT);
pinMode(led15, OUTPUT);
pinMode(led16, OUTPUT);
pinMode(led17, OUTPUT);
pinMode(led18, OUTPUT);
pinMode(led19, OUTPUT);
pinMode(led20, OUTPUT);

}

void loop() {

if (digitalRead(button) == HIGH)
{

digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led5, HIGH);
digitalWrite(led6, HIGH);
digitalWrite(led7, HIGH);
digitalWrite(led8, HIGH);
digitalWrite(led9, HIGH);
digitalWrite(led10, HIGH);
digitalWrite(led11, HIGH);
digitalWrite(led12, HIGH);
digitalWrite(led13, HIGH);
digitalWrite(led14, HIGH);
digitalWrite(led15, HIGH);
digitalWrite(led16, HIGH);
digitalWrite(led17, HIGH);
digitalWrite(led18, HIGH);
digitalWrite(led19, HIGH);
digitalWrite(led20, HIGH);
}

else
{
(digitalWrite(led1, LOW));
(digitalWrite(led2, LOW));
(digitalWrite(led3, LOW));
(digitalWrite(led4, LOW));
(digitalWrite(led5, LOW));
(digitalWrite(led5, LOW));
(digitalWrite(led6, LOW));
(digitalWrite(led7, LOW));
(digitalWrite(led8, LOW));
(digitalWrite(led9, LOW));
(digitalWrite(led10, LOW));
(digitalWrite(led11, LOW));
(digitalWrite(led12, LOW));
(digitalWrite(led13, LOW));
(digitalWrite(led14, LOW));
(digitalWrite(led15, LOW));
(digitalWrite(led16, LOW));
(digitalWrite(led17, LOW));
(digitalWrite(led18, LOW));
(digitalWrite(led19, LOW));
(digitalWrite(led20, LOW));
}


}

Acties:
  • 0 Henk 'm!

  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 14-05 13:16

BLACKfm

o_O

Dat ligt er aan, wellicht is deze standaard 'HIGH'?

Hoe is je schema? Maak je gebruik van een weerstand (pullup/pulldown)?

Je zou vooraf kunnen definiëren dat de input LOW is, dan weet je het in ieder geval zeker.

code:
1
digitalWrite(button, LOW)


Heb je via de arduino software al gekeken wat de waardes zijn?
https://www.arduino.cc/en...amples/DigitalReadSerial/

Wat @Kalkran hieronder aangeeft kan ik beamen. Al heb ik dat meer ervaren op een AnalogeRead. In een 'zwevende' status geeft deze een random waarde. En elke waarde hoger dan 0 is dan een HIGH. Dus door storing van buitenaf kan er altijd een HIGH signaal gegeven worden als je dat er niet uit 'filtert' (door bijv. een weerstand).

[ Voor 30% gewijzigd door BLACKfm op 10-03-2021 13:39 ]

Litebit.eu voorraad check :).


Acties:
  • 0 Henk 'm!

  • Kalkran
  • Registratie: Maart 2011
  • Laatst online: 04-05 11:21
Je moet je verbindingen aan digitale input pins niet los laten hangen, dan werken ze als een antenne en vangen ze omgevingsruis op, "floaten" wordt dat genoemd. Wat gebeurt er als je ze in de aarde-rail steekt?

Makkelijkste oplossing is om de `pinMode(button, INPUT_PULLDOWN)` te zetten, dan maakt de Arduino automatisch een koppeling met de aarde en blijft je pin netjes logisch "laag" zolang er geen spanning op komt te staan. Anders kan je zelf tussen je pin 8 en de aarde-rail een weerstand plaatsen om de input-pin op 0V te houden.

Acties:
  • 0 Henk 'm!

  • SuperKris
  • Registratie: Juni 2010
  • Laatst online: 07-05 12:44
Nee hoor, dat is heel goed mogelijk als je input pin geen pulldown heeft. Waarom dit nodig is kan ik een lang verhaal over maken maar je kan jezelf beter even inlezen op dit onderwerp. Volgens hebben de meeste arduinos overigens geen ingebouwde pull down dus dan moet je een externe gebruiken. Je kan wel een pull up gebruiken, maar dan moet je de werking van je input pin in je programma dus omkeren. Dit is gebruikelijk.

Ik ben zelf enorm slecht met programmeren, maar zelfs ik kan zien dat je werkwijze niet echt handig is. Doe jezelf een lol, en ga jezelf eens wat meer inlezen over hoe dit soort dingen werken. Er zijn ook hele goede Arduino tutorials op youtube die stap voor stap een stukje verder gaan.

Acties:
  • 0 Henk 'm!

  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 14-05 13:16

BLACKfm

o_O

SuperKris schreef op woensdag 10 maart 2021 @ 13:40:
Ik ben zelf enorm slecht met programmeren, maar zelfs ik kan zien dat je werkwijze niet echt handig is. Doe jezelf een lol, en ga jezelf eens wat meer inlezen over hoe dit soort dingen werken. Er zijn ook hele goede Arduino tutorials op youtube die stap voor stap een stukje verder gaan.
Kan je dat inmiddels zien, of was je daar als 'leek' ook achter gekomen? Al doende leert men :).
Uiteraard eerst uren/dagen inlezen in de fouten die andere al hebben gemaakt helpt wel een beetje.

De LMGTFY-mentaliteit moeten we niet op elke vraag toepassen.

[ Voor 4% gewijzigd door BLACKfm op 10-03-2021 13:45 ]

Litebit.eu voorraad check :).


Acties:
  • 0 Henk 'm!

  • SuperKris
  • Registratie: Juni 2010
  • Laatst online: 07-05 12:44
BLACKfm schreef op woensdag 10 maart 2021 @ 13:44:
[...]


Kan je dat inmiddels zien, of was je daar als 'leek' ook achter gekomen? Al doende leert men :).
Uiteraard eerst uren/dagen inlezen in de fouten die andere al hebben gemaakt helpt wel een beetje.

De LMGTFY-mentaliteit moeten we niet op elke vraag toepassen.
Ik snap je bericht niet helemaal. Bedoel je dat ik niet zomaar moet zeggen dat iemand zelf ook op zoek kan naar informatie? Volgens mij geeft ik duidelijk aan wat het probleem is en hoe hij dat op kan lossen. Dat ik dit niet tot in het kleinste detail uitleg heeft daarin tegen wel te maken met het gebrek aan zelf research doen.

Na de blink sketch is het toevoegen van een knop de 2e sketch in zowat elke tutorial. Dergelijke werking is algemeen en dat past prima bij de vraagstelling van de TS. Een complete uitleg geven van hoe je een LEDje met een knopje kan aanzetten is door andere al letterlijk duizenden keren gedaan, en beter dan ik het kan. Verder wil ik je graag uitnodigen ook even naar andere reacties van mij hier op het forum te kijken. Ik ga namelijk vrij ver in mijn beantwoording.

Acties:
  • 0 Henk 'm!

  • thomasv.w
  • Registratie: Maart 2021
  • Laatst online: 07-09-2021
Ik begrijp jullie :)
Met een los breadboard en losse LED's lukt het me ook allemaal hoor, alleen ik werk nu met printplaten waar leds en weerstanden opzitten, en dan werkt het ineens niet meer. Vandaar dat ik het hier vroeg.

Acties:
  • 0 Henk 'm!

  • AlexanderB
  • Registratie: Maart 2007
  • Laatst online: 09-05 19:05

AlexanderB

7800 rpm

BLACKfm schreef op woensdag 10 maart 2021 @ 12:14:
Beetje vreemde wijze van uitvoeren, je moet blijkbaar 3 situaties programmeren terwijl er maar 2 zijn (high of low).
Nope, je hebt maar 2 situaties nodig. Eentje die je specificeert, en eentje voor al het andere.
Dat andere kan je zo nodig vervolgens weer uitsplitsen met 'else if ()'
Je kan zelfs zonder laatste else statement aan de gang.



Paar tips die wellicht nuttig zijn:
De Atmega 2650 heeft een maximum stroom van 150 200 mA, dus als je te veel ledjes er aan hangt kan je je Arduino Mega slopen.

Dit hele programma kan overigens in een paar regels code. :) Uitleg hier: https://www.arduino.cc/en/Reference/PortManipulation

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
bool aan = false;

void setup() {
  DDRA = B11111111; // Port A 0~7 output (Arduino Mega Pin 21~29)
  DDRC = B11111111; // Port C 0~7 output (Arduino Mega Pin 30~37)
  DDRD = DDRD | B10000000; // Port D 7 output (Arduino Mega pin 38)
  DDRG = DDRG | B00000111; // Port G 0~2 output (Arduino Mega Pin 39, 40, 41)
  pinMode(8, INPUT);
  
}

void loop() {
  if (digitalRead(8) == HIGH and aan == false)
  {
    PORTA = B11111111; // alles op een
    PORTC = B11111111; // alles op een
    PORTD = PORTD | B10000000; // alles blijft staan behalve de eerste bit.
    PORTG = PORTG | B00000111; // alles blijft staan behalve de laatste drie bits.
    aan = true;
  }
  else if (digitalRead(8) == LOW and aan == true)
  {
    PORTA = B00000000; // alles op nul
    PORTC = B00000000; // alles op nul
    PORTD = PORTD ^ B10000000; // flipt de eerste bit om zonder de rest te verstoren.
    PORTG = PORTG ^ B00000111; // flipt de laatste 3 bits om zonder de rest te verstoren.
    aan = false;
  }
  delay(50); // 50 miliseconden niks doen = 20x per seconde checken of de knop is ingedrukt.
}

Het kan nog korter, dit zou ook moeten werken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int knop, vorigeKnop;

void setup() {
  DDRA = B11111111; // Port A 0~7 output (Arduino Mega Pin 21~29)
  DDRC = B11111111; // Port C 0~7 output (Arduino Mega Pin 30~37)
  DDRD = DDRD | B10000000; // Port D 7 output (Arduino Mega pin 38)
  DDRG = DDRG | B00000111; // Port G 0~2 output (Arduino Mega Pin 39, 40, 41)
  pinMode(8, INPUT);
  
}

void loop() {
  knop = digitalRead(8);
  if (knop != vorigeKnop)
  {
    PORTA = PORTC ^ B11111111; // flip alles
    PORTC = PORTC ^ B11111111; // flip alles
    PORTD = PORTD ^ B10000000; // flipt de eerste bit om zonder de rest te verstoren.
    PORTG = PORTG ^ B00000111; // flipt de laatste 3 bits om zonder de rest te verstoren.
    vorigeKnop = knop;
  }
  delay(50); // 50 miliseconden niks doen = 20x per seconde checken of de knop is ingedrukt.
}

[ Voor 18% gewijzigd door AlexanderB op 10-03-2021 15:55 ]


Acties:
  • 0 Henk 'm!

  • SuperKris
  • Registratie: Juni 2010
  • Laatst online: 07-05 12:44
AlexanderB schreef op woensdag 10 maart 2021 @ 15:30:
[...]

Nope, je hebt maar 2 situaties nodig. Eentje die je specificeert, en eentje voor al het andere.
Dat andere kan je zo nodig vervolgens weer uitsplitsen met 'else if ()'
Je kan zelfs zonder laatste else statement aan de gang.



Paar tips die wellicht nuttig zijn:
De Atmega 2650 heeft een maximum stroom van 150 mA, dus als je te veel ledjes er aan hangt kan je je Arduino Mega slopen.

Dit hele programma kan overigens in een paar regels code. :) Uitleg hier: https://www.arduino.cc/en/Reference/PortManipulation

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
bool aan = false;

void setup() {
  DDRA = B11111111; // Port A 0~7 output (Arduino Mega Pin 21~29)
  DDRC = B11111111; // Port C 0~7 output (Arduino Mega Pin 30~37)
  DDRD = DDRD | B10000000; // Port D 7 output (Arduino Mega pin 38)
  DDRG = DDRG | B00000111; // Port G 0~2 output (Arduino Mega Pin 39, 40, 41)
  pinMode(8, INPUT);
  
}

void loop() {
  if (digitalRead(8) == HIGH and aan == false)
  {
    PORTA = B11111111; // alles op een
    PORTC = B11111111; // alles op een
    PORTD = PORTD | B10000000; // alles blijft staan behalve de eerste bit.
    PORTG = PORTG | B00000111; // alles blijft staan behalve de laatste drie bits.
    aan = true;
  }
  else if (digitalRead(8) == LOW and aan == true)
  {
    PORTA = B00000000; // alles op nul
    PORTC = B00000000; // alles op nul
    PORTD = PORTD ^ B10000000; // flipt de eerste bit om zonder de rest te verstoren.
    PORTG = PORTG ^ B00000111; // flipt de laatste 3 bits om zonder de rest te verstoren.
    aan = false;
  }
  delay(50); // 50 miliseconden niks doen = 20x per seconde checken of de knop is ingedrukt.
}

Het kan nog korter, dit zou ook moeten werken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int knop, vorigeKnop;

void setup() {
  DDRA = B11111111; // Port A 0~7 output (Arduino Mega Pin 21~29)
  DDRC = B11111111; // Port C 0~7 output (Arduino Mega Pin 30~37)
  DDRD = DDRD | B10000000; // Port D 7 output (Arduino Mega pin 38)
  DDRG = DDRG | B00000111; // Port G 0~2 output (Arduino Mega Pin 39, 40, 41)
  pinMode(8, INPUT);
  
}

void loop() {
  knop = digitalRead(8);
  if (knop != vorigeKnop)
  {
    PORTA = PORTC ^ B11111111; // flip alles
    PORTC = PORTC ^ B11111111; // flip alles
    PORTD = PORTD ^ B10000000; // flipt de eerste bit om zonder de rest te verstoren.
    PORTG = PORTG ^ B00000111; // flipt de laatste 3 bits om zonder de rest te verstoren.
    vorigeKnop = knop;
  }
  delay(50); // 50 miliseconden niks doen = 20x per seconde checken of de knop is ingedrukt.
}
Goede betreffende de maximale totale stroom. Dacht ik ook aan, maar ik had om 1of andere reden 400mA totaal in mijn hoofd, dus ik dacht dat kan net.

Grappige methode om die portregisters te gebruiken. Dat laat maar weer zien dat er bij programmeren erg veel manieren zijn om hetzelfde te bereiken.

Nogmaals, ik ben verre van een expert, maar ik zou zelf zeggen dat een for loop de meest pastiche methode is om dit te doen.

Acties:
  • 0 Henk 'm!

  • AlexanderB
  • Registratie: Maart 2007
  • Laatst online: 09-05 19:05

AlexanderB

7800 rpm

Ah ja, 200mA totaal, 40mA per pin (recommended 20mA per pin)

Ik heb zo iets inderdaad ook wel eens met een for loop geprobeerd, maar dat werkte (bij mij) niet. Arduino vond het niet echt lekker om dynamische getallen als input voor pinmode en digitalread/write te krijgen. Heb toen de moeite niet genomen om het verder uit te zoeken en een andere, iets minder modulaire oplossing gezocht, maar dat is inderdaad heel wat anders dan direct de pinnen in hardware registers aan en uit doen. :)
Pagina: 1