PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD Balkenanzeige - Rückwärtslaufend ?? Wie?



m@rkus33
15.12.2005, 13:53
Hallo Zusammen,

ich bin ein absoluter Neueinsteiger in der AVR- Bascom Thematik. Ich sitze seit zwei Tagen und büffel Tutorials und Hilfedateien. Seit gestern durchforste ich auch schon hier das Forum.

Was habe ich vor?

Ich möchte eine Tankuhr mit Telemetrie für Modellflugzeuge realisieren. Als Hardware ein Flowmeter, einen Mega8, ein 433 Mhz Sendemodul. Am Boden ein 433 Mhz Empfänger ein Mega8 und ein 20x4 Display.

Was habe ich schon?
Auswertung Flowmeter mit Counter und ext. Interupt, Übertragung der Daten (Zählerstand) mit Manchester, Decodierung und Auswertung Zählerstand am Boden im Display mit Numerischen Zeichen.

Soweit habe ich mich schon durchgeackert. ](*,)

Jetzt meine Frage:

Wie in Gottes namen schaffe ich bei der Tankanzeige am Boden im Display bei vollem Tank eine durchgängige Balkenanzeige (also alle 20 Stellen schwarz) das bei jedem bestimmten Zählerstand X einen Balken von links nach rechts löscht? Habe echt keine Idee das in einem kurzen Code zu realisieren. :(

Kann mir jemand von Euch eine "Initialzündung" geben.

Danke

Gruß
Markus

Ratber
15.12.2005, 14:52
Um es mal zusammenzufassen:

1.
Du willst in der untersten Zeile des 4x20 LCD's einen Füllstandsbalken über alle 2 Stellen realisieren der von links nach Rechts weniger wird.

2.
Den Füllstand hast du in form eines Zahlenwertes vorliegen.


3.
Es geht also nur noch darum diesen Zahlenwert in den unter 1. angegebenen Balgen fürs LCD umzuwandeln.


Ist das soweit richtig ?

m@rkus33
15.12.2005, 14:58
Hallo Ratber,

genauso ist es! Hast Du da schon eine Idee?

Gruß
Markus

Ratber
15.12.2005, 15:20
Yo,ist im Grunde nicht kompliziert.
Mehr ne Fleißarbeit in Sachen effektive Programierung.

Was ich brauche ist der Zählbereich also bis wohin du Zählst.

0-100
0-128
0-32
0-10000
.....usw.

Ich nehme mal als Beispiel die 100 für 0-100 Prozent.

Jetzt Teile ich 20 (20 Segmente) durch 100 und erhalte 0.2
Das Multipliziere ich mitr dem errechneten Zählerstand und nehme die Ganzzahl (Altrnativ auch Rundung.Wie es beliebt).
Natürlich könnte man die auflösung noch erhöhren indem man Selbst definierte Zeichen nutzt.
Damit könnten wir jedes Segment nochmal mit zb. 5 Weiteren Stufungen darstellen was die Auflösung dann von 1/20 (5%) auf 1/100 (1%) erhöhen würde.
Aber stellen wir das mal hinten an.


Nehmen wir mal an der Füllstand ist Momentan 62.
Dann wären das 0.2*62=12.4 also 12
Das ist die Zahl der Segmente die Aufleuchten oder sichtbar sind.

Jetzt müssen wir nurnoch den Balken zusammenbauen und an das LCD schicken.

Jetzt frag ich mal ob du mir noch folgen kannst und ob das verständlich war ?

m@rkus33
15.12.2005, 15:28
Hallo Ratber,

jo ist mir völlig klar - bis hier kann ich absolut folgen. Hmm... bis jetzt eigentlich ganz einfach - voll den Knoten im Hirn wg. neuer Materie

Gruß
Markus

Ratber
15.12.2005, 16:13
Gut dann kommt das Finale.

Wir haben die Zahl der Balken die wir anzeigen wollen.
Damit bauen wir die Zeile auf die wir dann ans Display schicken.
Da wir einen fetten schwarzen Balken haben wollen (Die Lücken zwischen den Zeichen im Display bleiben aber) müssen wir ein Zeichen haben das alle Pixel ausfüllt.

Jetzt bin ich echt überfragt ob im Standardzeichensatz des LCD's ein passendes Zeichen ist.
Macht nix,im Zweifelsfalle kann man sich ja bis zu 8 Zeichen selber definieren (zb. Mit dem in Bascom eingebauten LCD-Designer.Für weitere Informationen Siehe Handbuch oder Hilfe).

Ja und der Rest ist eigentlich nur ne Schleife.

Wir zählen von 20 bis 20-x herunter um eben die Anzahl von Zeichen zu setzen.
In unserem Beispile war das die 12.
Also würde der Ausschnitt so aussehen können:




Y=21-X '21-12=9 Erklärung eins weiter runter.
For Z=20 to y Step -1 'Von 20 bis 9 wird gezählt ,das sind 12 Stellen.
Locate 2,Z 'Die entsprechende Position im Display anwählen.
Lcd Chr(0) 'Zeichen Darstellen.Chr(0-7) wären zb.die Selbstdefinierten Zeichen
Next.
Y=Y-1 'Eins runter für die nächste Schleife.
for Z=Y to 1 Step 'Damit fahren wir den Rest der Zeile ab
Locate2.Z
Lcd Chr(32) 'Leerzeichen setzen
Next



Fertig.(Sofern ich keine groben flüchtigkeitsfehler gemacht habe)


Naja,zugegeben ,das war jetzt ultraprimitiv und ohne Komfort aber leichter zu verstehen.
Das ganze geht auch in einer Schleife mit If-Thenabfrage für das Zeichen.
Auch kann man das Pferd auch ganz anders Reiten indem man erst einen String erstellt und dann ausgibt.

Ich hab nur eine Möglichkeit von vielen gezeigt.

Kannste damit den was anfangen ?

m@rkus33
15.12.2005, 17:52
Hallo Ratber SUPER DANKE!!!

ahh jetzt ist mir die Logik der Darstellung klar geworden. Super vielen Dank. Mit der Ausgangssituation kann ich echt was anfangen und das Basteln anfangen!

Vielen vielen Dank

Gruß
Markus

Ratber
15.12.2005, 18:09
Yo,kein Problem.

scream!!!!
22.12.2005, 15:23
HI,

kann man dieses Problem nicht auch mit dem "SELECT CASE" befehl verwirklichen.

Ich meine, wenn du eine variable für deinen Füllstand hast und zum Beispiel deine Anzeige aus acht Balken bestehen soll, kann man doch acht bereiche festlegen. Dann liesst man die Variable aus und spring einfach in den Bereich und zeigt dementsprechend was an.

Aus der Bascomhilfe habe ich mal das Musterprogramm kopiert und geändert. Mit dem LCD disigner oder dem Datenblatt der Anzeige, kann man dann bestimmt anstatt der Rautezeichen einen kasten anzeigen lassen.


Dim X As Byte

Do
Input "X ? " , X
Select Case X
Case 1 To 3 : Lcd "##'
Case 4 ti 6 : Lcd "'###"
Case Is > 10 : Lcd "####"
Case Else : Print "no"
End Select
Loop

End

Ratber
22.12.2005, 15:46
Ich sagte ja das es etliche Möglichkeiten gibt das zu realisieren.
Mir war es wichtig das Markus das auch gedanklich nachvollziehen kann.
Deswegen hab ich es lesbar gestalltet.

Klar,deine Lösung geht natürlich auch.
Aber bei 20 Segmenten muß ich auch 20 Casebedingungen einfügen.
Da kommt der Faktor Platz wieder ins Spiel (Keine Ahnung was jetzt größer ist.Müßte man mal ausprobieren) und der Umstand das eine anpassung zb. auf 40 Segmente dann in Arbeit ausartet.

Ich brauche dafür nur zwei Werte zu ändern
Y=Sgemente+1-x
und die erste For/Netxt Schleife.

Natürlich kann man die Segmentzahl auch noch Automatisieren dann ist es nurnoch ein einzelner Wert.


Was das Zeichen betrifft so habe ich ja schon "Lcd Chr(0)" angegeben was dem ersten selbstdefinierten Zeichen im LCD entspricht.
Das muß man natürlich noch erstellen.
Also wie bekannt:

DEFLCDCHAR char,r1,r2,r3,r4,r5,r6,r7,r8 oder mit dem Designer erstellen und übernehmen.

m@rkus33
22.12.2005, 17:01
Hi Ratber,

also das mit Deinem Beispiel ist echt super. Genau das Problem war ja mit nur einer Variablen den ganzen Balken zu steuern. Ich hab das auch nun soweit ausgebaut das ich das selbe Prinzip als Feldstärkenanzeige mit Integriert habe. Läuft einwandfrei.

Gruß
Markus

Ratber
22.12.2005, 20:27
Wenn es dir gefällt freue ich mich.

Ich hatte noch eine Erweiterung zur Auflösung im Ärmel.

Das Prinzip:

Ich kann ja bei jedem Standarddisplay 8 Zeichen definieren.
Da die meisten eine 5x7 Matrix pro Zeichen haben könnte man also 5 Zeichen erstellen die aus 1-5 Spalten bestehen.
Dh. man kann die Optische Auflösung nochmal um den Faktor 5 erweitern.
Bei einem 20 Zeichen-Display entspräche das einer auflösung von 100 Pixeln.
Man muß also nur für die jeweils letzte Stelle des Balkens das passende Zeichen einsetzen.
Ob das dann noch ablesbar oder Sinvoll ist hängt natürlich vom Display und den Wünschen ab.

Natürlich lassen sich so auch Senkrechte Balken mit akzeptabler auflösung gestallten.
Bei einem 4 Zeiligem Dipslay immerhin eine auflösung von 4x7=28 Pixeln also Stufen von ca.3.6 Prozent.
Das wäre sogar einwenig genauer als die jetzigen 20 Blöcke Horizontal aber vorallendingen wesentlich Platzsparender.
Statt 20 braucht man nur 2 Zeichen.

Naja,alles nur Vorschläge :mrgreen:

m@rkus33
22.12.2005, 21:32
Danke Ratber,

das mit der Auflösung habe ich schon ausprobiert :-). Ich habe einfach die Blöcke mal testweise "geteilt". Das Ding kommt später auf eine Fernsteuerung und ist eine Tankanzeige für Jet- Modelle. Da hat man nicht viel Zeit woanders hinzugucken. Die "grobe" Auflösung ist sogar besser. Optischehirnumsetzung ist (bei mir zumindest) mit dem von links nach recht kleiner werdenden Balken am besten. Das erkennt man wirklich sofort beim "Vorbeischauen". Ich hab mal ein paar Bilder der fertigen Visualisierung gemacht.

