Switch case loopt vast
9 berichten
• Pagina 1 van 1
- stijngoris
- Berichten: 1
- Geregistreerd: 21 Dec 2021, 22:51
Switch case loopt vast
Goedeavond.
Ik ben zelf bezig met een hobbyproject, namelijk met een aantal schakelaars, potmeter en hoeksensor een aantal ventielen aan te sturen.
Nu heb ik iedere schakelaar in een variabele gezet, en met deze variabele ga ik naar een bepaalde state toe waar er iets uitgevoerd moet worden. Dit doe ik met een switch case.
Echter, de switch case werkt prima wanneer ik in de case alleen een uitgang hoog of laag wil uitsturen. Maar als ik bv. de potmeter of hoeksensor uit wil meten, kan ik enkel de eerste van de twee cases uitvoeren.
Code:
-------------------------------------------------
int drukknop_bodemketting = 8;
int bodemketting_aansturen = 6;
int drukknop_midden_positie = 7;
int drukknop_links = 2;
int drukknop_rechts = 3;
int links_sturen = 5;
int rechts_sturen = 4;
int var;
int status_drukknop_bodemketting = 0;
int status_drukknop_links = 0;
int status_drukknop_rechts = 0;
int status_drukknop_midden_positie = 0;
void setup() {
Serial.begin(9600); // initialize serial communication:
pinMode(drukknop_bodemketting, INPUT); // initialising the input pin
pinMode(bodemketting_aansturen, OUTPUT); // initialising the input pin
pinMode(drukknop_midden_positie, INPUT); // initialize the button pin as a input
pinMode(drukknop_rechts, INPUT); // initialize the button pin as a input
pinMode(drukknop_links, INPUT); // initialize the button pin as a input
pinMode(links_sturen, OUTPUT); // initialize the LED as an output
pinMode(rechts_sturen, OUTPUT); // initialize the LED as an output
}
void loop()
{
status_drukknop_links = digitalRead(drukknop_links);
status_drukknop_rechts = digitalRead(drukknop_rechts);
status_drukknop_midden_positie = digitalRead(drukknop_midden_positie);
status_drukknop_bodemketting = digitalRead(drukknop_bodemketting);
if (status_drukknop_links == HIGH) {
var = 1;
Serial.print("var: ");
Serial.println(var);
}
else if (status_drukknop_rechts == HIGH) {
var = 2;
Serial.print("var: ");
Serial.println(var);
}
else if (status_drukknop_midden_positie == HIGH) {
var = 3;
Serial.print("var: ");
Serial.println(var);
}
else if (status_drukknop_bodemketting == HIGH) {
var = 4;
Serial.print("var: ");
Serial.println(var);
}
else {var = 0;
}
switch (var) {
case 0:
Serial.print("Case 0 \n");
digitalWrite(links_sturen, LOW);
digitalWrite(rechts_sturen, LOW);
digitalWrite(bodemketting_aansturen, LOW);
break;
case 1:
Serial.print("Case 1 \n");
digitalWrite(links_sturen, HIGH);
digitalWrite(rechts_sturen, LOW);
break;
case 2:
Serial.print("Case 2 \n");
digitalWrite(links_sturen, LOW);
digitalWrite(rechts_sturen, HIGH);
break;
case 3:
Serial.print("Case 3 \n");
int sensor_waarde = analogRead(A0);
float spanning_sensor_waarde = sensor_waarde * (5.0 / 1023.0); // 4.88 = midden
Serial.print("spanning_sensor_waarde: ");
Serial.println(spanning_sensor_waarde);
if (spanning_sensor_waarde < 2.40){
digitalWrite(rechts_sturen, HIGH);
} else (digitalWrite(rechts_sturen, LOW));
if (spanning_sensor_waarde > 2.48){
digitalWrite(links_sturen, HIGH);
} else (digitalWrite(links_sturen, LOW));
break;
case 4:
Serial.print("Case 4 \n");
int potmeter_snelheid_bodemketting = analogRead(A1);
int data = analogRead(potmeter_snelheid_bodemketting); //storing the value
data = map(data, 0, 1023, 0, 255); // maps the values
analogWrite(bodemketting_aansturen, data); // THE PWM IMPLEMENTATION
delay (1);
break;
}
}
-------------------------------------------------
Met deze code kan ik in case 0, 1, 2 en 3 komen. Maar zodra ik de "drukknop_bodemketting" indruk, krijg ik wel "var 4" te zien op de seriële monitor maar gaat de code niet naar "case 4". Als ik de int en float verander naar static int en static float kan ik wel naar case 4 gaan. Echter werkt dan het uitlezen van de hoeksensor dan niet meer.
Kan iemand mij vertellen waar dit mis gaat en waarom? Heeft dit te maken met het benoemen van de int en float?
Met vriendelijke groet,
Stijn
Ik ben zelf bezig met een hobbyproject, namelijk met een aantal schakelaars, potmeter en hoeksensor een aantal ventielen aan te sturen.
Nu heb ik iedere schakelaar in een variabele gezet, en met deze variabele ga ik naar een bepaalde state toe waar er iets uitgevoerd moet worden. Dit doe ik met een switch case.
Echter, de switch case werkt prima wanneer ik in de case alleen een uitgang hoog of laag wil uitsturen. Maar als ik bv. de potmeter of hoeksensor uit wil meten, kan ik enkel de eerste van de twee cases uitvoeren.
Code:
-------------------------------------------------
int drukknop_bodemketting = 8;
int bodemketting_aansturen = 6;
int drukknop_midden_positie = 7;
int drukknop_links = 2;
int drukknop_rechts = 3;
int links_sturen = 5;
int rechts_sturen = 4;
int var;
int status_drukknop_bodemketting = 0;
int status_drukknop_links = 0;
int status_drukknop_rechts = 0;
int status_drukknop_midden_positie = 0;
void setup() {
Serial.begin(9600); // initialize serial communication:
pinMode(drukknop_bodemketting, INPUT); // initialising the input pin
pinMode(bodemketting_aansturen, OUTPUT); // initialising the input pin
pinMode(drukknop_midden_positie, INPUT); // initialize the button pin as a input
pinMode(drukknop_rechts, INPUT); // initialize the button pin as a input
pinMode(drukknop_links, INPUT); // initialize the button pin as a input
pinMode(links_sturen, OUTPUT); // initialize the LED as an output
pinMode(rechts_sturen, OUTPUT); // initialize the LED as an output
}
void loop()
{
status_drukknop_links = digitalRead(drukknop_links);
status_drukknop_rechts = digitalRead(drukknop_rechts);
status_drukknop_midden_positie = digitalRead(drukknop_midden_positie);
status_drukknop_bodemketting = digitalRead(drukknop_bodemketting);
if (status_drukknop_links == HIGH) {
var = 1;
Serial.print("var: ");
Serial.println(var);
}
else if (status_drukknop_rechts == HIGH) {
var = 2;
Serial.print("var: ");
Serial.println(var);
}
else if (status_drukknop_midden_positie == HIGH) {
var = 3;
Serial.print("var: ");
Serial.println(var);
}
else if (status_drukknop_bodemketting == HIGH) {
var = 4;
Serial.print("var: ");
Serial.println(var);
}
else {var = 0;
}
switch (var) {
case 0:
Serial.print("Case 0 \n");
digitalWrite(links_sturen, LOW);
digitalWrite(rechts_sturen, LOW);
digitalWrite(bodemketting_aansturen, LOW);
break;
case 1:
Serial.print("Case 1 \n");
digitalWrite(links_sturen, HIGH);
digitalWrite(rechts_sturen, LOW);
break;
case 2:
Serial.print("Case 2 \n");
digitalWrite(links_sturen, LOW);
digitalWrite(rechts_sturen, HIGH);
break;
case 3:
Serial.print("Case 3 \n");
int sensor_waarde = analogRead(A0);
float spanning_sensor_waarde = sensor_waarde * (5.0 / 1023.0); // 4.88 = midden
Serial.print("spanning_sensor_waarde: ");
Serial.println(spanning_sensor_waarde);
if (spanning_sensor_waarde < 2.40){
digitalWrite(rechts_sturen, HIGH);
} else (digitalWrite(rechts_sturen, LOW));
if (spanning_sensor_waarde > 2.48){
digitalWrite(links_sturen, HIGH);
} else (digitalWrite(links_sturen, LOW));
break;
case 4:
Serial.print("Case 4 \n");
int potmeter_snelheid_bodemketting = analogRead(A1);
int data = analogRead(potmeter_snelheid_bodemketting); //storing the value
data = map(data, 0, 1023, 0, 255); // maps the values
analogWrite(bodemketting_aansturen, data); // THE PWM IMPLEMENTATION
delay (1);
break;
}
}
-------------------------------------------------
Met deze code kan ik in case 0, 1, 2 en 3 komen. Maar zodra ik de "drukknop_bodemketting" indruk, krijg ik wel "var 4" te zien op de seriële monitor maar gaat de code niet naar "case 4". Als ik de int en float verander naar static int en static float kan ik wel naar case 4 gaan. Echter werkt dan het uitlezen van de hoeksensor dan niet meer.
Kan iemand mij vertellen waar dit mis gaat en waarom? Heeft dit te maken met het benoemen van de int en float?
Met vriendelijke groet,
Stijn
Advertisement
- Gij Kieken
- Berichten: 636
- Geregistreerd: 15 Nov 2015, 11:54
Re: Switch case loopt vast
Wat gebeurt er als je case 4: verandert in
- Code: Alles selecteren
case 4:
Serial.print("Case 4 \n");
int potmeter_snelheid_bodemketting = analogRead(A1); //storing the value
int data = map(potmeter_snelheid_bodemketting, 0, 1023, 0, 255); // maps the values
analogWrite(bodemketting_aansturen, data); // THE PWM IMPLEMENTATION
delay (1);
break;
Re: Switch case loopt vast
je gebruikt data op twee plaatsen en daarna in een map maar de uuitkomst van een map is vaak geen integer.
paul deelen
shooter@home.nl
shooter@home.nl
Re: Switch case loopt vast
Ik zou het probleem als volgt benaderen. (uitgaande van de code zoals hierboven)
Case 0,1,2,3 werken.
Bij Case 4 --> GEEN reactie.
Als je vervolgens variant 1,2 of 3 gebruikt geven die dan nog wel een juiste reactie?
(dus eerst bijvoorbeeld 3 daarna 4 en dan nog een keer 3)
Zo ja dan is het vreemd dat bij de keuze 4 de Serial.print("Case 4 \n"); niet werkt!
Zo nee dan loopt de Arduino dus bij variant 4 kennelijk vast.
Het lijkt mij dan een probleem in de bedrading o.i.d.
Als de instructie "analogWrite(bodemketting_aansturen, data); // THE PWM IMPLEMENTATION" even op commentaar wordt gezet komt er dan bij keuze 4 wel een tekst via Serial.print?
mvg Nico
Case 0,1,2,3 werken.
Bij Case 4 --> GEEN reactie.
Als je vervolgens variant 1,2 of 3 gebruikt geven die dan nog wel een juiste reactie?
(dus eerst bijvoorbeeld 3 daarna 4 en dan nog een keer 3)
Zo ja dan is het vreemd dat bij de keuze 4 de Serial.print("Case 4 \n"); niet werkt!
Zo nee dan loopt de Arduino dus bij variant 4 kennelijk vast.
Het lijkt mij dan een probleem in de bedrading o.i.d.
Als de instructie "analogWrite(bodemketting_aansturen, data); // THE PWM IMPLEMENTATION" even op commentaar wordt gezet komt er dan bij keuze 4 wel een tekst via Serial.print?
mvg Nico
Re: Switch case loopt vast
Hmpf.
Waarom zet jij je code niet gelijk tussen de "code" tags? Maakt het gelijk een stuk leesbaarder.
Waarom verlang jij dat ik dat zelf moet doen?
Jij vraagt om hulp: wees dan ook duidelijk in je hulpvraag, en probeer zelf al zoveel mogelijk ambiguïteiten weg te halen.
En dan zie je gelijk dat je if-else structuur niet klopt.
Waarom zet jij je code niet gelijk tussen de "code" tags? Maakt het gelijk een stuk leesbaarder.
Waarom verlang jij dat ik dat zelf moet doen?
Jij vraagt om hulp: wees dan ook duidelijk in je hulpvraag, en probeer zelf al zoveel mogelijk ambiguïteiten weg te halen.
stijngoris schreef:
- Code: Alles selecteren
int drukknop_bodemketting = 8;
int bodemketting_aansturen = 6;
int drukknop_midden_positie = 7;
int drukknop_links = 2;
int drukknop_rechts = 3;
int links_sturen = 5;
int rechts_sturen = 4;
int var;
int status_drukknop_bodemketting = 0;
int status_drukknop_links = 0;
int status_drukknop_rechts = 0;
int status_drukknop_midden_positie = 0;
void setup() {
Serial.begin(9600); // initialize serial communication:
pinMode(drukknop_bodemketting, INPUT); // initialising the input pin
pinMode(bodemketting_aansturen, OUTPUT); // initialising the input pin
pinMode(drukknop_midden_positie, INPUT); // initialize the button pin as a input
pinMode(drukknop_rechts, INPUT); // initialize the button pin as a input
pinMode(drukknop_links, INPUT); // initialize the button pin as a input
pinMode(links_sturen, OUTPUT); // initialize the LED as an output
pinMode(rechts_sturen, OUTPUT); // initialize the LED as an output
}
void loop()
{
status_drukknop_links = digitalRead(drukknop_links);
status_drukknop_rechts = digitalRead(drukknop_rechts);
status_drukknop_midden_positie = digitalRead(drukknop_midden_positie);
status_drukknop_bodemketting = digitalRead(drukknop_bodemketting);
if (status_drukknop_links == HIGH) {
var = 1;
Serial.print("var: ");
Serial.println(var);
}
else if (status_drukknop_rechts == HIGH) {
var = 2;
Serial.print("var: ");
Serial.println(var);
}
else if (status_drukknop_midden_positie == HIGH) {
var = 3;
Serial.print("var: ");
Serial.println(var);
}
else if (status_drukknop_bodemketting == HIGH) {
var = 4;
Serial.print("var: ");
Serial.println(var);
}
else {var = 0;
}
switch (var) {
case 0:
Serial.print("Case 0 \n");
digitalWrite(links_sturen, LOW);
digitalWrite(rechts_sturen, LOW);
digitalWrite(bodemketting_aansturen, LOW);
break;
case 1:
Serial.print("Case 1 \n");
digitalWrite(links_sturen, HIGH);
digitalWrite(rechts_sturen, LOW);
break;
case 2:
Serial.print("Case 2 \n");
digitalWrite(links_sturen, LOW);
digitalWrite(rechts_sturen, HIGH);
break;
case 3:
Serial.print("Case 3 \n");
int sensor_waarde = analogRead(A0);
float spanning_sensor_waarde = sensor_waarde * (5.0 / 1023.0); // 4.88 = midden
Serial.print("spanning_sensor_waarde: ");
Serial.println(spanning_sensor_waarde);
if (spanning_sensor_waarde < 2.40){
digitalWrite(rechts_sturen, HIGH);
} else (digitalWrite(rechts_sturen, LOW));
if (spanning_sensor_waarde > 2.48){
digitalWrite(links_sturen, HIGH);
} else (digitalWrite(links_sturen, LOW));
break;
case 4:
Serial.print("Case 4 \n");
int potmeter_snelheid_bodemketting = analogRead(A1);
int data = analogRead(potmeter_snelheid_bodemketting); //storing the value
data = map(data, 0, 1023, 0, 255); // maps the values
analogWrite(bodemketting_aansturen, data); // THE PWM IMPLEMENTATION
delay (1);
break;
}
}
En dan zie je gelijk dat je if-else structuur niet klopt.
Re: Switch case loopt vast
Daarnaast vind ik het nogal raar geprogrammeerd.
Wil je perse switch case gebruiken?
Want alles dat je doet in de case statements kun je net zo goed in de if's laten plaatvinden.
Wil je perse switch case gebruiken?
Want alles dat je doet in de case statements kun je net zo goed in de if's laten plaatvinden.
Re: Switch case loopt vast
- Code: Alles selecteren
int potmeter_snelheid_bodemketting = analogRead(A1);
int data = analogRead(potmeter_snelheid_bodemketting); //storing the value
Jaja, tenzij je iets slims hebt gemaakt als een lookup-table, dan geef je data de waarde van "analogRead(een_zeer_wel_bepaalde_poort).
En daar gaat het (vooral) mis.
9 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: odanenoxaicu en 20 gasten