INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Mit 1wire Temperaturwerten weiter rechnen
26.08.2013, 11:22
Beitrag #1
Mit 1wire Temperaturwerten weiter rechnen
Hallo Forengemeinde!
Ich bin seit circa zwei Wochen stolzer Besitzer eines Arduino UNO.
Nun hab ich mich schon ein wenig eingelesen und eingearbeitet.
Ich lese mit dem Arduino zwei 1wire Sensoren aus, die mir jeweils einen Temperaturwert vom Wasser geben.
Das funktioniert auch soweit ganz gut.
Ich benötige aber jetzt aus dem Code, den ich übrigens aus dem Netz habe, die jeweiligen Temperaturen um damit weiter zu rechnen. Die Adressen und die Bezeichnung hab ich in meinem Sketch angepasst. Dies hier ist nur das Beispiel aus dem Netz.
Ich hab vorher noch nie irgendeine Programmiersprache gelernt, daher hier die Frage.
So wie ich das verstanden habe, kann ich vor der ganzen void setup() doch Variablen deklarieren.

ich würde gerne die unterschiedlichen Temperaturen jeweils in eine Variable ablegen.
Hätte jetzt gedacht ich kann
A= float tempC1
B= float tempC2
schreiben, aber muss ich dann den Variablen noch die Adresse wieder zuordnen?
Außerdem hat der Programmierer das ja schon gemacht denke ich.
Nur holt er 3 Werte gleichzeitig??
Ich glaub ich hab einfach etwas verdreht und falsch verstanden.Confused
Wäre schön wenn das jemand einfach erklären könnte.
Vielen Dank.



// This Arduino sketch reads DS18B20 "1-Wire" digital
// temperature sensors.
// Copyright © 2010 Mark McComb, hacktronics LLC
// License: http://www.opensource.org/licenses/mit-license.php (Go crazy)
// Tutorial:
// http://www.hacktronics.com/Tutorials/ard...orial.html

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

// Data wire is plugged into pin 3 on the Arduino
#define ONE_WIRE_BUS 3

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

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

// Assign the addresses of your 1-Wire temp sensors.
// See the tutorial on how to obtain these addresses:
// http://www.hacktronics.com/Tutorials/ard...inder.html

DeviceAddress insideThermometer = { 0x28, 0x94, 0xE2, 0xDF, 0x02, 0x00, 0x00, 0xFE };
DeviceAddress outsideThermometer = { 0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 };
DeviceAddress dogHouseThermometer = { 0x28, 0x59, 0xBE, 0xDF, 0x02, 0x00, 0x00, 0x9F };

void setup(void)
{
// start serial port
Serial.begin(9600);
// Start up the library
sensors.begin();
// set the resolution to 10 bit (good enough?)
sensors.setResolution(insideThermometer, 10);
sensors.setResolution(outsideThermometer, 10);
sensors.setResolution(dogHouseThermometer, 10);
}

void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
Serial.print("Error getting temperature");
} else {
Serial.print("C: ");
Serial.print(tempC);
Serial.print(" F: ");
Serial.print(DallasTemperature::toFahrenheit(tempC));
}
}

void loop(void)
{
delay(2000);
Serial.print("Getting temperatures...\n\r");
sensors.requestTemperatures();

Serial.print("Inside temperature is: ");
printTemperature(insideThermometer);
Serial.print("\n\r");
Serial.print("Outside temperature is: ");
printTemperature(outsideThermometer);
Serial.print("\n\r");
Serial.print("Dog House temperature is: ");
printTemperature(dogHouseThermometer);
Serial.print("\n\r\n\r");
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.08.2013, 17:12
Beitrag #2
RE: Mit 1wire Temperaturwerten weiter rechnen
(26.08.2013 11:22)IngHam schrieb:  Hallo Forengemeinde!
Ich bin seit circa zwei Wochen stolzer Besitzer eines Arduino UNO.
Nun hab ich mich schon ein wenig eingelesen und eingearbeitet.
Ich lese mit dem Arduino zwei 1wire Sensoren aus, die mir jeweils einen Temperaturwert vom Wasser geben.
Das funktioniert auch soweit ganz gut.
Ich benötige aber jetzt aus dem Code, den ich übrigens aus dem Netz habe, die jeweiligen Temperaturen um damit weiter zu rechnen. Die Adressen und die Bezeichnung hab ich in meinem Sketch angepasst. Dies hier ist nur das Beispiel aus dem Netz.
Ich hab vorher noch nie irgendeine Programmiersprache gelernt, daher hier die Frage.
So wie ich das verstanden habe, kann ich vor der ganzen void setup() doch Variablen deklarieren.

ich würde gerne die unterschiedlichen Temperaturen jeweils in eine Variable ablegen.
Hätte jetzt gedacht ich kann
A= float tempC1
B= float tempC2
schreiben, aber muss ich dann den Variablen noch die Adresse wieder zuordnen?
Außerdem hat der Programmierer das ja schon gemacht denke ich.
Nur holt er 3 Werte gleichzeitig??
Ich glaub ich hab einfach etwas verdreht und falsch verstanden.Confused
Wäre schön wenn das jemand einfach erklären könnte.
Vielen Dank.



// This Arduino sketch reads DS18B20 "1-Wire" digital
// temperature sensors.
// Copyright © 2010 Mark McComb, hacktronics LLC
// License: http://www.opensource.org/licenses/mit-license.php (Go crazy)
// Tutorial:
// http://www.hacktronics.com/Tutorials/ard...orial.html

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

// Data wire is plugged into pin 3 on the Arduino
#define ONE_WIRE_BUS 3

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

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

// Assign the addresses of your 1-Wire temp sensors.
// See the tutorial on how to obtain these addresses:
// http://www.hacktronics.com/Tutorials/ard...inder.html

DeviceAddress insideThermometer = { 0x28, 0x94, 0xE2, 0xDF, 0x02, 0x00, 0x00, 0xFE };
DeviceAddress outsideThermometer = { 0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 };
DeviceAddress dogHouseThermometer = { 0x28, 0x59, 0xBE, 0xDF, 0x02, 0x00, 0x00, 0x9F };

void setup(void)
{
// start serial port
Serial.begin(9600);
// Start up the library
sensors.begin();
// set the resolution to 10 bit (good enough?)
sensors.setResolution(insideThermometer, 10);
sensors.setResolution(outsideThermometer, 10);
sensors.setResolution(dogHouseThermometer, 10);
}

void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
Serial.print("Error getting temperature");
} else {
Serial.print("C: ");
Serial.print(tempC);
Serial.print(" F: ");
Serial.print(DallasTemperature::toFahrenheit(tempC));
}
}

void loop(void)
{
delay(2000);
Serial.print("Getting temperatures...\n\r");
sensors.requestTemperatures();

Serial.print("Inside temperature is: ");
printTemperature(insideThermometer);
Serial.print("\n\r");
Serial.print("Outside temperature is: ");
printTemperature(outsideThermometer);
Serial.print("\n\r");
Serial.print("Dog House temperature is: ");
printTemperature(dogHouseThermometer);
Serial.print("\n\r\n\r");
}

Hallo IngHam,

ich bin jetzt auch nicht so der Spezi, aber wenn ich dich richtig verstanden habe, willst du lediglich jeweils den (aktuellen) Wert (A-C) in einer Variable speichern, um dann diese weiter zu verarbeiten?
Im Prinzip ist schon alles da Smile Um die Adressen brauchst du dich nicht mehr zu kümmern.
In dem Loop wird ständig die selbst deklarierte Funktion "PrintTemperature(insideThermometer);" aufgerufen und die Adresse+Wert über den Parameter "insideThermometer " übergeben.

Die Funktion "PrintTemperature" durchläuft dann ständig die Ausgabe per Serial.print.
Es gibt nun verschiedene Möglichkeiten die Fühlerwerte in Variablen abzuspeichern. Ich würde es so machen:

.....
//vor dem Setup erstmal Variablen deklarieren
static float fuehlerA;
static float fuehlerB;
static float fuehlerC;

DeviceAddress insideThermometer = { 0x28, 0x94, 0xE2, 0xDF, 0x02, 0x00, 0x00, 0xFE };
DeviceAddress outsideThermometer = { 0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 };......

.....
void loop(void)
{
delay(2000);
Serial.print("Getting temperatures...\n\r");
sensors.requestTemperatures();
//Variable A bekommt über den Funktionsaufruf zum entsprechenden Fühler den aktuellen Wert zugeordnet
fuehlerA = printTemperature(insideThermometer);
Serial.print("Inside temperature is: " + fuehlerA);
Serial.print("\n\r");

//Variable B bekommt über den Funktionsaufruf zum entsprechenden Fühler den aktuellen Wert zugeordnet
fuehlerB = printTemperature(outsideThermometer);
Serial.print("Outside temperature is: "+ fuehlerB);
Serial.print("\n\r");

//Variable C bekommt über den Funktionsaufruf zum entsprechenden Fühler den aktuellen Wert zugeordnet
fuehlerC =printTemperature(dogHouseThermometer);
Serial.print("Dog House temperature is: " + fuehlerC);
Serial.print("\n\r\n\r");
}
.....

Den Code habe ich mir gerade aus dem Ärmel geschüttelt. Ob das Zuweisen der Wertes zur Variablen über direkten Funktionsaufruf so einfach geht weiß ich gerade nicht. Kann sein, daß es: fuehlerA = float printTemperature(insideThermometer);
heißen muss.
Das Serial.print kann man zum Testen erstmal drin lassen Smile
Per static float sollten die Werte dann immer aufrufbar sein.

An die Cracks: Ich lasse mich gern korrigieren falls ich gerade totalen blödsinn geschrieben habe.

Viele Grüße
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.08.2013, 19:40
Beitrag #3
RE: Mit 1wire Temperaturwerten weiter rechnen
Hallo!
Vielen Dank für Deinen Post.
Ich hab jetzt versucht die Variablen so zu benennen.
Soweit so gut.
Dann hab ich stumpf die LoopFunktion gegen Deine ausgetauscht.
Jetzt kommt die Fehlermeldung die Du im Anhang siehst.

Hab dann das mit dem float for serialprint versucht, aber leider nichts.

Kannst Du mit der Fehlermeldung etwas anfangen?
   

Schönen Gruß
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.08.2013, 20:31
Beitrag #4
RE: Mit 1wire Temperaturwerten weiter rechnen
(26.08.2013 19:40)IngHam schrieb:  Hallo!
Vielen Dank für Deinen Post.
Ich hab jetzt versucht die Variablen so zu benennen.
Soweit so gut.
Dann hab ich stumpf die LoopFunktion gegen Deine ausgetauscht.
Jetzt kommt die Fehlermeldung die Du im Anhang siehst.

Hab dann das mit dem float for serialprint versucht, aber leider nichts.

Kannst Du mit der Fehlermeldung etwas anfangen?


Schönen Gruß

Hallo,
sorry, dass nun erstmal gar nicht mehr geht. Ich hatte soetwas fast befürchtet. Mir ist was aufgefallen, was ich vorher übersehen habe. Ich hatte einen Rückgabewert erwartet, der aber gar nicht kommt. Stattdessen wird nur die Funktion zur Ausgabe des Wertes des aufgerufenen Fühlers aufgerufen und dann einfach nacheinander ausgegeben.
Neuer Versuch:
//vor dem Setup erstmal wieder Variablen deklarieren
static float fuehlerA;
static float fuehlerB;
static float fuehlerC;

Nimm bitte für den Rest deinen originalen Quellcode und ersetze nur:
...
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
Serial.print("Error getting temperature");
} else {

if (DeviceAddress == insideThermometer){
fuehlerA= tempC;
Serial.println("Variable FuehlerA: " + fuehlerA);
}
if (DeviceAddress == outsideThermometer){
fuehlerB= tempC;
Serial.println("Variable FuehlerB: " + fuehlerB);
}
if (DeviceAddress == dogHouseThermometer){
fuehlerC= tempC;
Serial.println("Variable FuehlerC: " + fuehlerC);
}
Serial.print("C: ");
Serial.print(tempC);
Serial.print(" F: ");
Serial.print(DallasTemperature::toFahrenheit(tempC));
}
}
...


Es ist für mich etwas schwierig dir einen lauffähigen Code zu liefern, da ich ihn selber nicht testen kann. Mein Problem ist, ich weiss nicht ob die IF Abfrage so funktioniert, oder ob man das noch anders zusammensetzen muss. So sollte es aber in die richtige Richtung gehen.

Gruß
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.08.2013, 10:32
Beitrag #5
RE: Mit 1wire Temperaturwerten weiter rechnen
Hallo Arduzo!
vielen Dank für Deine Hilfe. Habe etwas rumprobiert, doch beim Überprüfen kommen Fehlermeldungen die ich als Beginner nicht so ganz verstehe.
Ich möchte aber auch keine vorgekaute Lösung, die ich auch nicht verstehe.Big Grin

Ich versuche jetzt erstmal den Code richtig zu deuten. dann kommt man schneller zum Ziel. Hab zwar Bücher und Tutorials schon durch, aber teilweise ist es mir zu zerhackt dargestellt.
Ich hab in den Sketch mal ein paar Kommentare von mir geschrieben. Eigentlich sind es eher Fragen Wink
Vielleicht kannst Du etwas dazu schreiben. dann komm ich bestimmt schon ne Ecke weiter.
Hier mein Sketch:

#include <OneWire.h> // ist soweit klar
#include <DallasTemperature.h> // ist soweit klar

// Data wire PIN 3 am Arduino
#define ONE_WIRE_BUS 3

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. //Wird hier den Sensoren gesagt, das sie auf das programmierte hören sollen?
DallasTemperature sensors(&oneWire);

// Assign the addresses of your 1-Wire temp sensors.
// See the tutorial on how to obtain these addresses:
// http://www.hacktronics.com/Tutorials/ard...inder.html

DeviceAddress insideThermometer = { 0x28, 0x94, 0xE2, 0xDF, 0x02, 0x00, 0x00, 0xFE }; // hier kommt die Nummer meines ersten Sensors hin
DeviceAddress outsideThermometer = { 0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 }; // hier kommt die Nummer meines zweiten Sensors hin
DeviceAddress dogHouseThermometer = { 0x28, 0x59, 0xBE, 0xDF, 0x02, 0x00, 0x00, 0x9F }; // hier kommt die Nummer meines dritten Sensors hin

void setup(void)
{
// start serial port
Serial.begin(9600);
// Start up the library
sensors.begin();
// set the resolution to 10 bit (good enough?) //Alles fein soweit
sensors.setResolution(insideThermometer, 10);
sensors.setResolution(outsideThermometer, 10);
sensors.setResolution(dogHouseThermometer, 10);
}

void printTemperature(DeviceAddress deviceAddress) // Wiso steht hier zweimal deviceAddress?? [/color]

{

float tempC = sensors.getTempC(deviceAddress);

// wiso wird hier nicht jeder Sensor einzeln abgefragt? Ist das so etwas wie ne Sammelabfrage?
// ich hätte hier erwartet float tempC = sensors.getTempC(insideThermometer) und so auch für die anderen Beiden
// weil die Auflösung wird ja oben auch pro Sensor gemacht! sensors.setResolution(insideThermometer, 10);

//Eigentlich ist das der Größte Knackpunkt. Bei der LOOP Funktion wird ja auch immer jeder Wert einzeln hingeschrieben.[/color]


if (tempC == -127.00) {
Serial.print("Error getting temperature");

} else {
Serial.print("C: ");
Serial.print(tempC);
Serial.print(" F: ");
Serial.print(DallasTemperature::toFahrenheit(tempC));
}

}




void loop(void)
{
delay(2000);
Serial.print("Getting temperatures...\n\r");
sensors.requestTemperatures();

Serial.print("Inside temperature is: ");
printTemperature(insideThermometer);
Serial.print("\n\r");
Serial.print("Outside temperature is: ");
printTemperature(outsideThermometer);
Serial.print("\n\r");
Serial.print("Dog House temperature is: ");
printTemperature(dogHouseThermometer);
Serial.print("\n\r\n\r");
}


Also ein paar Fragen sind es schon, aber die Beantwortung hilft bestimmt auch Anderen hier.
Jetzt müsste ich dann im Code noch so etwas unterbringen:
[color=#32CD32]Gib mir den Wert Temp von Fühler 1 und pack ihn in die float Variable 1! das ganze noch zweimal für die anderen Fühler.
Dann benötige ich noch eine Variable 4 die das Ergebnis von irgendwelchen Rechnungen mit den anderen 3 Variablen ist. Aber das chönschreiben kommt zum Schluss Blush


Vielen Dank schonmal Smile
Ingo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.08.2013, 16:20 (Dieser Beitrag wurde zuletzt bearbeitet: 29.08.2013 08:24 von rkuehle.)
Beitrag #6
RE: Mit 1wire Temperaturwerten weiter rechnen
Hallo Ingo,
versuche es mal wie folgt: weiß jetzt nicht wie man Code einfügt;-(((
Das Beispiel hat zwei Sensoren. Je Sensor gibt es eine float-Variable die die Ausgabe des Sensors aufnimmt. Die Variablen temp1 und temp2 kann man dann weiterverwenden. Wenn man mit den Ausgabewerten arbeiten möchte zB. Differenzen, müssen diese auf Variablen gleichen Typs gesetzt werden.

// Includes
#include <OneWire.h> // 1Wire Funktionen
#include <DallasTemperature.h> // Temperaturfühler
// Variablen
/* Daten-PIN für OneWire auf 5 Bei mehr als einem Sensor ist nur e i n PullUp
// Widerstand erforderlich
#define ONE_WIRE_BUS 5
// Ausgabevariablen für die Sensoren
float temp1;
float temp2;
// Extravariable für tempdiff
float tempdiff;
// OneWire - Instanz erstellen - der Bus wird also aktiviert
OneWire oneWire(ONE_WIRE_BUS);
// Ankopplung Sensoren an OneWire Bus - den Sensoren sagen an welchem Bus sie "hängen". Man kann ja auch mehrere getrennte "Busse" aktivieren
DallasTemperature sensors(&oneWire);
void setup()
{
// Index muss je nach Adresse getauscht werden -> anpassen
// Die Adressen selbst muss man jedoch nicht extra ermitteln
// Durch "anheizen" ermitteln welcher Sensor welchen Index hat
// Dallas Sensoren starten
sensors.begin();
// Resolution setzen
sensors.setResolution(0,10);
sensors.setResolution(1,10);
// Serial Monitor starten
serial.begin(9600);
void loop()
{
// Delay da Dallas Sensoren laut Datenblatt nur alle 2 Sekunden
// sauber auslesen können
delay(2000);
// A L L E am OneWireBus befindlichen Dallas Sensoren werden aufgefordert
// die Temperaturen zu messen
sensors.requestTemperatures();
// Ausgabe direkt in Celsius
// bei vielen Sensoren könnte man hier auch eine For-Schleife nutzen
// die For-Variable wäre dann der Index
temp1 = sensors.getTempCByIndex(0);
temp2 = sensors.getTempCByIndex(1);
// Differenz berechnen
tempdiff=temp2-temp1;
// hier dann die Ausgaben auf Serial oder sonstwo hin
// bei vielen Sensoren könnte man hier auch eine For-Schleife nutzen
// die For-Variable wäre dann der Index
Serial.print("Temp Sensor 1");
serial.println(temp1);
Serial.print("Temp Sensor 2");
serial.println(temp2);
Serial.print("Tempdiff");
serial.println(tempdiff);
}

Vielleicht hilft es ja weiter!?

Die Fragen / Bemerkungen in deinem Beitrag waren völlig berechtig. Insgesamt war der Code viel zu kompliziert aufgebaut.

Grüße Ricardo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Rechnen mit float und unsigned long Rudi 3 306 03.06.2016 12:41
Letzter Beitrag: hotsystems
  Rechnen mit dem Arduino Rudi 15 1.072 30.03.2016 13:31
Letzter Beitrag: Rudi
Question Rechnen in C - Was ist denn nun richtig? Stephan_56 17 1.233 27.03.2016 11:31
Letzter Beitrag: ardu_arne
  Arduino kann nicht rechnen?! Maxi290997 11 1.251 16.12.2015 16:26
Letzter Beitrag: amithlon
  Ich weiß nimmer weiter bergfrei 5 688 03.06.2015 20:18
Letzter Beitrag: bergfrei
Information Rechnen mit variablen Jim 3 1.826 22.05.2015 16:44
Letzter Beitrag: Jim
  Arduino Reaktionsspiel / Komme nicht weiter:/ Firellix 2 1.903 08.03.2015 16:32
Letzter Beitrag: Foto-Ralf

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste