Go Down

Topic: Probleme mit Programmcode für Türschloßprojekt (Read 2 times) previous topic - next topic

Tobias93

hy,
ich möchte nochmal ganz kurz auf den Code von mir zu sprechen kommen und nicht auf deinen neuen, weil er mir kompliziert vorkommt und ich ihn nicht richtig verstehe. Bei meinem Code ist es ja so das die Eingabe die vom Keypad zurück kommt in einem Array gespeichert wird:

Quote
Eingabe[stelle] = myKey;


Entschieden ob man bzw. was man in das Array speichern soll geschieht mit der if - Abfrage:

Quote
if (myKey != KEY_NOT_PRESSED)


Kann man nun auch in der Library den Rückgabewert für z.B. # auf 10 setzen und * auf 11 und dann in einer if Abfrage sagen das wenn

myKey!= KEY_NOT_PRESSED && myKEY!= 10 && myKEY!= 11 ist das er dann ganz normal in das Array Eingabe speichern soll. Ist die Eingabe jedoch 11 oder 10 dann soll er diesen Wert in ein anderes Array was diese beiden Zahlen aufnehmen kann speichern und diesen Wert dann in int umwandeln um damit zu arbeiten? Wäre das vielleicht einfacher? Ich versuche das Problem schon eine ganze Weile auf diese Art zu lösen weil ich die vielen Lösungsvorschläge hier nur sehr bedingt (wenn überhaupt) verstehe. Ich suche ja nicht die high end Lösung sondern auch eine die ich verstehe.
Können wir vielleicht an dem Lösungsvorschlag von mir weiterarbeiten und deinen Vorschlag michael_x erstmal rauslassen?

Vielen Dank für eure Unterstützung,
Tobi
Nobody is perfect but - impossible is nothing

michael_x

Klar, das mit dem switch und der Zusatz-Variable, ob gerade Daten-Eingabe erfolgt oder nicht, kannst du gerne weglassen.
Auch, ob du die gesamte Zahlencode-Eingabe gleich als Zahl, oder erstmal als char[] speicherst um hinterher atoi aufzurufen, ist Geschmackssache.

Das Haupt-Problem ist, dass # und * nicht in der Variable Eingabe landen, da hast du Recht und vermeidest es ja auch.

Code: [Select]
if (myKey!= KEY_NOT_PRESSED && myKEY!= KEY_STAR && myKEY!= KEY_HASH)
ist auch nur eine Schönheitsfrage, die aussen vor lässt, wie die drei #defines nun tatsächlich definiert sind.

Frage ist also, was willst du im else-Zweig dieses if machen ...
-> KEY_NOT_PRESSED : gar nichts
    KEY_STAR        : ?
    KEY_HASH        : ?

Arduinokiller

Quote
wie Arduinokiller einmal einen Stern als 42 kriegen kann ist mir klar. Merkwürdig ist mir, wie er aber aus  "*10" eine "4210" (statt z.B. "424948" , weil eine '1' hat den ASCII-wert 49 (0x31)  genauso wie '*' den Wert 42 hat.

Sorry, der Sketch hat mir einmal "42100035" (*1000#) angezeigt, warum auch immer. Bei weitern Versuchen und Änderungen im Sketch bekam ich meisten eine Summe angezeigt z.B. "270" (egal ob ich *1000# oder *0001# eingegeben habe).

michael_x

#23
Nov 18, 2012, 08:41 pm Last Edit: Nov 18, 2012, 08:45 pm by michael_x Reason: 1
Quote
Bei weitern Versuchen und Änderungen im Sketch bekam ich meisten eine Summe angezeigt z.B. "270" (egal ob ich *1000# oder *0001# eingegeben habe).

Um einen Text mit atoi() in eine Zahl umwandeln zu können, dürfen natürlich keine nicht-Ziffern ( # * )  drin sein. Das hat der Original-Sketch, den Tobias anfangs gepostet hat, aber gemacht. Diese Zeichen gleich abzufangen und nach Bedarf darauf zu reagieren, ist wohl z.Zt. die Aufgabe.

Bzw. genau zu definieren, was bei * oder # passieren soll.
Als beliebig mögliche Teile des Schlüssels würde ich sie nicht zulassen, eher als fest definierte Anfangs- und Endezeichen

Quote from: Tobias
Ist die Eingabe jedoch 11 oder 10 dann soll er diesen Wert in ein anderes Array was diese beiden Zahlen aufnehmen kann speichern und diesen Wert dann in int umwandeln um damit zu arbeiten? Wäre das vielleicht einfacher?

Das klingt mir eher kompliziert: - Warum erst in ein anderes Array speichern? Warum in eine Zahl wandeln? ( In welche ? ) Wenn der zu überprüfende Schlüssel eine Zahl ist, warum dann diese Zahl nicht mit den Zifferntasten eingeben?

Evtl. zur Verwirrung: Wenn der gesuchte Schlüssel z.B.   #12*#098 sein soll, dann würde ich das ganze Umwandeln in eine Zahl lassen, den hinterlegten CODE als char[] definieren und so prüfen. Der Benutzer hat dann aber keine Möglichkeit einen Versuch abzubrechen und neu anzufangen. Man müsste also solange tippen bis "Falsche Eingabe" kommt und ab dann seinen neuen Versuch starten.
Wie wird dann ein neuer Code definiert? Verstehe ich deinen alten Vorschlag jetzt erst?
Das Ergebnis einer Schlüsselprüfung soll statt nur ( richtig / falsch ) besser ( richtig / Menü:ändern / falsch ) sein ?   

Evtl. zu weiteren Verwirrung : statt die Tasten als entweder Dezimalzahl oder als KeineZahl zu unterscheiden, könnte man sie auch als HexadezimalZiffern interpretieren . Der gesuchte Schlüssel  z.B.   #12*#098 wäre dann als long CODE = 0xA12BA098; gespeichert.
Auch eine schöne Zahl.

circuit's Umrechnung ginge dann fast genauso, mit
  Eingabe = Eingabe*16+myKey;

Kann sein, dass ich dich die ganze Zeit nicht verstanden hab (verstehen wollte), weil mir das " # ist Sonderfall " so fest im Hirn saß.

Tobias93

schön das wir uns jetzt alle verstehen.
Eine konkrete Frage:
kann mir jemand meinen Code, sowohl Library als auch Sketch so umschreiben das man mit den  Zahlen von 0 bis 9 und auch mit den Zeichen * und # weiter arbeiten kann ? Aktuell habe ich den Sketch so geändert das ich als Rückgabewerte für * und # 10 und 11 verwende. Dennoch klappt es nicht einfach zu sagen:

If (myKey = 10)
{
...
}

ich weiß nicht woran es liegt, vermute aber das es immernoch mit der Umwandlung von char in int zusammenhängt. Und das ist der Teil den ich nicht verstehe.

Danke für eure Hilfe,

Tobi
Nobody is perfect but - impossible is nothing

Go Up