Switch case loopt vast

Arduino specifieke Software
Berichten: 1
Geregistreerd: 21 Dec 2021, 22:51

Switch case loopt vast

Berichtdoor stijngoris » 21 Dec 2021, 23:05

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

Advertisement

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Switch case loopt vast

Berichtdoor Gij Kieken » 23 Dec 2021, 11:18

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;

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Switch case loopt vast

Berichtdoor shooter » 26 Dec 2021, 11:07

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

Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: Switch case loopt vast

Berichtdoor zuid » 27 Dec 2021, 18:04

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

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: Switch case loopt vast

Berichtdoor ctunes » 06 Jan 2022, 23:22

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.


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.

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: Switch case loopt vast

Berichtdoor ctunes » 06 Jan 2022, 23:23

If (true)
else if (true)

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: Switch case loopt vast

Berichtdoor ctunes » 06 Jan 2022, 23:26

ctunes schreef:If (true)
else if (true)


En je "debounced" niet, wat waarschijnlijk een oorzaak van "raar" functioneren is.
Laatst gewijzigd door ctunes op 06 Jan 2022, 23:29, in totaal 1 keer gewijzigd.

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: Switch case loopt vast

Berichtdoor ctunes » 06 Jan 2022, 23:28

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.

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: Switch case loopt vast

Berichtdoor ctunes » 06 Jan 2022, 23:34

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.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Google Adsense [Bot] en 23 gasten