Gruß
Markus

Ratber
22.12.2005, 22:02
Yo,bei Jetmodellen machts sinn.
Die sind ja ohne Sprit meist aufgeschmissen.
Mir reichts ja schon wennes Böötchen still wird.
Natürlich mitten im See versteht sich. :D

Sieht ja schon gut aus.
Schon über ne Warneinrichtung nachgedacht ? (Blinkender Messbalken,Piezosummer.......)
Wenn der Verbrauch relativ gleichmäßig ist könnte ich mir auch ne Restflugzeitanzeige vorstellen.

Oder bin ich da längst zuspät ? :wink:



Edit:
Fällt mir erst jetzt auf.

Wolltest du den Balken nicht ursprünglich andersrum haben ? :-k

m@rkus33
22.12.2005, 22:17
Hi Ratber,

jep schon zu spät. Das ding ist "nur" die Bodenstation. Bei der Warnschwelle piept es gewaltig. Der Piezo ist schon drin. Nur über die Melodie muss ich nochmal nachdenken. Die gefällt mir noch nicht.
Die Daten für die Feldstärkenanzeige unten rechts kommen vom Funkmodul. Über eine Restflugzeit habe ich mir auch schon Gedanken gemacht. Leider saufen unsere Turbinen je nach Gasstellung sehr unterschiedlich den Sprit weg. Das geht von 25ml/min bis 500ml/min und nicht linear. Der Verbrauch ist von zig Faktoren abhängig eine "Hochrechnung" wäre mir da zu kompliziert zu realisieren. Wichtig war mir nur zu sehen was an "Saft" noch übrig ist. Ob noch eine Runde geht oder doch lieber gleich die Landeklappen rausfahren.

