[gelöst] string Weiterverarbeiten? Anfänger!!!

Hallo ich bin noch Anfänger und habe noch so meine Schwierigkeiten mit der weiterverarbeiten von eine String.

Ich hole mir mit folgenden Code Info von einem Server.

  client.println("GET /fhem?detail=ArduinoData HTTP/1.1");
  client.println("Connection: close");
  client.println();

  delay(500);
  
  
  if (client.available())
  {
    
    String line = client.readString();
    Temp = line.substring(8450, 8503);

    
    Serial.println(Temp); 

  
  }

Die Ausgabe sieht dann so aus:

<td><div informId="ArduinoData-temp1">9.5</div></td>

Mit substring kann ich den Bereich schon eingrenzen.
Ich würde jetzt gerne den Nachstehenden Wert von ArduinoData-temp1 weiterverarbeiten.
Leider kann sich die Ausgabe immer um ein paar Stellen verschieben.
Gibt es eine Möglichkeit in den String nach einer Zeichenkette zu suchen zb: “ArduinoData-temp1” und die Nachstehenden fünf stellen auszugeben?

danke

Könnte das funktioniern?

   if (client.available())
  {
    
    String line = client.readString();

    int t=8400;
    int n=8417;
    int h=8420;
    int g=8423;

while (t < 8500){

    t++;
    n++;
    h++;
    g++;
    
    Temp1 = line.substring(t, n);
    Temp2 = line.substring(h, g);
    


if (Temp1.indexOf("ArduinoData-temp1")){
  
Serial.println(Temp2);

t=8500;
  
}

}
  
  }

kann es jetzt leider nicht testen.

Ich habe mir deinen Sketch jetzt nicht weiter angesehen, aber schau doch mal hier http://forum.arduino.cc/index.php?topic=430036.msg2973434#new rein, evt. hilft dir das weiter.
Das sollte genau dein Thema betreffen.

[quote author=schami23 link=msg=2973031 date=1477300692]
  Temp = line.substring(8450, 8503);

[/quote]
Verstehe ich Dich jetzt richtig, dass Du 8503 (oder mehr) Zeichen in den Arduino einlesen willst?
Welchen verwendest Du denn?

Gruß Tommy

Hallo Tommy,
Ich möchte nur die Zeichen zwischen 8450 und 8503 verwenden und das geht bei meinen Uno ohne Probleme.

line.substring(from, to);

Grüß Jürgen

Ja, ich weiß, was Substring ist. Aber Du musst die Zeichen ja erst mal in line haben, bevor Du da auf einen Teil zugreifen willst.

Und in diese variable willst Du erst mal >= 8503 Zeichen einlesen. bzw. musst Du, wenn Du substring benutzen willst.

Gruß Tommy

Hallo Tommy,
ja stimmt, aber es geht trotzdem.

Mit dem Sketch bin ich auf dem Holzweg, hast du vielleicht einen anderen Ansatz?

Ich glaub es ist besser die Daten auf den Arduino zu senden, als umständlich aus einer HP zu extrahieren.

Grüße Jürgen

Fragen wir doch mal grundsätzlich: Wer bist Du denn (als Arduino)?

Bist Du der Server, der Anfragen bearbeiten will oder bist Du der Client, der einen anderen Server fragt?

Sag doch mal, was Du eigentlich machen willst?

Bisher hast Du nur nach Stringbearbeitung gefragt.

Gruß Tommy

Der Arduino ist der Client der Daten von einen Server abfragen soll und dann auf ein Display ausgeben soll.

Hast du nur das eine Problem oder ein generelles Verständnis-/Wissensproblem, wie man das Ganze bewerkstelligt?

schami23:
Der Arduino ist der Client der Daten von einen Server abfragen soll und dann auf ein Display ausgeben soll.

Warum richtest Du dann einen Server ein?

Gruß Tommy

Hallo Tommy,

Hier für ein besseres Verständnis um was es geht, mein Projekt.

