Guten Morgen,
ich frische grade meine C++ Kenntnisse auf und bin auf etwas gestoßen, was ich mir nicht so recht erklären kann. Ich habe eine eigene Klasse erstellt und dann diverse Methoden dazu. Bei der Erstellung eines Objekts ist mir dann aufgefallen, dass dieses Objekt nicht in anderen Methoden verfügbar ist. Demnach stellt sich die Frage, wie ich innerhalb einer Klasse dafür sorgen kann, dass die Objekte, Variablen usw. auch für andere Methoden der selben Klasse verfügbar sind.
Zur Veranschaulichung sagt etwas Code mehr als viele Worte
test.h:
#include <Arduino.h>
#include <OneWire.h>
#include <DallasTemperature.h>
class Test {
public:
// Konstruktor mit Defaultargumenten
Test (bool useOneWire = true);
// Methoden werden Deklariert
void setupFeatureSerial();
void setupFeatureSerial(int BAUD_RATE);
void setupFeatureOneWire();
void setupFeatureOneWire(uint8_t OneWire_PIN, uint8_t OneWire_Resolution);
uint8_t OneWire_getNumberOfDevices();
private:
int BAUD_RATE;
uint8_t OneWire_PIN;
uint8_t OneWire_Resolution;
bool useOneWire;
};
#endif
test.cpp:
#include "test.h"
#include <OneWire.h>
#include <DallasTemperature.h>
// Konstruktor für die Klasse Test (Achtung: Kein Rückgabewert, auch nicht void!!)
Test::Test(bool useOneWire)
{
this->useOneWire = useOneWire;
}
// Methoden (Funktionen)
void Test::setupFeatureSerial()
{
BAUD_RATE = 115200;
Serial.begin(BAUD_RATE);
int br = Serial.baudRate();
Serial.printf("INFO: Serielle Übertragungsrate ist %d bps", br);
}
void Test::setupFeatureSerial(int BAUD_RATE)
{
this->BAUD_RATE = BAUD_RATE;
Serial.begin(BAUD_RATE);
int br = Serial.baudRate();
Serial.printf("INFO: Serielle Übertragungsrate ist %d bps", br);
}
void Test::setupFeatureOneWire()
{
OneWire_PIN = 16;
OneWire_Resolution = 10;
OneWire oneWire(OneWire_PIN);
DallasTemperature DS18B20(&oneWire);
DS18B20.begin();
DS18B20.setResolution(OneWire_Resolution);
}
void Test::setupFeatureOneWire(uint8_t OneWire_PIN, uint8_t OneWire_Resolution)
{
this->OneWire_PIN = OneWire_PIN;
this->OneWire_Resolution = OneWire_Resolution;
OneWire oneWire(OneWire_PIN);
DallasTemperature DS18B20(&oneWire);
DS18B20.begin();
DS18B20.setResolution(OneWire_Resolution);
}
uint8_t Test::OneWire_getNumberOfDevices()
{
uint8_t numberOfDevices = DS18B20.getDeviceCount();
return numberOfDevices;
}
Offensichtlich kann ich wenn ich die test.h in meine test.ino einbinde in "void setup()" problemlos das Serielle Interface aktivieren.
Auch der Aufruf der setupFeatureOneWire geht, wenn ich aber die Methode OneWire_getNumberOfDevices in die .h/.cpp Datei reinschreibe wirft die IDE einen Fehler, weil "DS18B20" in der Methode nicht deklariert wurde.
Das ist auch einleuchtend was mich zunächst auf die Frage der "Lebensdauer" von Objekten und Variablen gebracht hat. Meine Idee ist es jetzt, das erstellte Objekt an einen in der test.h erstellten Prototyp zu übergeben, wobei ich unsicher bin ob es hilfreich wäre mit Zeigern zu Arbeiten. Möglicherweise möchte ich ja mal einen zweiten OneWire-Bus an einem anderen Pin ansprechen oder eine ScanRoutine implementieren um alle möglichen Pins nach einem vorhandenen Bus zu scannen... da muss ich demnach recht flexibel bleiben
Also wenn mir da jemand nen Denkschubser geben kann bin ich maximal dankbar!
LG Thomas