Funktionen in geschweifter Klammer anders als ohne

Hallo

ich öchte folgenden Funktionsblock in eine Geschweifte Klammer setzen um sie mit einer if Abfrage zu verknüpfen.

 sensors.requestTemperatures();//Start Abfrage DS18B20
 //if(DS18B20_Abfrage.isExpired())                //isExpired -> der Timer ist abgelaufen

  //Temperaturen DS18B20 in Variable ablegen
  //float tempS1 = 80; //zum Test Uebertemp.SP1 aktivieren untere Zeile dann deaktivieren
  float tempS1 = sensors.getTempC(SensorS1); //zwischenspeichern in Variable tempS1
   
      //Mittelwertbildung
  tempS1Mittelwert = 0;                                   //den gemittelen Wert auf 0 setzen
  for(zaehlerIstS1 = 0;zaehlerIstS1 < 10;zaehlerIstS1++)      //wenn zaehlerIst kleiner 10  dann erhoehe um 1 und fuehre die naechsten zwei Zeilen aus
    {
    tempS1Mittelwert = (tempS1Mittelwert + tempS1)/10;     //Mittelwert bilden aus 10 Messwerten
    delay(10);
    }
    
   
    
  //float tempS2 = 76; //zum Test Uebertemp.SP2 aktivieren untere Zeile dann deaktivieren
  float tempS2 = sensors.getTempC(SensorS2); //zwischenspeichern in Variable tempS2
  
       //Mittelwertbildung
  tempS2Mittelwert = 0;                                   //den gemittelen Wert auf 0 setzen
  for(zaehlerIstS2 = 0;zaehlerIstS2 < 10;zaehlerIstS2++)      //wenn zaehlerIst kleiner 10  dann erhoehe um 1 und fuehr die naechsten zwei Zeilen aus
    {
    tempS2Mittelwert = (tempS2Mittelwert + tempS2)/10;     //Mittelwert bilden aus 10 Messwerten
    delay(10);
    }

Das ist eine Abfrage der DS18B20 Temperatursensoren und ich möchte hiermit das Anhalten des Codes bei der Sensorabfrage umgehen.
Aber sobald ich den Programmteil in eine Geschweifte Klammer setze funktioniert dieser nicht.
Weiß eventuell jemand an was es ligt.

Grüße Rudi

und ich möchte hiermit das Anhalten des Codes bei der Sensorabfrage umgehen.

Das wird nicht gehen, denn das Timing der Sensoren ist kritisch, bzw. muss genau eingehalten werden.

Aber du könntest das Delay eliminieren, die Berechnungen auslagern, usw.

Aber mit geschweiften Klammern hat das nichts zu tun.
Du wirst sie brauchen, ja, aber so wie ich das lese hast du eine ungünstige Vorstellung davon, was diese tun.

funktioniert dieser nicht.

Du wirst Fehlermeldungen erhalten.
Beseitige sie!
Helfen kann ich nicht, denn die Meldungen sind geheim.
Und der gepostete Code untestbar.

Hallo combie

Danke für Deine Antwort.
Mein Problem habe ich so wie es ausieht nicht genau genug geschildert.
Die Geschweifte Klammer möchte ich deshalb einsetzen da ich die Sensorenabfrage mittels eines Timers machen will.

Das wird nicht gehen, denn das Timing der Sensoren ist kritisch, bzw. muss genau eingehalten werden.

Die Klammer betrifft das Timing doch noch gar nicht.

ber mit geschweiften Klammern hat das nichts zu tun.
Du wirst sie brauchen, ja, aber so wie ich das lese hast du eine ungünstige Vorstellung davon, was diese tun.

Die Klammer ist nacher für die Timergesteuerte Abfrage nötig ( if timer ist abgelaufen { lese Sensoren} )
zunächst müsste die Klammer ( ohne if Abfrage ) funktionieren. Sie fasst doch nur die Anweisungen zu einem Block zusammen und wenn keine Bedingung vorgestellt ist dann wird sie immer ausgeführt.

Du wirst Fehlermeldungen erhalten.
Beseitige sie

Der Code lässt sich ohne Fehlermeldungen kompilieren und er funktioniert auch tadellos bis auf die Funktionen die in der Klammer stehen.

den Kompletten Sketch habe ich angehängt.
Er ist zu groß um ihn dírekt zu posten.

Die Klammer sollte von Zeile 536 bis Zeile 564 gehen.

Kann es sein dass mein Problem etwas mit lokalen und globalen Variablen zu tun hat.

Vielen Dank schon im Vorraus Rudi

V42_Test2.ino (49 KB)

Das ist eine Abfrage der DS18B20 Temperatursensoren und ich möchte hiermit das Anhalten des Codes bei der Sensorabfrage umgehen.

Wenn du das Zwangsdelay umgehen willst verwende die Dallas Temperature Control Library von Miles Burton

Das kannst du mit setWaitForConversion(false) das Delay deaktivieren. Du bist dann aber dafür verantwortlich das Intervall zwischen Anforderung und Auslesen per Hand zu machen! Das kann man dann allerdings mit millis() erledigen.

Wegen deinem Code:
Lerne Funktionen zu verwenden und lagere kleinere Module in Funktionen aus. Das ist so völlig unübersichtlich. Man schreibt nicht 1000 Zeilen Code in loop()

Was ich bei der Temperaturmessung vermisse ist dass du mal wirklich mehrere Messungen machst. Du bildest einen "Mittelwert" aus 10 identischen Werten wenn ich das richtig sehe.

Wenn die Klammern jeweils für sich auf einer Zeile stehen, sollte es keine Probleme geben. Wenn die schließende Klammer aber am Ende einer Zeile mit einem // Kommentar steht, dann funktioniert das natürlich nicht.

Wenn die schließende Klammer aber am Ende einer Zeile mit einem // Kommentar steht, dann funktioniert das natürlich nicht

Super Glaskugel! Auf so was muss man erst mal kommen.

Sollte eigentlich eine Fehler-Meldung (evtl. an ganz anderer Stelle ) ergeben.
Am Ende solange geschweifte Klammern einfüllen bis er zu meckern aufhört, ist selten richtig :wink:

Hallo Zusammen

ich habs nun nochmals genauer getestet in die Klammer habe ich eine Textausgabe auf mein Lcd gelegt.
Die Anweisung wird ausgeführt das heist der Inhalt der Klammer wird abgearbeitet.
Wenn Die Klammer noch vor einem // Kommentar steht macht das nichts ist aber natürlich unübersichtlich.
Auch die Spalte in der die Klammer steht ist nicht relewant es ist nur die Reihenfolge bzw die Anzahl wichtig.
Aber nun wieder zu meinem eigentlichem Problem.
Jetzt habe ich den Sketch von Miles Burton eingebunden und so wies ausieht funktionieren die Anweisungen meines Sketches hier auch das ist schon mal gut dann brauche ich da nichts zu ändern.
Doch leider meckert der Kompiler bei der Verwendung von setWaitForConversion(false) .
Er spukt folgende Fehlermeldung aus:
error: expected constructor, destructor, or type conversion before '(' token
Ich muss da noch genauer suchen . Gibts eigentlich eine Beschreibung der Anweisungen? leider habe ich nichts gefunden.
Leider muss ich jetzt weg werde aber morgen wieder daran Arbeiten.

Grüße und Vielen Dank Rudi

Lerne zu programmieren und tippe nicht alles nur blind nach! Natürlich musst du die Methode auf einer Instanz von DallasTemperature ausführen. Das kann man als gegeben voraussetzen. Genauso wie du nicht einfach getTempC() schreiben kannst. Da gehört immer ein Objekt dazu.

Für die Beschreibung der Bibliothek schau dir den Header an. Da sind alle Funktionen kurz erklärt. Außerdem sind da auch Beispiele dabei.

Kann man z.B. so machen:

const int ONE_WIRE_BUS = 5;
const unsigned long TEMP_POLLING_INTERVAL = 1000UL;
const undigned int SENSOR_DEAY = 200;

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature temperature_sensors(&oneWire);

DeviceAddress sensor = { 0x28,0x68,0x2A,0xA4,0x05,0x00,0x00,0xAB };

float temp;

void setup()
{
  temperature_sensors.begin();
  temperature_sensors.setWaitForConversion(false);
  temperature_sensors.setResolution(10);
}

void loop()
{
  if (read_temperature_sensors())
  {
        //hier hat man eine neue Temperatur
  }
}

bool read_temperature_sensors()
{
  static unsigned long previous_millis;
  static bool data_requested;

  if (data_requested == true && millis() - previous_millis > SENSOR_DELAY)
  {
    temp = temperature_sensors.getTempC(sensor);
    data_requested = false;
    previous_millis = millis();
    return true;
  }

  if (data_requested == false && millis() - previous_millis > TEMP_POLLING_INTERVAL)
  {
    temperature_sensors.requestTemperatures();
    data_requested = true;
    previous_millis = millis();
  }

  return false;
}

SENSOR_DELAY musst dabei auf deine Auflösung anpassen! Siehe DS18B20 Datenblatt. Die 200ms gelten nur für 10 Bit.

Lässt sich auch bequem mit mehreren Sensoren erweitern

Gibts eigentlich eine Beschreibung der Anweisungen? leider habe ich nichts gefunden.

Sie nennen es zwar Arduino-Sprache, und haben den Anspruch alles hier zu erklären, es ist aber C++, mit wenigen Einschränkungen.
Dazu findest du eine Riesenmenge.

llo michael_michael_x

Danke für den Tip das kenne ich . Eigentlich meinte ich die Anweisungen speziell zur DallasTemperature Bibliotek.

Grüße Rudi

Wie gesagt schau in den Header. Das heißt die .h Datei in der Bibliothek.

Generell sind da alle Methoden aufgelistet. Wenn man sich etwas mit C/C++ auskennt, kann man die Funktionalität von vielen Methoden anhand der Parameter und Rückgabewerte ableiten.

Gute Bibliotheken sind da aber auch dokumentiert. Manchmal steht die Doku auch in der .cpp Datei. Die ist aber länger weil da auch der Code drin steht.

Bei dieser Lib findest du das:

  // sends command for one device to perform a temperature conversion by index
  bool requestTemperaturesByIndex(uint8_t);

  // returns temperature in degrees C
  float getTempC(uint8_t*);

Und dann gibt es noch die Beispiele mit verschiedenen Version wie man das verwenden kann.