Tei 2 wg. mehr als 9000 Zeichen:
flTSensorBaum.cpp
#include <flTSensorBaum.h>
flTSensorBaum::flTSensorBaum (const byte ONE_WIRE_BUS, const int GeraeteID, DeviceAddress TA[], byte AnzSen) : oneWireA(ONE_WIRE_BUS), sensorsA(&oneWireA) {
_ONE_WIRE_BUS = ONE_WIRE_BUS;
_GeraeteID = GeraeteID;
_TA = TA;
sensorsA.begin(); // library starten
delay(1000);
_AnzTempSensoren = sensorsA.getDeviceCount(); // Sensoren auf dem Bus ermittteln
Serial.print(F("GeraeteID: "));
Serial.println(_GeraeteID);
Serial.print(F("Temperatursenoren werden gesucht... Baum an Pin "));
Serial.println(ONE_WIRE_BUS, DEC);
Serial.print(_AnzTempSensoren, DEC);
Serial.println(F(" Sensoren gefunden"));
TempA = new float [_AnzTempSensoren] ;
lTempA = new float [_AnzTempSensoren] ;
}
void flTSensorBaum::TempMelden() {
switch (_messStatus)
{
case 0 : // Ausgangszustand
// Temperaturermittlung anstoßen
sensorsA.setWaitForConversion(false); // asynchrone Temperaturabfrage geht schneller; jetzt muss aber über die Programmierung sichergestellt werden, dass die Abfrage erst erfolgt, wenn die Convertierung fertig ist. Vorteil: in der Zwischenzeit können andere Befehle abgearbeitet werden.
sensorsA.requestTemperatures(); // alle Temperatursensoren abfragen
_timestamp = millis();
_messStatus++;
break;
case 1 : // Messung ist angestoßen auf Ergebnis warten
if (millis() - _timestamp < _TempConvertZeit) return;
// Ergebnisse Lesen
for (uint8_t i = 0; i < _AnzTempSensoren; i++) {
TempA[i] = sensorsA.getTempC(_TA[i]);
// Differenz zur vorherigen Messung ermitteln, nur bei Abweichung > _MinTempDiff übermitteln
_TempDiff = lTempA[i] - TempA[i];
_TempDiff = abs(_TempDiff); // keine Berechnungen innerhalb abs(); gemäß Doku
if (_TempDiff >= _MinTempDiff) {
// Werte übermitteln 131<DS1820>Sensor: 286ADA1E00004050 23.4</DS1820>
Serial.print(_GeraeteID);
Serial.print(F("<DS1820>Sensor: "));
printAddress(_TA[i]);
Serial.print(F(" "));
Serial.print(TempA[i]); // Temp in Grad C
Serial.println(F("</DS1820>"));
lTempA[i] = TempA[i];
}
}
_timestamp += _TempConvertZeit;
_messStatus++;
break;
case 2 : // Pause bis zur nächsten Messung
if (millis() - _timestamp < _warteInterval) return;
_timestamp += _warteInterval;
_messStatus = 0;
break;
}
}
// Setter
void flTSensorBaum::setTemperature_Precision(byte Temperature_Precision) {
// Sucht die vorhandenen Sensoren, gibt deren Adressen aus und setzt Messgenauigkeit neu
_Temperature_Precision = constrain(Temperature_Precision, 9, 12); // 9 - 12 bit
_AnzTempSensoren = sensorsA.getDeviceCount(); // Sensoren auf dem Bus ermittteln
DeviceAddress neueAdressSammlung[_AnzTempSensoren];
Serial.println(F("Baum an Pin "));
Serial.println(_ONE_WIRE_BUS, DEC);
for (uint8_t i = 0; i < _AnzTempSensoren; i++)
{
Serial.print(F("Sensor "));
Serial.print(i);
Serial.print(F(" Adresse: "));
if (sensorsA.getAddress(neueAdressSammlung[i], i))
{
printAddress(neueAdressSammlung[i]);
// Genauigkeit auf oben definierten bit-Wert setzen
sensorsA.setResolution(neueAdressSammlung[i], _Temperature_Precision);
Serial.print(F(" Genauigkeit: "));
Serial.println(sensorsA.getResolution(neueAdressSammlung[i]), DEC);
}
else
{
Serial.print(F("Adressermittlung nicht moeglich für Sensor "));
Serial.println(i);
}
}
Serial.print(F("Parasitaerer Stromversorgungsmodus Baum an Pin "));
Serial.print(_ONE_WIRE_BUS, DEC);
if (sensorsA.isParasitePowerMode()) Serial.println(F(" ist ON"));
else Serial.println(F(" ist OFF"));
}
void flTSensorBaum::setTempIntervall(unsigned long TempIntervall) {
_warteInterval = constrain(TempIntervall, _TempConvertZeit + 100, 86400000) - _TempConvertZeit; // ConvertZeit und Zeit für Datenübertragung muss sein; 1 Tag ist Obergrenze
}
void flTSensorBaum::setMinTempDiff(float MinTempDiff) {
_MinTempDiff = constrain(MinTempDiff, 0 , 180); // nicht negativ, Messbereich -55 - 125°C -> 180 ist max. Unterschied
}
// zusätzliches Lesen der Temperatursensoren
void flTSensorBaum::JetztLesen() {
if (_messStatus == 2) {
_messStatus = 0;
}
}
// Funktion zur Ausgabe der SensorAddresse
void flTSensorBaum::printAddress(DeviceAddress deviceAddress) {
for (uint8_t i = 0; i < 8; i++) {
// zero pad the address if necessary
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}
Problem bereitet mir noch die Übergabe des Arrays mit den Sensoradressen.
Wie geht das richtig?
Nochmal vielen Dank und @Rentner du hast recht, es ist hart sich das selbst zu erarbeiten, aber um so mehr Freude macht es auch, wenn es dann funktioniert.
Freundliche Grüße
Frank