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