Go Down

Topic: Anfänger braucht Hilfe: Serielle Daten auslesen und weiterverarbeiten (Read 10833 times) previous topic - next topic

ElEspanol

Dimmen kannst du auch mit einem PWM Ausgang, wenn du noch einen frei hast.

Vorwiderstand nicht vergessen

Johnny82

Danke, Spanier :)

Hmm, eigentlich hätte ich es mit dem Poti genacht, aber mit dem Arduino ist es natürlich interessanter...

Pin11 wird dann vom LAN shield belegt, der Pin vom Display, der nun in Pin 11 steckt wandert in Pin 10, Dann blieben noch 9 und 6. Also 2 hätte ich noch.

Mir kam da die Idee, da ich nur einen Beispielcode gefunden habe, mit dem die Dimmung statisch funktioniert, also nur so viel %, wie im Code eingegeben wurden.

Interessanter wäre es natürlich, das ganze entweder Unrzeitabhängig zu gestalten, oder ans Umgebungslicht angepasst... Wobei ich da wohl wieder an die Grenzen stoße, denn 9 und 6 wären noch frei. Einer davon wird für das Minussignal vom LCD belegt und der Photorsensor braucht sicherlich auch 2 kanäle...

Muss ich mal genauer recherchieren :)

ElEspanol


Serenifly

Das LAN Shield braucht Pins 10 bis 13

Du kannst auch das LCD mit einer Adapterplatine auf I2C umrüsten. Dann braucht es nur noch 2 Pins.

Aber mach erst mal die Grund-Version. Dann kann man immer solchen Schnick-Schnack machen.

Yosh76

@Serenifly,

danke für den super Sketch.
Dieser rennt jetzt auch schon eine lange Zeit bei mir.
Ich habe ein paar Anpassungen vorgenommen um die Dartellung zu interpretieren und die Werte über einen Web-Server an FHEM übertragen zu können.

Code: [Select]
if (strncmp(str, "E1 ", 3) == 0)      //Vergleiche erste drei Zeichen in str mit "E1 ". Liefert 0 bei Gleichheit
  {
   
    const int line = 6;

    line_buffer[line][0] = '\0';
    strcat(line_buffer[line], "Wasser");  //Titel einfügen
    if (strstr(str, "Luft"))
    {
  //  pegel1_status=("LUFT");
    if (strstr(str, "*"))
    {
    strcat(line_buffer[line], "pegel Fehler!!");  //Text einfügen. Ist so am einfachsten 
pegel1_status=("FEHLER");
    }
    else
    strcat(line_buffer[line], " wird gefuellt");  //Text einfügen. Ist so am einfachsten
pegel1_status=("FUELLEN");
    }
    else if (strstr(str, "Wasser"))
    {
    strcat(line_buffer[line], "pegel ist i.O.!");
pegel1_status=("OK");
    }
    append_spaces(line_buffer[line]);
  }


Die Variable pegel1_status wird dabei an den Webserver übergeben und diese pusht die Nachrichten an FHEM.

Woran ich allerdings verzweifel ist an den eigentlichen Werten, die per strncmp verglichen und dann per Pointer an die Stelle gesetzt und verarbeitet werden.
Ich dachte eigentlich, dass eine if Abfrage in void parse_value und eine weitere Sub-Routine ausreichen würden, um die Werte direkt in Variablen zu schreiben (damit sie an den Web-Server übergeben werden können).

Also habe ich parse_value wie folgt ergänzt:

Code: [Select]
void parse_value(byte line, const char* title, const char* str, byte width, const char* unit)
{

   if (line == 10 ) {
   char* ptr_web = strstr(str, "(Te )");
   if (ptr_web != NULL)
   webserve(0, "Temperatur", str, 4);
   
  } 
  if (line >= 0 && line < NUMBER_OF_PAGES * 4)
  {
    char* buffer = line_buffer[line]; //Zeiger auf Zeile in Puffer

  //Wert aus dem eingelesenen String isolieren. Entfernt führende Leerzeichen
    str += 8;
    while (*str == ' ')
      str++;
 
    char* ptr = strchr(str, ' ');
    if (ptr)
      *ptr = '\0';

// temp_status=line_buffer[10];
    buffer[0] = '\0';
    strcat(buffer, title);    //Titel kopieren

    format_string(buffer, str, width);    //Wert formatieren
    //strcat(buffer, str);    //Alternative zur vorherigen Zeile, wenn es nichts rechts-bündig sein soll

    if (unit != NULL)       //Einheit anhängen
      strcat(buffer, unit);

    append_spaces(buffer);
  }
  }

Dabei war mein Gedanke, dass ich mit strstr nach (TE ) suche und dann den gefunden Wert an eine Sub-Routine weiter gebe.

Das funktioniert auch soweit - allerdings werden die Werte aus der Sub-Routine immer wieder von nicht Temperatur Werten überschrieben:

Code: [Select]
void webserve(byte zeile, const char* parameter, const char* ptr_set, byte width)
 {
 ptr_set += 8;
  while (*ptr_set == ' ')
    ptr_set++;
  *strchr(ptr_set, ' ') = '\0';
  temp_status = (ptr_set);
  }

Ich verzweifel da langsam dran... Mein Ziel ist es doch nur die ausgelesen und separierten Werte in einzelnen Variablen zu haben.
Hat jemand eine Idee?
Ich finde meinen Denkfehler nicht  :smiley-confuse:

Danke :-)

Serenifly

Zeiger zeigen nur auf anderen Speicher. Wenn sich der Wert auf den sie zeigen ändert hast du diese Änderung auch.

Falls du Werte als wirkliche Zahlen haben willst, kannst sie auch einfach umwandeln. atoi() für Integer und atof() für Float

Auch daran denken dass der Sketch für LCDs gedacht war. Deshalb die Sache mit den mehreren Seiten die automatisch wechseln und das Anhängen von Leerzeichen am Ende so dass man auf eine konstante Breite kommt. Wenn du das auf eine Webseite ausgibst braucht man das alles nicht

Yosh76

You made my day  :smiley-mr-green:  :D  :D  :D  :D  :D
Danke - das war schnell;
Oh mann - da habe ich den Wald vor lauter Bäumen nicht gesehen.
Die Anpassungen für Formatierung und co habe ich schon gemacht.


Code: [Select]
void webserve(byte zeile, const char* parameter, const char* ptr_set, byte width)
 {
 ptr_set += 8;
  while (*ptr_set == ' ')
    ptr_set++;
  *strchr(ptr_set, ' ') = '\0';
  temp_status = atof(ptr_set);
}

Go Up