Jump to content

[C#] Temperature und TemperatureIR - Durchschnitt berechnen


Recommended Posts

Hallo Zusammen,

 

ich weiß - für die Profis hier vermutlich eine 'dumme Frage' ... aber im Moment komme ich um ehrlich zu sein nicht auf die Lösung... auch, wenn sie vermutlich recht simpel ist.

 

Ich habe derzeit ein normales Temperature Bricklet, sowie ein TemperatureIR Bricklet an meinem Stapel angeschlossen.

 

Angezeigt wird im Moment die Umgebungstemperatur vom Temp.Bricklet und die ObjektTemperatur vom TempIR Bricklet via CallBack:

 

Aufruf der CallBacks

            
BrickletTemperature tmp1 = new BrickletTemperature("dD5", ipcon);
tmp1.Temperature += TemperatureCB;
tmp1.SetTemperatureCallbackPeriod(1000);

BrickletTemperatureIR tmp2 = new BrickletTemperatureIR("zY2", ipcon);
tmp2.ObjectTemperature += TemperatureIRCB;
tmp2.SetObjectTemperatureCallbackPeriod(1000);

 

Callbacks:

private void TemperatureCB(BrickletTemperature sender, short temperature)
{
    short tmpValue = temperature;
    aGauge2.Invoke(new Action(() => aGauge2.Value = tmpValue / 100));          
}

private void TemperatureIRCB(BrickletTemperatureIR sender, short temperature)
{
    short tmpIRValue = temperature;
    aGauge1.Invoke(new Action(() => aGauge1.Value = tmpIRValue / 10));
}

 

Ich möchte jetzt auch die Umgebungstemperatur vom IR Bricklet mit einbeziehen.

Klar, dafür auch einen CallBack-Aufruf machen, usw...

 

ABER: ich möchte bei:

aGauge2 gerne folgendes machen:

 

Value = ((Temperature/100)+(TemperatureIR/10)/2)

 

um mir quasi aus beiden Bricklets die Durchschnittstemperatur zu ermitteln und diese anzuzeigen.

 

Nur: mir fällt eben gerade absolut nicht ein, wie ich das aus den beiden Callbacks heraus bekomme... :-(

 

Danke und Gruß,

Chris

Link to comment
Share on other sites

Zieh die beiden short Vars raus und lege sie als private Properties innerhalb der Main ab. Dann kannst du beide Werte im jeweils anderen CB nutzen.

 

Gewöhnt Euch bitte an, den Source Code möglichst komplett im Posting zu zeigen. Macht die Fehlersuche bzw. Hinweise leichter.

Link to comment
Share on other sites

Hi, alles klar - danke.

Nur - hilf mir bitte mal kurz auf die Sprünge - wie ziehe ich sie am geschicktesten raus? Via return xyzValue; ?

 

Was den rest des Quellcodes an geht, steht da nicht viel relevantes drin.

Bisschen Aktion für Button-Clicks, und wenn sich das Programm beendet... sonst ist da noch nicht viel mehr ;)

Link to comment
Share on other sites

...

Callbacks:

private void TemperatureCB(BrickletTemperature sender, short temperature)
{
    short tmpValue = temperature;
    aGauge2.Invoke(new Action(() => aGauge2.Value = tmpValue / 100));          
}

private void TemperatureIRCB(BrickletTemperatureIR sender, short temperature)
{
    short tmpIRValue = temperature;
    aGauge1.Invoke(new Action(() => aGauge1.Value = tmpIRValue / 10));
}

...

 

warum wird denn hier tmpIRValue auf temperatur gecastet,

langt nicht

  aGauge1.Invoke(new Action(() => aGauge1.Value = temperature / 10));

?

 

 

Link to comment
Share on other sites

hm... Reicht im Grunde schon.

 

Ursprünglich war da aber noch eine weitere Ausgabe als Text - und eventuell wollte ich noch ein bisschen mehr damit machen - daher habe ich mich für eine Variable entschieden.

 

Ich glaube auch, dass das Sinnvoller ist, wenn ich z.B. die Werte wie zuvor beschrieben später in anderen Code-Teilen weiter verarbeiten möchte.

 

@NIC:

Ich bin kein Anwendungsentwickler... und meine Erfahrungen in C# sind... naja... sehr spärlich, zugegebener Maßen.

 

Für kleinere Sachen reicht es sicherlich - aber naja.

Ich versuche mich mal weiter in das Thema ein zu lesen ^^

 

Danke.

Link to comment
Share on other sites

Nein.

 

Wie gesagt, ich bin kein Anwendungsentwickler - und habe C# auch nie richtig gelernt...

Ich habe es mir aber angewöhnt, so viel wie möglich in eine Variable zu schreiben - um dann damit ggf. später auch einfacher arbeiten zu können.

 

z.B. Verwende ich mehrere Bricklets, die die Temperatur messen können.

Alle arbeiten mit "temperature"...

 

Nun wird aber jede Rückgabe in ihre eigene Variable geschrieben:

 

TemperatureBricklet -> tmp1 = temperature

TemperatureIRBricklet -> tmp2 = temperature

 

usw.

finde ich persönlich Einfacher... ^^

Aber wie bereits gesagt: Keine Gewähr, ob das schöner - oder gar "korrekter" Code ist.

Für mich funktioniert es zumindest...

Link to comment
Share on other sites

...

z.B. Verwende ich mehrere Bricklets, die die Temperatur messen können.

Alle arbeiten mit "temperature"...

 

Nun wird aber jede Rückgabe in ihre eigene Variable geschrieben:

 

TemperatureBricklet -> tmp1 = temperature

TemperatureIRBricklet -> tmp2 = temperature

...

 

dann benutz doch gleich Arrays für die Bricklets und die Values,

dann haben die "Values", hier "temperature"

die gleichen Indizes wie die Bricklets -->

Bricklets[0..n]

Temperature[0..n]

 

oder ggf. eine eigene Class definieren,

somit hast Du dann dein Bricklet mit seinen Eigenschaften

in einer Klasse untergebracht - wenn dann die Klassen eindeutig benannt werden,

ist der Code auch besser lesbar.

Link to comment
Share on other sites

Für "einfache" Sachen wie Auslesen und in einem Textfeld ausgeben

reicht Dein Code allemal,

wenn's aber dann doch mal mehr wird, sollte man sich überlegen, wie man

a) den Datenerhalt

b) die Datenausgabe - welche von a) getrennt sein sollte

bewerkstelligt.

Daher mein Hinweis mit den Arrays oder den Klassen - wenn man sich mal dran gewöhnt hat, wird vieles leichter, weil dadurch der Code übersichtlicher wird.

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...