Arduino If else werkt niet zoals het hoort

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • Borrelnootje12
  • Registratie: Juni 2017
  • Laatst online: 10-08-2023
Mijn vraag

Ik heb een programma gemaakt waarin een ledje snel moet knipperen als er een signaal hoog wordt, en uit moet als dit signaal laag is, alleen nu blijft mijn ledje steeds knipperen ookal maak ik het signaal laag. Iemand een idee?

Dit is mijn code:

int led = 2;
int schakelsignaal = 3;


void setup() {
pinMode(led, OUTPUT);
pinMode(schakelsignaal, INPUT);


}

void loop() {
digitalWrite(schakelsignaal, LOW);


if (schakelsignaal = HIGH) {
digitalWrite(led, HIGH);
delay (18);
digitalWrite(led, LOW);
delay(18);
}
else {
digitalWrite(led, LOW);
}

}

Alle reacties


Acties:
  • +3 Henk 'm!

  • com2,1ghz
  • Registratie: Oktober 2004
  • Laatst online: 11-09 10:19
code:
1
if (schakelsignaal = HIGH) {


Dit is geen boolean conditie maar een assignment. Ontbreekt hier niet een tweede '='?

[ Voor 12% gewijzigd door com2,1ghz op 13-09-2021 15:35 ]


Acties:
  • +1 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

com2,1ghz schreef op maandag 13 september 2021 @ 15:35:
code:
1
if (schakelsignaal = HIGH) {


Dit is geen boolean conditie maar een assignment. Ontbreekt hier niet een tweede '='?
Het derde equals sign is alleen om ook de 'soort' variabele te controleren. Dus dat hoeft niet per se nodig te zijn. Ik gok dat het Java of C/C++ is, Javascript kent geen dingen als
code:
1
void functienaam()


@Borrelnootje12 Kun je de code even in code-tags zetten en aangeven in welke taal het is? Dat maakt het in elk geval voor degenen die wel kennis van zaken hebben eea leesbaarder en begrijpelijker.

[ Voor 28% gewijzigd door CH4OS op 13-09-2021 15:38 ]


Acties:
  • 0 Henk 'm!

  • DonJunior
  • Registratie: Februari 2008
  • Laatst online: 22:40
CH4OS schreef op maandag 13 september 2021 @ 15:36:
[...]
Het derde equals sign is alleen om ook de 'soort' variabele te controleren. Dus dat hoeft niet per se nodig te zijn.
Klopt, Hier ontbreekt echter ook het tweede '=' teken. ;)

*sowieso


Acties:
  • +1 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

DonJunior schreef op maandag 13 september 2021 @ 15:37:
Klopt, Hier ontbreekt echter ook het tweede '=' teken. ;)
Klopt, maar in eerste instantie sprak @com2,1ghz erover dat ook de derde equals sign mist. Hij had dat echter vrij gauw door en paste met een 'ninja edit' zijn bericht aan en ik vervolgens op quote klikte op het moment dat hij de wijzigingen opsloeg. :+

[ Voor 10% gewijzigd door CH4OS op 13-09-2021 15:40 ]


Acties:
  • 0 Henk 'm!

  • Plenkske
  • Registratie: Mei 2011
  • Laatst online: 14:21
CH4OS schreef op maandag 13 september 2021 @ 15:36:
[...]
Het derde equals sign is alleen om ook de 'soort' variabele te controleren. Dus dat hoeft niet per se nodig te zijn. Ik gok dat het Java of C/C++ is, Javascript kent geen dingen als
code:
1
void functienaam()


@Borrelnootje12 Kun je de code even in code-tags zetten en aangeven in welke taal het is? Dat maakt het in elk geval voor degenen die wel kennis van zaken hebben eea leesbaarder en begrijpelijker.
Het is C++ , mijn gok is dat het voor een ESP bordje is met daaraan een relais en een ledje. Meestal wordt Arduino IDE gebruikt hiervoor.

Acties:
  • +2 Henk 'm!

  • com2,1ghz
  • Registratie: Oktober 2004
  • Laatst online: 11-09 10:19
CH4OS schreef op maandag 13 september 2021 @ 15:39:
[...]
Klopt, maar in eerste instantie sprak @com2,1ghz erover dat ook de derde equals sign mist. Hij had dat echter vrij gauw door en paste met een 'ninja edit' zijn bericht aan. ;)
Ja sorry, deed een edit omdat ik dacht dat het javascript was. Lees te snel door en checkte alleen de if statement.

[ Voor 6% gewijzigd door com2,1ghz op 13-09-2021 15:40 ]


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Maakt niet uit, kan gebeuren. :+

Acties:
  • 0 Henk 'm!

  • Full_hyperion
  • Registratie: Februari 2003
  • Laatst online: 19-08 22:53
Je leest je schakelsignaal ook niet, maar schrijft deze:
code:
1
 digitalWrite(schakelsignaal, LOW);

Moet denk ik dit zijn:
code:
1
 digitalRead(schakelsignaal);

Acties:
  • +1 Henk 'm!

  • Paul
  • Registratie: September 2000
  • Laatst online: 20:09
C:
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
int led = 2;
int schakelsignaal = 3;

void setup()
{
    pinMode(led, OUTPUT);
    pinMode(schakelsignaal, INPUT);
}

void loop()
{
    digitalWrite(schakelsignaal, LOW);

    if (schakelsignaal = HIGH)
    {
        digitalWrite(led, HIGH);
        delay (18);
        digitalWrite(led, LOW);
        delay(18);
    }
    else
    {
        digitalWrite(led, LOW);
    }
}


schakelsignaal is een int, en deze wordt nergens ge-set. Dus tenzij HIGH ook een integer is, én deze waarde 3 heeft, zal er uit je if (als je het correcte aantal =-tekens gebruikt) altijd false komen...

Ik ben niet zo bekend met Arduino, maar ik vermoed zoiets:
C:
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
int led = 2;
int schakelsignaal = 3;

void setup()
{
    pinMode(led, OUTPUT);
    pinMode(schakelsignaal, INPUT);

    # Wat moet dit doen? Je schrijft naar een input; disable je daarmee de pull-down?
    # Schrijven naar een input lijkt me niet iets dat binnen je main loop hoort :)
    digitalWrite(schakelsignaal, LOW);
}

void loop()
{

    if (digitalRead(schakelsignaal) == HIGH)
    {
        digitalWrite(led, HIGH);
        delay (18);
        digitalWrite(led, LOW);
        delay(18);
    }
    else
    {
        digitalWrite(led, LOW);
    }
}
Ik weet niet hoe erg het is om in de 'else' iedere keer naar zo'n register te schrijven; je kunt ook 'led' 'LOW' schrijven in de setup en de hele 'else' weglaten.

[ Voor 73% gewijzigd door Paul op 13-09-2021 16:41 ]

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Acties:
  • 0 Henk 'm!

  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 11-09 07:00

BoAC

Memento mori

Paul schreef op maandag 13 september 2021 @ 15:55:
C:
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
int led = 2;
int schakelsignaal = 3;

void setup()
{
    pinMode(led, OUTPUT);
    pinMode(schakelsignaal, INPUT);
}

void loop()
{
    digitalWrite(schakelsignaal, LOW);

    if (schakelsignaal = HIGH)
    {
        digitalWrite(led, HIGH);
        delay (18);
        digitalWrite(led, LOW);
        delay(18);
    }
    else
    {
        digitalWrite(led, LOW);
    }
}


schakelsignaal is een int, en deze wordt nergens ge-set. Dus tenzij HIGH ook een integer is, én deze waarde 3 heeft, zal er uit je if (zelfs als je het correcte aantal =-tekens gebruikt) altijd false komen...
Schakelsignaal wordt ge-set in het if-statement zoals eerder gezegd :)
En aangezien HIGH gedefined als 1 zal er uit de if-statement altijd 'true' (!=0) komen en het ledje dus altijd knipperen :)

https://github.com/arduin...res/arduino/Arduino.h#L40

Acties:
  • 0 Henk 'm!

  • Plenkske
  • Registratie: Mei 2011
  • Laatst online: 14:21
Ik heb even wat code van mezelf nagekeken maar blijkbaar heb ik tot nu toe nooit een relais uitgelezen maar alleen gezet.
Dat gebeurt inderdaad met digitalWrite.

Met digitalRead is een relais ook uit te lezen.

Voorbeeldjes hier: https://randomnerdtutoria...lay-module-ac-web-server/
Op die site zijn sowieso heel veel voorbeelden te vinden van esp code.

Acties:
  • +1 Henk 'm!

  • Paul
  • Registratie: September 2000
  • Laatst online: 20:09
BoAC schreef op maandag 13 september 2021 @ 16:06:
Schakelsignaal wordt ge-set in het if-statement zoals eerder gezegd :)
Ja, omdat het verkeerde aantal =-tekens wordt gebruikt :)

Als TS dat fixt werkt het nog steeds niet...

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Acties:
  • 0 Henk 'm!

  • Boermansjo
  • Registratie: Mei 2016
  • Laatst online: 12-09 12:56
Wat ik vooral mis is het stukje waar hij de waarde leest ?
Volgens Arduino heeft digitalWrite geen return value.

Wanneer in de code veranderd dan schakelsignaal ?
Deze zal dus altijd op 3 blijven staan. Je zal ergens op het einde van je loop toch de huidige waarde van de pin moeten uitlezen.

Ik zou iets zoals dit proberen :
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int led = 2; //LED PIN
int schakelsignaal = 3; // schakelsignaal PIN


void setup() {
    pinMode(led, OUTPUT);
    pinMode(schakelsignaal, INPUT);
}

void loop() {
    digitalWrite(schakelsignaal, LOW);

    int val = digitalRead(schakelsignaal); // Lees de waarde van pin
    if (val == HIGH) { //Je kan geen pin vergelijken met een waarde
        digitalWrite(led, HIGH);
        delay(18);
        digitalWrite(led, LOW);
        delay(18);
    }
    else {
        digitalWrite(led, LOW);
    }

}

[ Voor 47% gewijzigd door Boermansjo op 13-09-2021 16:58 ]

Pagina: 1