Variable und Funktion

Hi Zusammen
Ich bin noch sehr neu in der Arduino Programmierung aber es klappt immer besser.
Was ich jedoch schon ein paar mal erlebt habe, ist folgendes:
Um den void loop() frei zu bekommen, erstelle ich eine eigene void messen() funktion.
Hier ein Beispiel so wie es original aussieht:

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

#define ONE_WIRE_BUS D6 // Define to which pin of the Arduino the 1-Wire bus is connected:

OneWire oneWire(ONE_WIRE_BUS); // Create a new instance of the oneWire class to communicate with any OneWire device:
DallasTemperature sensors(&oneWire);  // Pass the oneWire reference to DallasTemperature library:

void setup() {
  Serial.begin(9600);   // Begin serial communication at a baud rate of 9600:
  sensors.begin();      // Start up the library:
}

void loop() {
  sensors.requestTemperatures();// Send the command for all devices on the bus to perform a temperature conversion:
  // Fetch the temperature in degrees Celsius for device index:
  float tempC = sensors.getTempCByIndex(0); // the index 0 refers to the first device
  
  // Print the temperature in Celsius in the Serial Monitor:
  Serial.print("Temperature: ");
  Serial.print(tempC);
  Serial.print(" \xC2\xB0"); // shows degree symbol
  Serial.println("C");
  
  delay(1000);  // Wait 1 second:
}

Nun zu meiner gewünschten void messen() Funktion. Ich verschiebe die sensormessung welche als erstes nach dem void loop steht in eine eigene Funktion und stelle diese dann in den loop.

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

#define ONE_WIRE_BUS D6 // Define to which pin of the Arduino the 1-Wire bus is connected:

OneWire oneWire(ONE_WIRE_BUS); // Create a new instance of the oneWire class to communicate with any OneWire device:
DallasTemperature sensors(&oneWire);  // Pass the oneWire reference to DallasTemperature library:

void setup() {
  Serial.begin(9600);   // Begin serial communication at a baud rate of 9600:
  sensors.begin();      // Start up the library:
}

void messen(){
  sensors.requestTemperatures();// Send the command for all devices on the bus to perform a temperature conversion:
  // Fetch the temperature in degrees Celsius for device index:
  float tempC = sensors.getTempCByIndex(0); // the index 0 refers to the first device
  }

void loop() {
  messen();
  // Print the temperature in Celsius in the Serial Monitor:
  Serial.print("Temperature: ");
  Serial.print(tempC);
  Serial.print(" \xC2\xB0"); // shows degree symbol
  Serial.println("C");

  delay(1000);  // Wait 1 second:
}

So und nun kommt mein Problem, er meldet den Fehler im void loop bei Serial.print(tempC): ‘tempC’ was not declared in this scope
Also er erkennt die Variable tempC nicht mehr…

Wo muss ich diese definieren, damit die Variable tempC übergeben wird…?
Vielen Dank für eure Hilfe!
Gruss Raffi

Ausschnitt:

float messen(){
  sensors.requestTemperatures();// Send the command for all devices on the bus to perform a temperature conversion:
  // Fetch the temperature in degrees Celsius for device index:
  return sensors.getTempCByIndex(0); // the index 0 refers to the first device
  }

void loop() {
  float tempC = messen();

Funktionen sollten nicht mit globalen Variablen arbeiten.
Funktionen nehmen alles was sie brauche über ihre Parameter auf, und liefern ihren Wert per return.

Es gibt noch einige weitere solcher "Regeln"

raffich:

#include <OneWire.h>

#include <DallasTemperature.h>

void loop() {
  sensors.requestTemperatures();// Send the command for all devices on the bus to perform a temperature conversion:
  // Fetch the temperature in degrees Celsius for device index:
  float tempC = sensors.getTempCByIndex(0); // the index 0 refers to the first device

}





void messen(){
sensors.requestTemperatures();// Send the command for all devices on the bus to perform a temperature conversion:
// Fetch the temperature in degrees Celsius for device index:
float tempC = sensors.getTempCByIndex(0); // the index 0 refers to the first device
}

void loop() {
messen();

Serial.print(tempC);

}[/code]
So und nun kommt mein Problem, er meldet den Fehler im void loop bei Serial.print(tempC): 'tempC' was not declared in this scope
Also er erkennt die Variable tempC nicht mehr...

Wo muss ich diese definieren, damit die Variable tempC übergeben wird..?

Variante 1:
global TempC vor dem Setup definieren.
Dann gilt diese Variable im gesamten Scope.

Variante 2:
die Funktion void messen() mit einem Rückgabewert versehen:

float messen()
{
....
return TempC;
}

und dann im loop()
float TempC=messen();
Damit definierst Du ein neues TempC bekommst aber den Wert aus der Funktion zurück.

Wow, super! Vielen Dank!
Variante 2, mit dem float funktioniert.
Die "global" versuche ich auch gleich...

Globale Variablen nur benutzen, wenn du sie wirklich global brauchst.

combie:
Funktionen sollten nicht mit globalen Variablen arbeiten.
Funktionen nehmen alles was sie brauche über ihre Parameter auf, und liefern ihren Wert per return.

Es gibt noch einige weitere solcher "Regeln"

Für die C-Programmierung hast Du sicher recht. "Variablenwete" werden als Zeiger auf die Variable übergeben und innerhalb der Funktion werden über die Zeiger auf die Varialen zugegriffen.

Da in der Arduino-Welt Zeiger kaum beachtet werden ist Deine Information richtig aber kaum verwendet.
Da arbeitet viel mehr mit Globalen Variablen.
Daß man sich das abgewöhnen sollte, ist sicher ein Ziel das alle Arduino- User haben sollten.

Grüße Uwe

Da in der Arduino-Welt Zeiger kaum beachtet werden ist Deine Information richtig aber kaum verwendet.
Da arbeitet viel mehr mit Globalen Variablen.

Immerhin gibts in unserem C++ das Konzept der Referenzen.
Welche viel sicherer sind, als Pointer.

Dass wir mehr mit “globalen” Dingen arbeiten müssen, liegt an der lustigen setup() loop() Konstruktion. Mit einer, in der sonstigen Welt üblichen, main() würde das anders aussehen.