PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Array in einer Swich case schleife



Ferdinand
03.03.2018, 22:24
Hallo ich habe ein problem und finde den fehler nicht habe auch schon gegoogelt um die switch() schleife nochmal zu prüfen hier mein code



// 14-19
//Sensoren
const int V_LINKS = 14;
const int V_MITTE = 15;
const int V_RECHTS = 16;
const int H_LINKS = 17;;
const int H_MITTE = 18;;
const int H_RECHTS = 19;
//Motoren
const int LINKS = 6;
const int RECHTS = 5;
const int VOR = 4;
const int ZURUECK = 2;
const int PWM = 3;

int pwm = 127;


void setup() {
// put your setup code here, to run once:







pinMode(V_LINKS, INPUT);
pinMode(V_MITTE, INPUT);
pinMode(V_RECHTS, INPUT);
pinMode(H_LINKS, INPUT);
pinMode(H_MITTE, INPUT);
pinMode(H_RECHTS, INPUT);

pinMode(LINKS, OUTPUT);
pinMode(RECHTS, OUTPUT);
pinMode(VOR, OUTPUT);
pinMode(ZURUECK, OUTPUT);
pinMode(PWM, OUTPUT);






}

void loop() {

analogWrite(PWM, pwm);

int i = 0;
int sensoren[6] = {V_LINKS,V_MITTE,V_RECHTS,H_LINKS,H_MITTE,H_RECHTS };

for (int i=0; i<5; i++){// Anweisungen
}


switch(sensoren[i])
{
case V_MITTE == HIGH :

digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);

break;

case V_LINKS == HIGH :

digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(RECHTS, HIGH);
digitalWrite(LINKS, LOW);

break;

case V_RECHTS == HIGH :

digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, LOW);

break;

case H_MITTE == HIGH :

digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);

break;

case H_LINKS == HIGH :

digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(RECHTS, HIGH);
digitalWrite(LINKS, LOW);


break;

case H_RECHTS == HIGH :

digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, LOW);

break;


default :

digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, HIGH);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);



}
/*if (digitalRead(V_MITTE) == LOW)
{
digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);
}
else if (digitalRead(V_LINKS) == LOW)
{
digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(RECHTS, HIGH);
digitalWrite(LINKS, LOW);
}
else if (digitalRead(V_RECHTS) == LOW)
{
digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, LOW);
}
else if (digitalRead(H_MITTE) == LOW)
{
digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);
}

else if (digitalRead(H_LINKS) == LOW)
{
digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(RECHTS, HIGH);
digitalWrite(LINKS, LOW);
}
else if (digitalRead(H_RECHTS) == LOW)
{
digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, LOW);
}

else
{

digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, HIGH);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);
}

//delay(30);
*/


}



ohne das "== HIGH" bei denn case kann ich das program auch compeliren ich denke das es ohne vergleich auch richtig ist, irgendwas mach ich da falsch.

wen ich das Programm ohne die "== HIGH" Flashe dann springt er gleich zum zweiten case und hängt sich auf.

und es macht einen unterschid ob ich die Switch case schleife in der for schleife habe oder nicht wen ich sie nicht drin habe dan bekomme ich keine reaktion.

- - - Aktualisiert - - -

ok ich habe noch ein kleinen fehler gefunden hir nochmal mein code









// 14-19
//Sensoren
const int V_LINKS = 14;
const int V_MITTE = 15;
const int V_RECHTS = 16;
const int H_LINKS = 17;;
const int H_MITTE = 18;;
const int H_RECHTS = 19;
//Motoren
const int LINKS = 6;
const int RECHTS = 5;
const int VOR = 4;
const int ZURUECK = 2;
const int PWM = 3;

int pwm = 127;


void setup() {
// put your setup code here, to run once:







pinMode(V_LINKS, INPUT);
pinMode(V_MITTE, INPUT);
pinMode(V_RECHTS, INPUT);
pinMode(H_LINKS, INPUT);
pinMode(H_MITTE, INPUT);
pinMode(H_RECHTS, INPUT);

pinMode(LINKS, OUTPUT);
pinMode(RECHTS, OUTPUT);
pinMode(VOR, OUTPUT);
pinMode(ZURUECK, OUTPUT);
pinMode(PWM, OUTPUT);






}

void loop() {

analogWrite(PWM, pwm);

int i = 0;
int sensoren[6] = {V_LINKS,V_MITTE,V_RECHTS,H_LINKS,H_MITTE,H_RECHTS };
int wert[6];

for (int i=0; i<5; i++){// Anweisungen

wert[i] = digitalRead(sensoren[i]);
}


switch(wert[i] == LOW)
{
case V_MITTE :

digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);

break;

case V_LINKS :

digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(RECHTS, HIGH);
digitalWrite(LINKS, LOW);

break;

case V_RECHTS :

digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, LOW);

break;

case H_MITTE :

digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);

break;

case H_LINKS :

digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(RECHTS, HIGH);
digitalWrite(LINKS, LOW);


break;

case H_RECHTS :

digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, LOW);

break;


default :

digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, HIGH);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);



}
/*if (digitalRead(V_MITTE) == LOW)
{
digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);
}
else if (digitalRead(V_LINKS) == LOW)
{
digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(RECHTS, HIGH);
digitalWrite(LINKS, LOW);
}
else if (digitalRead(V_RECHTS) == LOW)
{
digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, LOW);
}
else if (digitalRead(H_MITTE) == LOW)
{
digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);
}

else if (digitalRead(H_LINKS) == LOW)
{
digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(RECHTS, HIGH);
digitalWrite(LINKS, LOW);
}
else if (digitalRead(H_RECHTS) == LOW)
{
digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, LOW);
}

else
{

digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, HIGH);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);
}

//delay(30);
*/


}



das Problem ist das meine sensoren bei einem ereignis ein LOW bringen und ich nicht weis wie das eine Switch schleife erkennen kann.

021aet04
03.03.2018, 22:51
Du kannst bei Switch/case Schleifen nicht prüfen, somit funktioniert auch ==, >, <,.... nicht.

Wenn du das ==high entfernst funktioniert die Abfrage richtig, jedoch wird dann auf den genauen Wert geprüft.

Deine Schleife verstehe ich auch nicht ganz.

Zur Switch Abfrage:

Es wird die Variable geprüft, die in der Klammer beim Switch steht. Mit Case wird genau auf einen Wert geprüft.

Als Beispiel:


switch (variable)
{
case 1:
break;

case 5:
break;

default:
}


Wenn in variable 1 steht, wird auch "case 1:", ist die variable 5, wird auch "case 5:" ausgeführt, ist aber die variable z.B. 2 wird nichts ausgeführt, außer du hast das "default:" drinnen, dann wird das ausgeführt.

Jetzt zu deinem Problem, du hast einmal die for Schleife, die wird zwar 5x durchlaufen, da passiert aber nichts. Danach prüfst du die Variable "Sensor[5]" (weil durch die for Schleife die Variable "i" 5 ist). Sensor[5] ist weiter oben mit "H_Rechts" definiert und somit mit der Zahl 19. Wenn du jetzt bei den Case Abfragen das ==High entfernst (sonst geht es nicht) wird immer "case H_Rechts" (weil das dem Wert in "Sensor[5]" steht) ausgeführt.

Edit: Ich habe einen Fehler eingebaut. Es wird nicht "Sensor[4]" geprüft sondern "Sensor[5]", weil die for Schleife noch einmal erhöht wird, aber die Schleife nicht mehr ausgeführt (weil die Bedingung "i<5" nicht mehr stimmt). Habe es ausgebessert.

MfG Hannes

HaWe
04.03.2018, 09:55
@Ferdinand:
switch/case prüft nur auf (statische) Integer-Konstanten, nicht auf variable Werte, nicht auf floats und nicht auf Intervalle/Bereiche.

du kannst nur auf ==, >, < etc prüfen, wenn du statt switch/case das Konstrukt

if( ) { }
else if( ) { }
else if( ) { }
else { }

verwendest

HeXPloreR
04.03.2018, 10:41
Wenn du also dennoch das Switch-Case Konstrukt verwenden möchtest dann musst die Sensorwerte z.B. von V_Mitte (Sensor 1) an "i" mit "1" übergeben. Du musst dann aber auch Sensor 2 mit "2" übergeben (systematische Vorgehenswiese) usw usw
Dazu ist es natürlich unbedingt nötig die Switch-Case Anweisung zu verstehen. Hannes hat den Grundkörper ja schon gepostet.

Ansosnten eignet sich die Switch-Case vielleicht nicht für dein Problem und die von HaWe angesprochene "If-Else" Konstruktion sollte angewendet werden, besonders im Bezug auf die For-Schleife.
Man kann einen Schleifenzähler auch anders aufbauen:

i = 0 (oder direkter 1, wenn man den ersten entsprechenden Sensor direkt im Programmcode sehen möchte)
if i == (größer als verbaute Sensoren voranden sind, hier vermutlich 5 bzw 6), than i = 0 (bzw 1)
dann den Switch durchlaufen
i = +1 ( i erhöhen)

Damit prüft man dann pro Programmdurchlauf den jeweiligen Sensor.


Viele Grüße
Jörg

Ferdinand
04.03.2018, 12:01
OK ich verstehe also die beste lössung ist mit if else anweisungen also so



// 14-19
//Sensoren
const int V_LINKS = 14;
const int V_MITTE = 15;
const int V_RECHTS = 16;
const int H_LINKS = 17;;
const int H_MITTE = 18;;
const int H_RECHTS = 19;
//Motoren
const int LINKS = 6;
const int RECHTS = 5;
const int VOR = 4;
const int ZURUECK = 2;
const int PWM = 3;

int pwm = 127;


void setup() {
// put your setup code here, to run once:







pinMode(V_LINKS, INPUT);
pinMode(V_MITTE, INPUT);
pinMode(V_RECHTS, INPUT);
pinMode(H_LINKS, INPUT);
pinMode(H_MITTE, INPUT);
pinMode(H_RECHTS, INPUT);

pinMode(LINKS, OUTPUT);
pinMode(RECHTS, OUTPUT);
pinMode(VOR, OUTPUT);
pinMode(ZURUECK, OUTPUT);
pinMode(PWM, OUTPUT);






}

void loop() {

analogWrite(PWM, pwm);


if (digitalRead(V_MITTE) == LOW)
{
digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);
}
else if (digitalRead(V_LINKS) == LOW)
{
digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(RECHTS, HIGH);
digitalWrite(LINKS, LOW);
}
else if (digitalRead(V_RECHTS) == LOW)
{
digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, LOW);
}
else if (digitalRead(H_MITTE) == LOW)
{
digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);
}

else if (digitalRead(H_LINKS) == LOW)
{
digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(RECHTS, HIGH);
digitalWrite(LINKS, LOW);
}
else if (digitalRead(H_RECHTS) == LOW)
{
digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, LOW);
}

else
{

digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, HIGH);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);
}

//delay(30);



}

HaWe
04.03.2018, 12:24
OK ich verstehe also die beste lössung ist mit if else anweisungen also so



// 14-19
//Sensoren
const int V_LINKS = 14;
const int V_MITTE = 15;
const int V_RECHTS = 16;
const int H_LINKS = 17;;
const int H_MITTE = 18;;
const int H_RECHTS = 19;
//Motoren
const int LINKS = 6;
const int RECHTS = 5;
const int VOR = 4;
const int ZURUECK = 2;
const int PWM = 3;

int pwm = 127;


void setup() {
// put your setup code here, to run once:







pinMode(V_LINKS, INPUT);
pinMode(V_MITTE, INPUT);
pinMode(V_RECHTS, INPUT);
pinMode(H_LINKS, INPUT);
pinMode(H_MITTE, INPUT);
pinMode(H_RECHTS, INPUT);

pinMode(LINKS, OUTPUT);
pinMode(RECHTS, OUTPUT);
pinMode(VOR, OUTPUT);
pinMode(ZURUECK, OUTPUT);
pinMode(PWM, OUTPUT);






}

void loop() {

analogWrite(PWM, pwm);


if (digitalRead(V_MITTE) == LOW)
{
digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);
}
else if (digitalRead(V_LINKS) == LOW)
{
digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(RECHTS, HIGH);
digitalWrite(LINKS, LOW);
}
else if (digitalRead(V_RECHTS) == LOW)
{
digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, LOW);
}
else if (digitalRead(H_MITTE) == LOW)
{
digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);
}

else if (digitalRead(H_LINKS) == LOW)
{
digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(RECHTS, HIGH);
digitalWrite(LINKS, LOW);
}
else if (digitalRead(H_RECHTS) == LOW)
{
digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, LOW);
}

else
{

digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, HIGH);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);
}

//delay(30);



}


theoretisch, von der Syntax her, sieht es korrekt aus - ob er aber genau das tut, was du vorhast, weiß ich ntl nicht.

Ferdinand
04.03.2018, 21:20
Also hier noch mal der fertige Code jetzt geht alles




// 14-19
//Sensoren
const int V_LINKS = 14;
const int V_MITTE = 15;
const int V_RECHTS = 16;
const int H_LINKS = 17;;
const int H_MITTE = 18;;
const int H_RECHTS = 19;
//Motoren
const int LINKS = 6;
const int RECHTS = 5;
const int VOR = 4;
const int ZURUECK = 2;
const int PWM = 3;

int pwm = 90;


void setup() {
// put your setup code here, to run once:
pinMode(V_LINKS, INPUT);
pinMode(V_MITTE, INPUT);
pinMode(V_RECHTS, INPUT);
pinMode(H_LINKS, INPUT);
pinMode(H_MITTE, INPUT);
pinMode(H_RECHTS, INPUT);

pinMode(LINKS, OUTPUT);
pinMode(RECHTS, OUTPUT);
pinMode(VOR, OUTPUT);
pinMode(ZURUECK, OUTPUT);
pinMode(PWM, OUTPUT);
}

void loop() {

analogWrite(PWM, pwm);



if (digitalRead(V_MITTE) == LOW)
{
digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);
}
else if (digitalRead(V_LINKS) == LOW)
{
digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(RECHTS, HIGH);
digitalWrite(LINKS, LOW);
}
else if (digitalRead(V_RECHTS) == LOW)
{
digitalWrite(ZURUECK, HIGH);
digitalWrite(VOR, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, LOW);
}
else if (digitalRead(H_MITTE) == LOW)
{
digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);
}

else if (digitalRead(H_LINKS) == LOW)
{
digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(RECHTS, HIGH);
digitalWrite(LINKS, LOW);
}
else if (digitalRead(H_RECHTS) == LOW)
{
digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, LOW);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, LOW);
}

/* else
{

digitalWrite(VOR, HIGH);
digitalWrite(ZURUECK, HIGH);
digitalWrite(LINKS, HIGH);
digitalWrite(RECHTS, HIGH);
}*/
//delay(30);



}



Danke für eure Hilfe.