Forum: PC-Programmierung C# Temp werte als label anzeigen


von DAVID B. (bastler-david)


Lesenswert?

Hallo
Ich möchte Temperatur Sensoren mittels Arduino nano an den PC senden und 
in einer C# form als Label einzeln angezeigt bekommen.

Die Werte der Sensoren sendet mir der Arduino schon mal am PC und kann 
es mit einer richtextbox auch angezeigt bekommen das geht auch schon 
jetzt muss ich es nur noch auf die Label verteilt bekommen.

Der arduino sendet ein paket was im klar Text dann so aussieht:
Temp 1 xx C°
Temp 2 xx C°
Temp 3 xx C°

Label 1 soll mir Temp 1 anzeigen
Label 2 soll temp 2 anzeigen
und Label 3 die 3 halt.

Ich bekomme es aber nur ihn das mir ein Label alle Zeilen anzeigt 
einzelne Zeilen wollen noch nicht.
So langsam weis ich nicht mehr nach was ich suchen soll.
Habe es zuletzt mit:

label1.Text = richTextBox1.Lines(1);

versucht da bekomme ich die Meldung das es nicht als Methode verwendet 
werden kann.
Wäre super wenn jemand eine idee dazu hätte.
Mein derzeitiger Versuchs code ist:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Text;
using System.Windows.Forms;

namespace Temp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            serialPort1.BaudRate = 9600;
            serialPort1.PortName = "COM3";
            serialPort1.Open();
            serialPort1.DataReceived += serialPort1_DataReceived;
        }

        private void serialPort1_DataReceived(object sender, 
SerialDataReceivedEventArgs e)
        {
            string line = serialPort1.ReadLine();
            this.BeginInvoke(new LineReceivedEvent(LineReceived), line);
        }

        private delegate void LineReceivedEvent(string line);

        private void LineReceived(string line)
        {
            richTextBox1.Text += line;
            label1.Text = line;
            label2.Text = line;

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void richTextBox2_TextChanged(object sender, EventArgs 
e)
        {
            label6.Text = richTextBox1.Lines(0);
        }
    }
    }

von DAVID B. (bastler-david)


Lesenswert?

Ein andere Idee war es mit Timern zumachen ein Timer startet den nano 
neu und in form 1 läuft ebenfalls ein Timer welche der nur ein Label 
frei gibt der nano sendet temp eins das Label über nimmt den wert und 
der Timer deaktiviert Label eins der nano sendet temp 2 und der Timer 
aktiviert Label 2 und so weiter das Problem was ist sehe es ist 
umständlich und der Timer in form 1 und der im nano werden Woll nicht 
lange gleich laufen die werden irgend wann driften.

von Klaus (Gast)


Lesenswert?


von Arc N. (arc)


Lesenswert?

Was sendet der Arduino denn am Ende einer Zeile? \n oder \r\n?
Wenn der Arduino nicht nur reines ASCII sendet, dann sollte auch das 
Encoding des SerialPorts angepasst werden:
1
serialPort1.NewLine = "\n"; // oder "\r\n"
2
serialPort1.Encoding = Encoding.GetEncoding(28591); // ISO-8859-1

von Basti (Gast)


Lesenswert?

Sorry, aber IMHO der falsche Ansatz.

Die Methode serialPort1.ReadLine() liest ja bereits nur eine Zeile ein. 
Und landet in deiner Methode LineReceived sogar im UI-Thread. Soweit 
alles gut.

An der Stelle (also in LineReceived) würde ich einfach einen Line-Zähler 
mitlaufen lassen und je nach Wert das entsprechende Label setzen.

Beispiel:

private int _currentLine = 0;

private void LineReceived(string line)
{
    richTextBox1.Text += line;

    _currentLine++;

    switch( _currentLine )
    {
        case 1:
            label1.Text = line;
            break;

        case 2:
            label2.Text = line;
            break;

        // usw.
    }

    // Evtl. so falls die Zeilen automatisch nacheinander eintreffen
    if( _currentLine == 3 )
        _currentLine = 0;

    // Aber besser wäre es, irgendwie den Anfang zu erkennen
    // z.B. so am Anfang dieser Methode:
    // if( line == "Start" || line.StartWidth( "Version" )
    // {
    //     _currentLine = 0;
    //     return;
    // }
    //
    // Evtl. sendet die Gegenstelle ja aber auch erst auf Anforderung.
    // Dann halt davor den Zähler auf 0 setzen.
}

Gruß
Basti

von Basti (Gast)


Lesenswert?

Ups, evtl. habe ich das eigentliche Problem erst jetzt Verstanden... 
Falls die eine empfangene Zeile immer gleich alle Zeilen enthält, dann 
sollte der Post von Arc Net (arc) helfen.

von DAVID B. (bastler-david)


Lesenswert?

Ich habe euere posts gelesen und werde mal versuchen sie um zusetzten.
Mein der Derzeitige Code ist ein Standard Code nur halt die Sensoren 
wurden und werden noch angepasst (werden noch mehr).
Ich habe weiter unten die Möglichkeit die werter zeit verzögert zu 
versenden es muss also nicht alles gleich zeitig sein.

#include <OneWire.h>
#include <DallasTemperature.h>

OneWire  ds(10); //pin für ds1820

//DeviceAdressen der einzelnen ds1820 Temperatursensoren angeben. (loop 
anpassen)
DeviceAddress sensor1 = { 0x28, 0xFF, 0x86, 0x2E,  0x74, 0x16, 0x3, 0xAF 
};
DeviceAddress sensor2 = { 0x28, 0xFF, 0x5, 0x72, 0x74, 0x16, 0x3, 0xE0 
};