Das Teil bekommt vom "Sender" oben im Flieger die Daten mit 433Mhz "telemetriert". Also auch die Spannung vom Empfängerakku. Zus. werden bei der Warnmeldung auch noch ein R/C- Kanal und ein Schaltkanal aktiviert. So kann z.B. das Fahrwerk mit ausgefahren werden und alles an Blinklichter aktivieren was nur irgendwie geht. Falls mal die Funkstrecke net so will ist ein "Backup" der Warnmeldung im Flieger.

Unsere Jet-Modelle haben ohne Antrieb einen Gleitwinkel eines Ziegelsteins und kommen wie ne Gleitbombe runter. Wenn da oben der Sprit alle ist, wird es meistens recht teuer.

Gruß
Markus

Ratber
22.12.2005, 22:52
Über eine Restflugzeit habe ich mir auch schon Gedanken gemacht. Leider saufen unsere Turbinen je nach Gasstellung sehr unterschiedlich den Sprit weg. Das geht von 25ml/min bis 500ml/min und nicht linear. Der Verbrauch ist von zig Faktoren abhängig eine "Hochrechnung" wäre mir da zu kompliziert zu realisieren.

Naja,eigentlich nicht ganz so kompliziert.
einfach brutal über die verstrichene Zeit Rechnen.
Ein ungefährer Wert ist immernoch besser als garkeiner.
Optional kann man ja über die letzten 10 Minuten rechnen.



Unsere Jet-Modelle haben ohne Antrieb einen Gleitwinkel eines Ziegelsteins und kommen wie ne Gleitbombe runter. Wenn da oben der Sprit alle ist, wird es meistens recht teuer.

Yo,kenn ich.
Leider vergisst man ja mit der Zeit das Kontrollieren und wennes plötzlich ruhig wird isses schon Teuer geworden *gg*


Nur über die Melodie muss ich nochmal nachdenken. Die gefällt mir noch nicht.

Wie wärs mit ELO "Bring me Down" ? :D