Ich habe eine Wetterstation die alle 5 Minuten Daten an einen FHEM Server sendet.
Ich habe mir mit Hilfe eines ESP8266 ein Raumthermostat gebastelt das mit einen HTU21D die Luftfeuchtigkeit und Temperatur misst, alle 5 Minuten werden diese Daten an den FHEM Server gesendet.
Alle 10 Sekunden werden die Daten auf einem OLED Display ausgegeben.

Jetzt hätte ich gerne, dass sich das Raumthermostat die Daten der Wetterstation vom FHEM Server holt und jede Minute die Daten an das Display ausgibt.
Ich weiss zwar wie ich mit dem ESP eine Seite aufrufen kann aber weiss eben nicht wie oben schon erwähnt wie ich die Daten dann am besten verarbeiten kann um das gewünschte Ergeniss zu erreichen.

Hier der Sketch den ich dafür verwende. Ist für Profis wahrscheinlich sehr unübersichtlich aber es Funktioniert.

#include <ESP8266WiFi.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "SparkFunHTU21D.h"

#define OLED_RESET LED_BUILTIN//4
Adafruit_SSD1306 display(OLED_RESET);


#define XPOS 0
#define YPOS 1


#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
const char* ssid = "xxxxxxxxxx";
const char* password = "xxxxxxxxxx";

const char* host = "192.168.56.104";
const int httpPort = 8085;
const char* WBS1 = "10";//Temp
const char* WBS2 = "11";//Hum

unsigned long previousTemp = 0; 
unsigned long previousHum = 0;
unsigned long previousDisplay = 0;
unsigned long previousDisplayWetter = 0;
const long intervalTemp = 5*60000;
const long intervalHum = 5*60000;
const long intervalDisplay = 10000;
const long intervalDisplayWetter = 60000;

String Temp = "";
long rssi = WiFi.RSSI();
HTU21D myHumidity;


void setup() {
  Serial.begin(9600);
  myHumidity.begin();
  delay(10);
  
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    
  }
  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  
  display.display();
 display.clearDisplay();
  delay(2000);
  display.clearDisplay();
  
  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("RSSI:");
  Serial.println(rssi);


  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("");
  display.println("WiFi verbunden");  
  display.println("IP address: ");
  display.println("");
  display.println(WiFi.localIP());
  display.display();
  display.println("");
  display.print("Empfang: ");
  display.print("-");
  display.println(rssi);
  display.display();
  delay(10000);
  
}


void loop() {
  
unsigned long currentDisplay = millis();
 

  if (currentDisplay - previousDisplay  >= intervalDisplay) {
    
  float Temp = myHumidity.readTemperature();
  float Hum = myHumidity.readHumidity();
        
  display.clearDisplay();
  display.setCursor(45,2);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("hum  ");
  display.setTextSize(3);
  display.print(Hum, 0);
  display.setTextSize(2);
  display.print((char)37);
  

  
  display.setCursor(5,30);
  display.setTextSize(4);
  display.setTextColor(WHITE);
  display.print(Temp, 1);
  display.setTextSize(2);
  display.print((char)247);
  display.print("C");
  display.display();

  previousDisplay = currentDisplay;
  
  }

unsigned long currentDisplayWetter = millis()- 50000;
 

  if (currentDisplayWetter - previousDisplayWetter  >= intervalDisplayWetter) {
    
  

  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  

  
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    
  display.clearDisplay();
  display.setCursor(15,2);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setTextSize(2);
  display.print("Temp Out");
 
  display.setCursor(5,30);
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.print("NO Con");
  display.display(); 
  }
  else
  {
  client.println("GET /fhem?detail=ArduinoData HTTP/1.1");
  client.println("Connection: close");
  client.println();

  delay(500);
  
  
  if (client.available())
  {
 
    String line = client.readString();
    Temp = line.substring(44,48);
    Serial.println(Temp); 

  display.clearDisplay();
  display.setCursor(15,2);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setTextSize(2);
  display.print("Temp Out");
 
  display.setCursor(5,30);
  display.setTextSize(4);
  display.setTextColor(WHITE);
  display.print(Temp);
  display.setTextSize(2);
  display.print((char)247);
  display.print("C");
  display.display(); 
    
  }
  else
  {
  display.clearDisplay();
  display.setCursor(15,2);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setTextSize(2);
  display.print("Temp Out");
 
  display.setCursor(5,30);
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.print("NO Con");
  display.display(); 
  
  client.stop(); 
  }
  }
  previousDisplayWetter = currentDisplayWetter;
  
  }


 unsigned long currentTemp = millis()- 5000;
 

  if (currentTemp - previousTemp  >= intervalTemp) {
        
  Serial.print("connecting to ");
  Serial.println(host);
  
  WiFiClient client;
  
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
  
  float Temp = myHumidity.readTemperature();

  Serial.println("connected");
   
  client.print("GET /fhem/rawmsg?WBS:");
  client.print(WBS1);
  client.print(":");
  client.println(Temp, 1);
  client.println();

  Serial.print(" Temperature:");
  Serial.print(Temp, 1);
  Serial.print("C");

  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 10000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }
  Serial.println();
  Serial.println("closing connection");

  previousTemp = currentTemp;
  
  }

unsigned long currentHum = millis()- 10000;
  
if (currentHum - previousHum  >= intervalHum) {
  
  Serial.print("connecting to ");
  Serial.println(host);
  
  WiFiClient client;
  
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
  
  float Hum = myHumidity.readHumidity();

  Serial.println("connected");
 
  client.print("GET /fhem/rawmsg?WBS:");
  client.print(WBS2);
  client.print(":");
  client.println(Hum, 0);
  client.println();

  Serial.print(" Hum:");
  Serial.print(Hum, 0);
  Serial.print("%");


  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 10000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }
  Serial.println();
  Serial.println("closing connection");

  previousHum = currentHum;
  
  }
  
}

Hab bis jetzt immer den Arduino für die Versuche genommen.

Grüße Jürgen

Ich nehme mal nur diesen Ausschnitt:

client.println("GET /fhem?detail=ArduinoData HTTP/1.1");
  client.println("Connection: close");
  client.println();

  delay(500);
 
 
  if (client.available())

Wenn du die Connection schließt, wieso erwartest Du, dass Dir der Server noch was schickt?
Ich habe keinen ESP8266, kann darauf also nicht näher eingehen.

Die Delays können noch zu Problemem führen und Deine Zeitsteuerung mit der Deklaration im Loop

unsigned long currentDisplayWetter = millis()- 50000;

kommt mir auch etwas merkwürdig vor.

Teile das Problem doch erst einmal auf und versuche nur Daten vom Server zu bekommen.

Gruß Tommy

Hallo Tommy,

hab das ganze jetzt lösen können.
Ich hab mir ein php Script gebastelt, wo hin der Fhem Server alle 5 Minuten den aktuellen Wert der Wetterstation schickt, die Daten werden in einer text Datei gespeichert und bei Abfrage ausgegeben.

<html>
<?php
// Lesen der Datei
$dateinamen = "tempout.txt";
$handle = fopen ($dateinamen, "r");
$inhalt = fread ($handle, filesize ($dateinamen));
fclose ($handle);
 

$inhalt = $inhalt;
echo "$inhalt  




";

if ($_GET["temp1"]){ 
$inhalt1 = $_GET["temp1"];

// Schreiben des neuen Wertes
$handle = fopen ("tempout.txt", "w");
fwrite ($handle, $inhalt1);
fclose ($handle);
 
echo "Wert $inhalt1 in Datei tempout.txt  geschrieben";
}
;
?>
</html>

Ich frage mit den ESP den Wert jetzt alle 5 Minuten ab und gebe ihn jede Minute an das Display aus.

Mittels line.substring grenze ich den String ein, anschließend wird der String in eine Array umgewandelt und so kann ich ihn wie gewünscht weiterverarbeiten.

Mir hat deine Anleitung für “Zeichenketten in C” sehr weiter geholfen. DANKE

unsigned long currentDisplayWetter = millis()- 50000;

Ist das die Schleife versetzt beginnt.

Der Sketch läuft seit Gestern ohne Probleme

#include <ESP8266WiFi.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "SparkFunHTU21D.h"

#define OLED_RESET LED_BUILTIN//4
Adafruit_SSD1306 display(OLED_RESET);


#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
const char* ssid = "xxxxxxxxx";
const char* password = "xxxxxxxxx";

const char* host = "192.168.56.104";
const int httpPort = 8085;
const int httpPort1 = 80;
const char* WBS1 = "10";//Temp
const char* WBS2 = "11";//Hum

unsigned long previousTemp = 0; char temp[7];
unsigned long previousHum = 0;
unsigned long previousDisplay = 0;
unsigned long previousDisplayWetter = 0;
unsigned long previousDisplayWetterTemp = 0;
const long intervalTemp = 5*60000;
const long intervalHum = 5*60000;
const long intervalDisplay = 10000;
const long intervalDisplayWetter = 60000;
const long intervalDisplayWetterTemp = 5*60000;


String Temp1 = "";



long rssi = WiFi.RSSI();
HTU21D myHumidity;


void setup() {
  Serial.begin(9600);
  myHumidity.begin();
  delay(10);
  
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    
  }
  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
 
  delay(2000);
  display.clearDisplay();
  
  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("RSSI:");
  Serial.println(rssi);


  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("");
  display.println("WiFi verbunden");  
  display.println("IP address: ");
  display.println("");
  display.println(WiFi.localIP());
  display.display();
  display.println("");
  display.print("Empfang: ");
  display.print("-");
  display.println(rssi);
  display.display();
  
  WiFiClient client;
  
  if (!client.connect(host, httpPort1)) {
    Serial.println("connection failed");
   
  
  }
  else
  {
  client.println("GET /temp.php HTTP/1.1");
  client.println("Connection: close");
  client.println();

  
  delay(500);
  
  if (client.available())
  {
 
    String line = client.readString();
    Temp1 = line.substring(322,328);
    
    
  }
    client.stop();
  
  }
  delay(8000);
  
}


void loop() {

  
  
unsigned long currentDisplay = millis();
 


  if (currentDisplay - previousDisplay  >= intervalDisplay) {
    
  float Temp = myHumidity.readTemperature();
  float Hum = myHumidity.readHumidity();
        
  display.clearDisplay();
  display.setCursor(45,2);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("hum  ");
  display.setTextSize(3);
  display.print(Hum, 0);
  display.setTextSize(2);
  display.print((char)37);
  
  display.setCursor(5,30);
  display.setTextSize(4);
  display.setTextColor(WHITE);
  display.print(Temp, 1);
  display.setTextSize(2);
  display.print((char)247);
  display.print("C");
  display.display();

  previousDisplay = currentDisplay;
  
  }


unsigned long currentDisplayWetterTemp = millis()- 15000;

if (currentDisplayWetterTemp - previousDisplayWetterTemp  >= intervalDisplayWetterTemp) {


 // Use WiFiClient class to create TCP connections
  WiFiClient client;
  

  
  if (!client.connect(host, httpPort1)) {
    Serial.println("connection failed");
   
  
  }
  else
  {
  client.println("GET /temp.php HTTP/1.1");
  client.println("Connection: close");
  client.println();

  
  delay(500);
  
  if (client.available())
  {
 
    String line = client.readString();
    Temp1 = line.substring(322,328);
    
    
  }else{
    client.stop();
  }
  }
 previousDisplayWetterTemp = currentDisplayWetterTemp;
 
  }





unsigned long currentDisplayWetter = millis()-50000;
 

  if (currentDisplayWetter - previousDisplayWetter  >= intervalDisplayWetter) {
    
  char temp[7];
  Temp1.toCharArray(temp, 7);
 
    
  Serial.println(Temp1); 
  display.clearDisplay();
  display.setCursor(15,2);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setTextSize(2);
  display.print("Temp Out");
  display.setCursor(40,30);
  

    if (temp[0] == '-'){ //-

  

    if (temp[3] == '.'){
 
  display.setCursor(5,30);
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.print(temp[0]);
  display.print(temp[1]);
  display.print(temp[2]);
  display.print(temp[3]);
  display.print(temp[4]);
    }
    else
    {
  display.setCursor(5,30);
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.print(" ");
  display.print(temp[0]);
  display.print(temp[1]);
  display.print(temp[2]);
  display.print(temp[3]);
    }
  
    }
    else
    {

  if(temp[2] == '.'){
         
  display.setCursor(5,30);
  display.setTextSize(4);
  display.setTextColor(WHITE);
  display.print(temp[0]);
  display.print(temp[1]);
  display.print(temp[2]);
  display.print(temp[3]);

  }
  else
  {
  display.setCursor(5,30);
  display.setTextSize(4);
  display.setTextColor(WHITE);
  display.print(" ");
  display.print(temp[0]);
  display.print(temp[1]);
  display.print(temp[2]);

  }
    }


    
  display.setTextSize(2);
  display.print((char)247);
  display.print("C");
  display.display();
  
  
  previousDisplayWetter = currentDisplayWetter;
  
  }



 unsigned long currentTemp = millis()- 5000;
 

  if (currentTemp - previousTemp  >= intervalTemp) {
        
  Serial.print("connecting to ");
  Serial.println(host);
  
  WiFiClient client;
  
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
  
  float Temp = myHumidity.readTemperature();

  Serial.println("connected");
   
  client.print("GET /fhem/rawmsg?WBS:");
  client.print(WBS1);
  client.print(":");
  client.println(Temp, 1);
  client.println();

  Serial.print(" Temperature:");
  Serial.print(Temp, 1);
  Serial.print("C");

  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 10000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }
  Serial.println();
  Serial.println("closing connection");

  previousTemp = currentTemp;
  
  }

unsigned long currentHum = millis()- 10000;
  
if (currentHum - previousHum  >= intervalHum) {
  
  Serial.print("connecting to ");
  Serial.println(host);
  
  WiFiClient client;
  
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
  
  float Hum = myHumidity.readHumidity();

  Serial.println("connected");
 
  client.print("GET /fhem/rawmsg?WBS:");
  client.print(WBS2);
  client.print(":");
  client.println(Hum, 0);
  client.println();

  Serial.print(" Hum:");
  Serial.print(Hum, 0);
  Serial.print("%");


  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 10000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }
  Serial.println();
  Serial.println("closing connection");

  previousHum = currentHum;
  
  }
  
}

Grüße Jürgen

Prima, wenn es funktioniert und mein Geschreibsel eine Hilfe war.

Gruß Tommy

Ich hab da doch noch ein Problem.

und zwar mit folgenden Teil des Sketch

unsigned long currentDisplayWetterTemp = millis();

if (currentDisplayWetterTemp - previousDisplayWetterTemp  >= intervalDisplayWetterTemp) {


 // Use WiFiClient class to create TCP connections
  WiFiClient client;
  

  
  if (!client.connect(host, httpPort1)) {
    Serial.println("connection failed");
   
  
  }
  else
  {
  client.println("GET /temp.php HTTP/1.1");
  client.println("Connection: close");
  client.println();


  delay(500);
 
  
  if (client.available())
  {
 
    String line = client.readString();
    Temp1 = line.substring(322,328);
    
    
  }else{
    client.stop();
  }

  }
 
  }
 previousDisplayWetterTemp = currentDisplayWetterTemp;
 
  }

die 500 Millisekunden Delay blockieren immer wieder die anderen Schleifen zur Display Ausgabe. Das macht sich erst nach längerer Laufzeit bemerkbar.

ich hab es auch schon mit

 unsigned long startTime = millis();
 unsigned long httpResponseTimeOut = 500; 
 

  while (client.connected() && ((millis() - startTime) < httpResponseTimeOut)) {
  
  if (client.available())
  {
 
    String line = client.readString();
    Temp1 = line.substring(322,328);
    
    
  }else{
    client.stop();
  }

  }

aber das funktioniert nicht.

Habt ihr einen Tipp für mich.
Danke

Grüße Jürgen

mache es nicht mit while, sondern mit if constructen