char sensor1Name[] = "Temp1: ";
char sensor2Name[] = "Temp2: ";

void setup(void)
{
  Serial.begin(9600);
}

void writeTimeToScratchpad(byte* address)
{
  //reset the bus
  ds.reset();
  //select our sensor
  ds.select(address);
  //CONVERT T function call (44h) which puts the temperature into the 
scratchpad
  ds.write(0x44,1);
  //sleep a second for the write to take place
  delay(2000);
}

void readTimeFromScratchpad(byte* address, byte* data)
{
  //reset the bus
  ds.reset();
  //select our sensor
  ds.select(address);
  //read the scratchpad (BEh)
  ds.write(0xBE);
  for (byte i=0;i<9;i++){
    data[i] = ds.read();
  }
}

float getTemperature(byte* address)
{
int tr;
byte data[12];

writeTimeToScratchpad(address);

readTimeFromScratchpad(address,data);

//put in temp all the 8 bits of LSB (least significant byte)
tr = data[0];

if (address[0] == 0x10) // DS18S20
{
//check for negative temperature
if (data[1] > 0x80)
{
tr = !tr + 1; //two’s complement adjustment
tr = tr * -1; //flip value negative.
}

//drop bit 0
tr = tr >> 1;

//COUNT PER Celsius degree (10h)
int cpc = data[7];
//COUNT REMAIN (0Ch)
int cr = data[6];

return tr - (float)0.25 + (cpc - cr)/(float)cpc;
}
else // DS18B20
{
return ((data[1] << 8) + tr) * (float)0.0625;
}
}

void loop(void)
{
  float temp1 = getTemperature(sensor1);
  float temp2 = getTemperature(sensor2);

  Serial.print(sensor1Name);
  Serial.print(temp1);
  Serial.println(" Celsius");
delay(2000);
  Serial.print(sensor2Name);
  Serial.print(temp2);
  Serial.println(" Celsius");
  delay(2000);
}

von DAVID B. (bastler-david)


Angehängte Dateien:

Lesenswert?

Ok nach tagen langen versuchens bin ich am punkt wo ich einsehen muss 
das es nicht möglich ist ok war aber ein versuch wert.
Weder der Nano ist in der Lage 2 Sensoren abzufragen noch bekomme ich es 
hin eine Zeile aus 6 Zeilen abzufragen.
Somit bleibt nur noch eins für jeden der geplanten 16 Sensoren ein 
eigenen Nano zu kaufen :-( und jeden Sensor ein COM Port zu verpassen 
mal sehen ob das geht.

Vielen Dank für euere Hilfen.

von Prog R. (daniel_v)


Lesenswert?

ist zwar etwas umständlich, wie du das angehst (1.Beitrag) - aber eine 
schnelle (nicht unbedingt saubere Lösung) wäre, aus der Line (also dem 
String) die Temp wie schon erwähnt rauszusplitten.
Das
label1.Text = richTextBox1.Lines(1);
funktioniert nicht, weil du das Textobjekt übergeben solltest.
label1.Text = richTextBox1.Lines(1).Text;
und mit Zerlegen:

label1.Text = richTextBox1.Lines(1).Text.Substring(5,8);
Die 5 und 8 sind die Zeichindizes, also Start und Ende - musst 
nachzählen, obs so passt.
[Anm: ist jetzt nur aus dem Stegreif und nicht getestet).

von DAVID B. (bastler-david)


Lesenswert?

vielen DANK werde ich heute abend mal testen.
mit dem andern hatte ich kein erfolg,

von DAVID B. (bastler-david)


Lesenswert?

Schöne Idee aus VB geht aber nicht :-(

>>Der nicht aufrufbare Member "TextBoxBase.Lines" kann nicht wie eine Methode 
verwendet werden<<

von DAVID B. (bastler-david)


Lesenswert?

Scheiss 60 Minuten Änderung zeit :-(

Ok ich habe jetzt noch mal das von MS versucht:

private void Button1_Click(System.Object sender, System.EventArgs e)
{

  // Reset the results box.
  TextBox1.Text = "";

  // Get the word to search from from TextBox2.
  string Temp1 = TextBox2.Text;

  int index = 0;

  //Declare an ArrayList to store line numbers.
  System.Collections.ArrayList lineList = new 
System.Collections.ArrayList();
  do
  {
    // Find occurrences of the search word, incrementing
    // the start index.
    index = RichTextBox1.Find(Temp1, index+1, 
RichTextBoxFinds.MatchCase);
    if (index!=-1)

      // Find the word's line number and add the line
      // number to the arrayList.
    {
      lineList.Add(RichTextBox1.GetLineFromCharIndex(index));
    }
  }
  while((index!=-1));

  // Iterate through the list and display the line numbers in TextBox1.
  System.Collections.IEnumerator myEnumerator = 
lineList.GetEnumerator();
  if (lineList.Count<=0)
       {
           TextBox1.Text = Temp1+" was not found";
       }
       else
       {
           TextBox1.SelectedText = Temp1+" was found on line(s):";
           while (myEnumerator.MoveNext())
           {
               TextBox1.SelectedText = myEnumerator.Current+" ";
           }

Wo er eigentlich nach Temp1 suchen soll es aber nicht macht auser das 
not found anzuzeigen in textbox oder label1 nachdem ich Button1 klicke ?

.. hmm

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.