PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Diagrammkurve korrekt darstellen



Felix H.
03.06.2009, 18:43
Hi,

ich habe vor an meine jetzige Zimmersteuerung noch ein Diagramm zu machen über den modulstrom meiner solaranlage über den ganzen Tag aufgenommen. So lese ich die Daten über meinen ADC ein. Das klappt auch wunderbar. Jetzt habe ich eingestellt, dass er alle 15 minuten diesen wert nehmen soll und in einer extra variable abspeichert. Wenn ich in das Menu des Diagramms gehe soll es dargestellt werden.

hier nun die entsprechenden Ausschnitte aus dem Programm:


Modulstrom = Getadc(6)
Modulstrom2 = Modulstrom * 30
Modulstrom2 = Modulstrom2 / 1024

Modulstrom ist hierbei eine integer, modulstrom2 eine single. Den wert bekomme ich einem anderen Menu passend angezeigt.


anschließend einer der vielen Bauteile mit denen der aktuelle wert gespeichert wird:


If _hour = 7 And _min = 0 and _sec = 0 Then
Modulstrom2 = Modulstrom2 * 5
Modulstrom7uhr = 110 - Modulstrom2
Else
End If


Mein Diagramm fängt bei pixel 110 in y richtung an. Deswegen wird die variable modulstrom7uhr auf den wert 110 als erstes geschrieben. Anschließend ziehe ich von den 110 den aktuellen Wert, multipliziert mit 5, ab.

Dadurch wird die y richtung kleiner, sprich mein entsprechender balken oder was ich verwende müsste im display mit größer werdendem ADC Input nach oben gehen. Modulstrom7uhr ist übrigens eine integer.



Zum ausgeben verwende ich den line befehl.

Line(14 , Modulstrom7uhr) -(18 , Modulstrom7uhr15) , 255
Line(18 , Modulstrom7uhr15) -(22 , Modulstrom7uhr30) , 255

usw.

Sobald ich aber nun eine zahl einlese während der entsprechenden uhrzeit, gehen die striche nach unten aus dem display raus?!?! und oben am ende aller linien in x richtung kommt die linie scheinbar in form von @-zeichen wieder rein und geht bis in die mitte. Je nach größe im ADC mal mehr mal weniger. Hab ich irgendwo einen denkfehler drin oder vertragen sich die vielen verschiedenen variablen nicht? wenn ich am anfang des programms z.b. die "modulstrom7uhr" variable und auch die anderen mit einem festen wert progge, funzt das diagramm prima.

hilfe! =P

for_ro
03.06.2009, 19:01
Du musst immer vorsichtig sein, wenn du Berechnungen und Typumwandlungen in einen Befehl bringst. Z.B. hier
Modulstrom2 = Modulstrom * 30 und hier
Modulstrom7uhr = 110 - Modulstrom2

Deine Y-Werte auf dem Display können doch bestimmt nur Byte Werte annehmen, also 0-255. Dann nimm auch keine Integer.

Das hier
If _hour = 7 And _min = 0 and _sec = 0 Then
Modulstrom2 = Modulstrom2 * 5
Modulstrom7uhr = 110 - Modulstrom2
Else
End If

sieht mir so aus, als ob du für jeden 15-Minuten Wert eine Variable hast. Das geht mit Arrays viel einfacher und kompakter. Hast du mit Arrays schon mal gearbeitet?

Gruß

Rolf

Felix H.
03.06.2009, 19:15
hi,

ich habe in der Tat für jede zeit (insgesamt 48 ) eine eigenen Variable. Arrays habe ich mir ehrlich gesagt noch nicht angeschaut.

Modulstrom2 = Modulstrom * 30 funktioniert, da dieser wert wo anders ausgegeben wird, der passt.

Bei den anderen bin ich mir wie gesagt unsicher.

for_ro
03.06.2009, 20:32
Es mag zwar lästig zu schreiben sein, aber ich würde dies
Modulstrom2 = Modulstrom * 30
grundsätzlich immer so schreiben

Modulstrom2 = Modulstrom
Modulstrom2 = Modulstrom2 * 30

um die Typwandlung und die Berechnung zu trennen. Es können sonst die tollsten Effekte auftreten.


Array funktionieren so:

Dim Modulstrom_array(48) as byte

Dies erzeugt dir 48 Werte vom Type Byte, die hintereinander im SRAM liegen.
Mit Modulstrom_array(1) sprichst du den ersten Wert, mit Modulstrom_array(2) den zweiten Wert usw. an.
Wenn du jetzt genau zu den glatten 1/4-Stunden abspeichern willst, kannst du das so machen:


If _sec = 0 Then 'nur zu vollen Minute prüfen
Viertel = _min Mod 15
If Viertel = 0 Then 'nur wenn Minute glatt durch 15 teilbar
Viertel = _hour * 60 '
Viertel = Viertel + _min 'dies berechnet die wievielte Minute am Tag ist
Viertel = Viertel / 15 'dies berechnet die wievielte Viertelstunde am Tag ist
Viertel = Viertel + 1 'um 0.00 Uhr käme 0 heraus, Array Indexe beginnen aber bei 1
Modulstrom_array(viertel) = Modulstrom 'aktuellen Wert von Modulstrom in Array an der entsprechenden Stelle abspeichern
End If
End If

Anzeigen kannst du das ganze Diagramm mit einer kleinen Schleife:

Offset = 0 'oder einen anderen Wert, wenn du nicht beim ersten Pixel ganz links anfängst
I = 1
Do
X1 = I + Offset
X2 = X1 + 4 'du gehst immer 4 Pixel weiter, richtig?
Y1 = Modulstrom_array(i) 'dies ist der Anfangspunkt der Linie
Incr I 'nächstes Array Element
Y2 = Modulstrom_array(i) 'dies ist dann der Endpunkt der Linie
Line(x1 , Y1) -(x2 , Y2) , 255
Loop Until I = 48

Fertig.


Edit: Ich habe noch einen Fehler behoben (das geht nicht: If _min Mod 15 = 0 Then...)

Gruß

Rolf

Felix H.
07.06.2009, 21:42
hi,

danke erstmal. ich werde das mal testen.

Gruß