Pages: [1]   Go Down
Author Topic: subroutine -werteübergabe.. was mache ich falsch??  (Read 789 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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);
}
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Sr. Member
****
Karma: 1
Posts: 353
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Sr. Member
****
Karma: 1
Posts: 353
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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:
Code sollte immer hier rein. Dann ist auch der Thread besser strukturiert   ;)


gruß/hk007
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20193
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
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.

Code:
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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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:
Code:
void loop(void){
temp_in;
  Serial.println(temp1);
  Serial.println(temp2); }
void temp_in()
{
temp1= analogRead(A3);
temp2= analogRead(A5);
}
oder:
Code:
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


« Last Edit: October 26, 2012, 01:54:24 pm by uwefed » Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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();"
Code:

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);
}

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1]   Go Up
Jump to: