Hi an alle. Ich habe folgende Herausforderung und weiß nicht recht wie ich diese umsetzen soll. Vielleicht habt ihr dazu eine Idee. Ich habe folgende If Bedingungen: if(var1 >=5 && var1 <=12){ // do something } else if(var1 >=15 && var1 <=20){ // do something } else if((var1 >=15 && var1 <=20)&& var2=1){ // do something } Ich möchte nun einen DIP Schalter mit 3 Hebeln einbauen. Hebel1 = klein Hebel2 = groß Hebel3 = groß Hinter klein soll sich "var1 >=5 && var1 <=12" verbergen. Hinter groß soll sich "var1 >=15 && var1 <=20" verbergen. Könnte ihr mir helfen dies umzusetzen?
El Nino schrieb: > Ich möchte nun einen DIP Schalter mit 3 Hebeln einbauen. was ist ein DIP Schalter mit 3 Hebeln? > Könnte ihr mir helfen dies umzusetzen? Was soll denn umgesetzt werden? Die Erweiterung deiner Abfrage? > if(var1 >=5 && var1 <=12){ > // do something > } + > Hebel1 = klein + > Hinter klein soll sich "var1 >=5 && var1 <=12" verbergen. --> if( (var1 >=5 && var1 <=12) || klein == 1 ) { // do something }
Wegstaben Verbuchsler schrieb: > was ist ein DIP Schalter mit 3 Hebeln? Ein DIP Schalter ist folgendes: http://de.wikipedia.org/wiki/DIP-Schalter Ich denke ich hatte es oben schon angeführt, versuche es aber nochmal zu erklären. Wenn ich am DIP Schalter den "Hebel" beispielsweise nach oben bewege, möchte ich, dass in der If Bedingung durch einen Verweis oder ähnliches "var1 >=5 && var1 <=12" drin steht. In der If Bedingung mit einer einzelnen Variabel zu arbeiten ist ja kein Problem, aber wie soll ich ein Spektrum von 5 bis 12 abdecken? Ist dies möglich?
Hab ich das richtig verstanden, du möchtest bei eingeschaltetem Hebel1 nur die erste Abfrage prüfuen und beim Hebel2 die beiden anderen? Dann ver-und-e doch die Abfragen jeweils noch mit der Prüfung ob Hebel1 bzw. Hebel2 an ist.
Sorry aber dein Problem ist nicht ganz klar formuliert....
1 | if (hebel_1) |
2 | var1 = 10; |
3 | if (hebel_2 || hebel_3) |
4 | var1 = 17; |
Oliver
Man hast DU Probleme. Dein Dip-Schalter ist doch nur ne weitere Variable für die IF-Abfragen. Also - Dip-Schlater einlesen - Variable 3 , 4 und 5 draus generieren - Variable 3, 4 und 5 in den IF-Abfragen drin fertig.
Soll denn nun var1 unabhängig von den Schaltern oder DIP-Schaltern (wo ist der Unterschied?) irgendwelche Werte annehmen? Dann wissen das doch die Schalter nicht. Was ist denn nun die Herausforderung? Problem klar formuliert - und wahrscheinlich ist es dann keines mehr.
El Nino schrieb: > Ein DIP Schalter ist folgendes: > http://de.wikipedia.org/wiki/DIP-Schalter na du bist mir ja ein Held. Was ein DIP-Schalter ist, weiß ich sicherlich. Ich hab da allerdings nicht direkt den Begriff "Hebel" assoziiert.
Vielleicht habe ich mein Problem doch nicht ganz klar formuliert. Ich versuche es nun etwas detailierter. Das Beispiel wird für einen Sicherheitsode bei einem Tresor verwendet. Der Tresor hat einen Knopf. Je nachdem wie lange man den Knopf drückt kann man ein kurzes oder ein langes Signal senden. Der Tresor ist mit einer Zeichenfolge aus 3 aufeinanderfolgenden Tastenbetätigungen zu öffnen. Z.b.: Kurz, Kurz, Lang Das System funktioniert wunderbar. Jedoch habe ich den Öffnungscode hart im Quellcode hinterlegt. Ich möchte diesen aber mit Hilfe eines DIP Schlaters jederzeit ändern können. Somit meine Frage, wie kann ich den fix hinterlegten "Geheimcode" im Quellcode... if(var1 >=5 && var1 <=12){ // kurz // do something var_very1=1; } else if((var1 >=5 && var1 <=12) && var_very1=1){ // kurz // do something var_very2=1; } else if((var1 >=15 && var1 <=20)&& var_very2=1){ // lang // do something var_very3=1; } if(var_very1==1 && var_very2==1 && var_very3=1){ // Tresor öffne dich } ... durch meinen DIP Schalter verändern? Bitte keine Rückmeldungen über die Sinnhaftigkeit, es ist lediglich ein Versuchprojekt. Vielen Dank für die Hilfe.
> Das System funktioniert wunderbar. Jedoch habe ich den Öffnungscode > hart im Quellcode hinterlegt. Ich möchte diesen aber mit Hilfe eines > DIP Schlaters jederzeit ändern können. Ja und? Solche DIP-Schalter sind ja auch nichts anderes als Schalter, nur eben mehrerer in einem Gehäuse. Ein Schalter wiederrum ist auch nur ein Taster, der beim Drücken seine Position behält und nicht von alleine wieder zurückgeht. ALl das sind aber mechanische UNterschiede im Aufbau. Für deinen µC ist das einfach nur ein Kontakt der an einem Portpin hängt und am Portpin ist dann 0 oder 1 sichtbar, je nachdem wie der SChalter steht. Und wie fragt man einen Eingabepin ab? > Ich möchte diesen aber mit Hilfe eines DIP > Schlaters jederzeit ändern können. Dann darf der Code eben nicht fix sein. Alles was nicht fix ist, wird in einer Variablen gespeichert. Also wirst du wohl Variablen brauchen, deren Wert sich aus der Stellung der Dip-Schalter ergibt.
Man könnte es, ergänzend, auch so formulieren: Die DIP-Schalter sind auch nur Variablen, die Du vom Port eingelesen hast und vergleichst. Von dem Ausgang dieses ersten Vergleichs ist wiederum abhängig welche Vergleiche Du mit der Zeitdauer des "Knopfdruckes" anstellst.
Oder noch anders ausgedrückt In if(var1 >=5 && var1 <=12){ // kurz welcher Teil der Abfrage ist denn dafür zuständig, dass hier ein 'kurz' gefordert wird? Das musst du dann eben variabel machen, wobei der dieser Teil dann eben von der Schalterstellung abhängt. Es gibt da mehrere Möglichkeiten, wie man das machen kann. Zum Beispiel (ist nicht die eleganteste Möglichkeit, aber es ist eine Möglichkeit) if( Schalter steht auf 0 ) { if( Druck war kurz ) { var_very1=1; } } else { // Schalter war nicht auf 0, also muss er auf 1 sein if( Druck war lang ) { var_very1=1; } } Du schaffst das schon.
falls deine ganzen "if...else if.. " etc in einer endlosschlaufe stehen, wird dein "else if((var1 >=5 && var1 <=12) && var_very1=1)" nie ausgeführt... schau mal die "switch()"-anweisung an. da machst du am besten sowas wie "switch(status)" wobei status der schritt (1..3) ist, in dem du dich befindest. vor oder nach der switch-anweisung kannst du deine DIP-schalter abfragen und sollten sie sich in einer gewissen stellung befinden, so kannst du eine neue druck-sequenz für deinen tresor programmieren (z.b. status = 4..6).
wir sollen ja nichts über sinnhaftigkeit des Codes sagen, aber in deinem Code, falls er in einer Endlosschleife steht(was ich annehme) ist es egal in welcher Reihenfolge man die Tasten drückt und man könnte auch 10 mal drücken, hauptsache die geforderten intervale tauchen alle einmal auf. Wie schon über mir erwähnt könnte die switch- case Anwendung besser passen. Zu deien Frage: if (dip1==1){ max1=12; min1=5; else { max1=20; min1=15; if(var1 >=min1 && var1 <=max1){ // do something } einfach den zustand der Dips auslesen und die "Grenzen" dementsprechend anpassen. Vorausgesetzt ich habe deine Frage richtg verstanden.
Eine einfache Möglichkeit ist es die Schalterstellungen erst man abzufragen und drei Variablen zuzuweisen z.B.: Schalter_a=0 Schalter_b=0 Schalter_c=1 //0=kurz, 1=lang Dann ordnest Du die Zeit des Tastendrucks einer Variablen zu: wenn (var1 >=5 && var1 <=12) dann Zeit=0 // kurz wenn (var1 >=15 && var1 <=20) dann Zeit=1 // lang else Zeit=2 // ungültig Und dann kannst Du die Zeit mit der Schalterstellung vergleichen: if(Zeit==Schalter_a){ // do something var_very1=1; } else if((Zeit==Schalter_b) && var_very1=1){ // do something var_very2=1; } ... Ich glaube Marco hat recht. Dein Beispiel ist kurz, kurz, lang. Wenn jetzt jemand kurz, lang, kurz, lang drückt geht der Tresor auch auf. Gruß John
John schrieb: > Ich glaube Marco hat recht. Dein Beispiel ist kurz, kurz, lang. Wenn > > jetzt jemand kurz, lang, kurz, lang drückt geht der Tresor auch auf. Ich denke nicht, dass das stimmt. Innerhalb der If Bedingungen wird eine Variable gesetzt, welche für die nächste If Bedingung als Vorraussetzung gilt. Nur wenn diese erfüllt ist kann die nächste Bedingung vollständig erfüllt werden. Durch die Verwendung von if und else if, muss bei jeder "erfolgreichen" Bedingungen wieder von vorne begonnen werden, damit nicht gleich in die nächste Bedingungen gesprungen wird wenn z.B.: 2 mal lang auf einander folgt. @ Marco: Das mit den min und max Werten war die zündende Idee. Das ist haargenau das nachdem ich gesucht hatte. Da bin ich aber echt schön auf der Leitung gestanden. Vielen Dank für deine Hilfe. Juhhhuuuuuuu. Danke Danke Danke.
hallo Christkind deine "else if" werden nie ausgeführt werden. warum? wenn "else if((var1 >=5 && var1 <=12) && var_very1=1)" erfüllt sein soll, muss der teil "(var1 >=5 && var1 <=12)" auch erfüllt sein. falls dieser teil aber erfüllt ist, so führt der uC zuerst "if (var1 >=5 && var1 <=12)" aus ohne in den nachfolgenden "else if((var1 >=5 && var1 <=12) && var_very1=1)" zu gehen. und wenn der das nicht macht, wird er logischerweise auch nicht in den zweiten "else if()" gehen. -> mache eine switch()-anweisung. ist sauber, übersichtlich, und viel einfacher.
El Nino schrieb: > else if((var1 >=15 && var1 <=20)&& var2=1){ > // do something > } sorry, hatte deinen Code wohl nicht ganz zuende gelesen. Das mit der richtigen Reihenfolge lässt sich auch so lösen, wobei ich mich hier etwas wundere was die Zahlenreihenfolge angeht du fragst var1 ab und gehst davon aus das var 2 schon gesetzt ist... zählst du rückwärts ... var3...var2...var1 ???
zum Thema switch... hier noch ein link: http://www.proggen.org/doku.php?id=c:switch der passt sehr gut zu diesem Thread
Hi Marco, stimmt ein Switch wäre hier vermutlich etwas übersichtlicher. Ich werde mal versuchen meine IFs durch einen schönen Switch zu ersetzen. Danke für den Tipp.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.