Forum: Mikrocontroller und Digitale Elektronik AVR Wecker Stellen


von Stefan B. (derkandesbunzler)


Lesenswert?

Hallo,
ich will mir einen Wecker programmieren der durch die Tasten auf dem 
SainSmart Keypad Shield gestellt werden können soll. Tasten einlesen 
funktioniert ohne Probleme, auch das erstmalige Stellen ist kein 
Problem. Ich will aber erst die Stunde einstellen, per Knopfdruck auf 
die Minuten wechseln und dann eventuell per nochmaligen Knopfdruck 
wieder auf die Stunden usw. falls etwas falsch eingestellt wurde.
Meine "Wechselfunktion" sieht folgendermaßen aus:(Und sry, ich checke 
nicht ganz wie das Code formatieren funktioniert)
1
 if(wecker_einstellung_stunde==true &&wecker_einstellung_minute==false && (key_10ms=='2' || key_10ms=='5'))
2
3
{
4
      wecker_einstellung_stunde=false;
5
      wecker_einstellung_minute=true;
6
}
7
      
8
9
if(wecker_einstellung_minute==true && wecker_einstellung_stunde ==false &&(key_10ms=='2' || key_10ms=='5'))
10
11
{
12
      wecker_einstellung_minute=false;
13
      wecker_einstellung_stunde=true;
14
}

Ich denke, das meiste ist selbsterklärend. Es geschieht alles in einer 
10ms Zeitscheibe. Die gedrückte Taste wird in key_10ms gespeichert.
Wenn wecker_einstellung_stunde true ist, soll man die Stunde einstellen 
können.
Wenn wecker_einstellung_minute true ist, soll man die Minute einstellen 
können.
Mit den Tasten 2 und 5 soll gewechselt werden.
Wenn jetzt aber wecker_einstellung_stunde true ist und ich 
beispielsweise die 5 drücke, dann wird die if-Abfrage ausgeführt. Das 
löst aber gleichzeitig die zweite If-Abfrage aus, da deren Bedingungen 
ja in der ersten Abfrage gesetzt werden und ich lande wieder in der 
Stundeneinstellung.
Ich weiß nicht wie ich das beheben soll.
Ich hoffe ich habe es nicht zu kompliziert erklärt und man kann mir 
helfen :)

: Verschoben durch Moderator
von Klaus W. (mfgkw)


Lesenswert?

Stefan B. schrieb:
> Ich denke, das meiste ist selbsterklärend.

Ich denke nicht.

Stefan B. schrieb:
> if-Schleife

Endlich mal wieder eine Flasche Sekt aufmachen!
Mit if-Schleife lockt man immer wieder jemanden raus hier.

Stefan B. schrieb:
> (Und sry, ich checke
> nicht ganz wie das Code formatieren funktioniert)

Dann fang doch mal damit an?

von Stefan B. (derkandesbunzler)


Lesenswert?

Klaus W. schrieb:
> Dann fang doch mal damit an?

Erledigt...

Klaus W. schrieb:
> Endlich mal wieder eine Flasche Sekt aufmachen!
> Mit if-Schleife lockt man immer wieder jemanden raus hier.

Willst du mir damit sagen, dass man if eig. nicht nimmt? Ok, falls das 
jmd stört, es tut mir Leid ich weiß es aber nicht besser da ich ein 
ziemlicher Anfänger in dem Gebiet bin...

Klaus W. schrieb:
> Ich denke nicht.

Was nicht?

von Thomas W. (Gast)


Lesenswert?

Stefan B. schrieb:
> Klaus W. schrieb:
>> Endlich mal wieder eine Flasche Sekt aufmachen!
>> Mit if-Schleife lockt man immer wieder jemanden raus hier.
>
> Willst du mir damit sagen, dass man if eig. nicht nimmt? Ok, falls das
> jmd stört, es tut mir Leid ich weiß es aber nicht besser da ich ein
> ziemlicher Anfänger in dem Gebiet bin...

http://if-schleife.de/

Gruesse

Th.

von Stefan B. (derkandesbunzler)


Lesenswert?

Ok, wurde behoben... In Zukunft überlege ich es mir ob ich im Forum nach 
Hilfe fragen soll... Man weiß doch ganz genau was mit if-Schleife 
gemeint ist... Das ist einfach nur absolut kindisch... Aber ich werde es 
mir merken.

von Klaus W. (mfgkw)


Lesenswert?

o, danke.

Wirklich verstanden habe ich es vielleicht nicht.


Aber fehlt dir einfach ein else vor dem zweiten if?
Also in der Art:
1
    if( erste Bedingung... )
2
    {
3
        ....
4
    }
5
    else if( zweite Bedingung... )
6
    {
7
        ....
8
    }

Dann wird nur der erste Teil ausgeführt, wenn seine Bedingung passt.

Falls das nicht das Problem ist, wäre mehr Quelltext vielleicht 
hilfreich. Dann sieht man eher, was du treibst.


Und dann: warum hast du zwei bool für die Unterscheidung, was gerade 
eingestellt wird?
Wenn eine true ist, ist die andere automatisch false. Da würde ich nur 
eine nehmen, und statt der zweiten bspw. einfach immer !dieerste 
schreiben.

: Bearbeitet durch User
von Klaus W. (mfgkw)


Lesenswert?

Stefan B. schrieb:
> In Zukunft überlege ich es mir ob ich im Forum nach
> Hilfe fragen soll... Man weiß doch ganz genau was mit if-Schleife
> gemeint ist... Das ist einfach nur absolut kindisch... Aber ich werde es
> mir merken.

Kein Grund für Bluthochdruck...

Wenn du dich ins Internet traust, darfst du nicht so zimperlich sein :-)
Sieh es als Bereicherung: wenn du in Zukunfst nicht mehr von einer 
if-Schleife redest, wirst du eher ernst genommen.

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Stefan B. schrieb:
> Man weiß doch ganz genau was mit if-Schleife gemeint ist...
nicht jeder und deswegen die Antwort zum Lernen!

> Das ist einfach nur absolut kindisch...

zu schmollen statt anzunehmen, nennt sich Hilfe zur Selbsthilfe
So deutlich herausgestellt merkt man sich das eben leichter weil es 
peinlich ist!

Stefan B. schrieb:
> In Zukunft überlege ich es mir ob ich im Forum nach
> Hilfe fragen soll...

warum? Magst du nichts dazulernen?
War ja nicht unbedingt böse gemeint und dazulernen kann jeder, der Eine 
leicht der Andere schwer und manche brauchen deutliche Worte!

von Stefan B. (derkandesbunzler)


Lesenswert?

Klaus W. schrieb:
> Aber fehlt dir einfach ein else vor dem zweiten if?

Oh gott, ja das ist das Problem... Jetzt funktioniert es, das else muss 
ich bei meinem ganzen Rumprobieren(ich hab mich erst bei meinen ganzen 
Unterscheidungen selbst nicht mehr ausgekannt :) ) aus Versehen entfernt 
haben. Und dafür hab ich jetzt 2 Stunden verbraucht... Danke für deine 
Hilfe.
Ach ja, die ganzen Unterscheidungen sind dafür gut, dass ich genau weiß 
was gerade passieren soll, es ist für mich übersichtlicher als bei nur 
einer Unterscheidung (hört sich komisch an, ist aber so).

Klaus W. schrieb:
> Wenn du dich ins Internet traust, darfst du nicht so zimperlich sein :-)

Ok, wenn ich aber die ganze Zeit an so nem Problem rumtüfftle, das aus 
obigem Grund nicht gelöst bekomme und mich dann erstmal jmd auf so eine 
Kleinigkeit hinweist anstatt mir zu helfen, dann reagiere ich vielleicht 
etwas gereizt wenn du verstehst was ich meine ;)

von Klaus W. (mfgkw)


Lesenswert?

Stefan B. schrieb:
> Ach ja, die ganzen Unterscheidungen sind dafür gut, dass ich genau weiß
> was gerade passieren soll, es ist für mich übersichtlicher als bei nur
> einer Unterscheidung (hört sich komisch an, ist aber so).

Dir muss es gefallen, und du musst dich darin zurechtfinden.

Stefan B. schrieb:
> das else muss
> ich bei meinem ganzen Rumprobieren(ich hab mich erst bei meinen ganzen
> Unterscheidungen selbst nicht mehr ausgekannt :) ) aus Versehen entfernt
> haben. Und dafür hab ich jetzt 2 Stunden verbraucht...

Weniger überflüssige Variablen würden die Übersicht erhöhen :-)


Deshalb nochmal (musst es ja nicht annehmen) die Idee im Sinne der 
Lesbarkeit:
Nur eine bool, die ist genau dann true, wenn meinetwegen gerade Stunden 
eingestellt werden können, und false, wenn es gerade um die Minuten 
geht.
Dein gesamter Code oben reduziert sich dann auf:
1
    if( key_10ms=='2' || key_10ms=='5' )
2
    {
3
        aktuellerModusIstStunde = !aktuellerModusIstStunde;
4
    }

Weniger zu lesen, und weniger Möglichkeiten einen Fehler zu machen.

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

1
if((key_10ms=='2' || key_10ms=='5') && (wecker_einstellung_stunde != wecker_einstellung_minute))
2
{
3
    wecker_einstellung_minute=wecker_einstellung_stunde;
4
    wecker_einstellung_stunde=!wecker_einstellung_stunde;
5
}

: Bearbeitet durch User
von Klaus W. (mfgkw)


Lesenswert?

Dennis H. schrieb:
> (wecker_einstellung_stunde != wecker_einstellung_minute)

Das ist doch immer true?

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
Noch kein Account? Hier anmelden.