subroutine -werteübergabe.. was mache ich falsch??

Projekt: Auslesen von mehreren Temperaturen aus Dallas 18B20 in subroutine
Ausgabe im Hauptprogramm.
Die Variablen sind als global definiert-sollten also auch übergeben werden??
(wenn ich die Anweisungen aus void temp_in ins Hauptprogramm übernehme arbeitet es problemlos!
Beispiel:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
float temp1;
float temp2;
int grenzwert=21;

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

void setup(void)
{
// start serial port
pinMode(3, OUTPUT);
Serial.begin(9600);
lcd.begin(16, 2); // start the library
lcd.setCursor(0,0);

// Start up the library
sensors.begin();
}

void loop(void)
{
temp_in(temp1,temp2);
//Ausdruck der beiden Temperaturen
delay(500);
lcd.setCursor(0,0);
lcd.print("T1: ");
lcd.print(temp1);
lcd.setCursor(0,1);
lcd.print("T2: ");
lcd.print(temp2);
if (temp2>grenzwert)
{digitalWrite(3,HIGH);
Serial.print("High");}
else
digitalWrite(3,LOW);
Serial.println(temp1);
//Serial.println(temp2);

}
void temp_in(float temp1,float temp2)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
sensors.requestTemperatures(); // Send the command to get temperatures
temp1=sensors.getTempCByIndex(0);
temp2=sensors.getTempCByIndex(1);
Serial.println(temp2);
}

Hi,

Du hast in deiner Unterroutine neben der globalen temp1 eben auch den parameter temp1 --> und genau der zieht. Nur werden Parameter nicht per default zurückgegeben.
Das war hier erst vor kurzem:
http://arduino.cc/forum/index.php/topic,128716.0.html

Hi,
ich weiss auch nicht, was du mit der Übergabe ins Unterprogramm gewinnst. Du rufst es ja nur einmal auf, und benutzt es nicht als Multiinstanz.
So wie ich den Code übersehe, kannst du im Unterprogramm auch direkt deine globalen Temps auslesen. Da brauchst du nix zu übergeben.
Es geht dir ja nur darum, den Code etwas zu strukturieren, oder?

Gruß/hk007

Hallo!

Da hast du völlig recht..ich möchte meine Progrämmchen besser strukturieren..
und ich möchte dadurch auch besser programmieren lernen.
Inzwischen hab ich es so gelöst:

dank: http://arduino.cc/forum/index.php/topic,128651.0.html

schaut so aus:
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
//Datentyp für Temperatur
struct temperatur {
float temp1;
float temp2;
};
int KTY;
float t1;
float t2;

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

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

void loop() {
struct temperatur my_temp = lese_temp();
KTY=(analogRead(A5))*64/101-148;//Umrechnung Widerstand/Temp
t1=( my_temp.temp1);
t2=( my_temp.temp2);
Serial.println(t1);
Serial.println(t2);
Serial.println(KTY);
delay(500);
}
//Funktion die zwei Werte in einem struct zurückliefert
struct temperatur lese_temp() {
struct temperatur t;
sensors.requestTemperatures(); // Send the command to get temperatures
t.temp1 =sensors.getTempCByIndex(0);
t.temp2 = sensors.getTempCByIndex(1);
return t;
}
grüsse peter

und ich möchte dadurch auch besser programmieren lernen.

Ok.
Zum Strukturieren verwende ich auch gerne die Tabfunktion von der Arduino-IDE. (Oben rechts unter der Lupe ist ein Pfeil nach unten)
Damit zerlege ich meinen Code immer in logische Einheiten.

BTW:

Code sollte immer hier rein. Dann ist auch der Thread besser strukturiert   ;)

gruß/hk007

-Holger-:
Hi,
Du hast in deiner Unterroutine neben der globalen temp1 eben auch den parameter temp1 --> und genau der zieht. Nur werden Parameter nicht per default zurückgegeben.
Das war hier erst vor kurzem:
http://arduino.cc/forum/index.php/topic,128716.0.html

Der Unterschied ist:

float temp1;
float temp2;
...
void temp_in(float temp1,float temp2)
{
  sensors.requestTemperatures(); // Send the command to get temperatures
  temp1=sensors.getTempCByIndex(0);
  temp2=sensors.getTempCByIndex(1);  
}

Hier werden lokale Variablen mit den gleichen Namen wie die globalen definiert. Die lokalen Variablen werden in der Funktion verwendet und sind dann nur innerhalb der Funktion gültig.

float temp1;
float temp2;
...
void temp_in()
{
  sensors.requestTemperatures(); // Send the command to get temperatures
  temp1=sensors.getTempCByIndex(0);
  temp2=sensors.getTempCByIndex(1);  
}

Hier werden die globalen Variablen verwendet.

grüße Uwe

Hallo!
Hab nochmals herumprobiert: an A3 und A5 jeweils Poto,
Programm vereinfacht:

int temp1;
int temp2;
void setup(void){
  // start serial port
  Serial.begin(9600);}
void loop(void){ 
temp1= analogRead(A3);
temp2= analogRead(A5);
  Serial.println(temp1);
  Serial.println(temp2);}

übergibt natürlich die entsprechenden Werte
bei:

void loop(void){ 
temp_in;
  Serial.println(temp1);
  Serial.println(temp2); }
void temp_in()
{
temp1= analogRead(A3);
temp2= analogRead(A5);
}

oder:

void loop(void){ 
temp_in;
  Serial.println(temp1);
  Serial.println(temp2); }
void temp_in(int temp1,int temp2)
{
temp1= analogRead(A3);
temp2= analogRead(A5);
}

wird in jedem Fall 0 ausgegeben, also die Variable gar nicht geändert
versteh ich nicht!
gruss peter

  1. Bitte verwende Für Deinen Code die "#" Tags, das macht es einfacher.
  2. Definierst Du Deine Funktion "in()" innerhalb von loop() und damit an der falsche Stelle.
  3. Der Aufruf temp_in; ist auch falsch. Funktionen werden mit den "()" aufgerufen, also "temp_in();"
int temp1;
int temp2;
void setup(void){
  // start serial port
  Serial.begin(9600);
}
  

void loop(void){
  temp_in();
  Serial.println(temp1);
  Serial.println(temp2);
  delay(2000); 
}
  
void temp_in()
{
temp1= analogRead(A3);
temp2= analogRead(A5);
}

Vielen Dank!
Jetzt hab ichs kapiert

Das Werteübergeben hab ich nun auf 2 Methoden gelöst
1)mit struct
2)globalen Variablen
als nächstes muss ich es mit Zeigern versuchen

gruss peter