Hallo,
könnte mir mal bitte bei folgenden Code helfen, leider verstehe ich einige Funktion nicht. Es geht um die Auslesung der Temperatur von vier DS18B20 Sensoren am Bus 4. Deren Ausgabewert mit der Steinhart Hart Gleichung korrigiert wird.
Hier der komplette Code mit anderen Sensoren wie ein Volumenstromesser. Mich interessieren haber nur die Abschnitte bezüglich der Temperatursensoren:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <FreqMeasure.h>
#define FREQUENCY_TO_LITERS_PER_HOUR 22.78481
#define ADC_PLUS_BITS 5
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Probe1 = { 0x28, 0xFF, 0x2B, 0x2E, 0x72, 0x16, 0x03, 0xA1 }; // Intake air | Bottom radiator
DeviceAddress Probe2 = { 0x28, 0xFF, 0xE5, 0xBF, 0x71, 0x16, 0x04, 0x28 }; // Ambient air
DeviceAddress Probe3 = { 0x28, 0xFF, 0x06, 0x0D, 0x72, 0x16, 0x03, 0x4D }; // Intake air | External radiator
DeviceAddress Probe4 = { 0x28, 0xFF, 0xDC, 0x92, 0x71, 0x16, 0x05, 0xEC }; // Intake air | Top radiator
float read_analog(int pin) {
unsigned long sum = analogRead(pin);
for (int i = 1; i < pow(4, ADC_PLUS_BITS); i++) {
sum += analogRead(pin);
}
return (sum >> ADC_PLUS_BITS) / pow(2, ADC_PLUS_BITS);
}
float get_analog_temp(int thermistor) {
const float A[6] = {1.111424e-03, 1.537616e-03, 1.250530e-03, 1.512060e-03, 1.640398e-03, 1.613705e-03};
const float B[6] = {2.225275e-04, 1.599151e-04, 2.081287e-04, 1.635745e-04, 1.472821e-04, 1.516699e-04};
const float C[6] = {2.427177e-07, 4.491194e-07, 2.482240e-07, 4.305526e-07, 4.650907e-07, 4.490601e-07};
const int SENSE_RESISTOR[] = {9963, 9970, 9946, 9988, 9964, 9962};
float v = read_analog(thermistor);
if (v < 263) return 0.0;
if (v > 882) return 80.0;
float r = SENSE_RESISTOR[thermistor] * ((1023.0 / v) - 1.0);
return (1.0 / (A[thermistor] + B[thermistor] * log(r) + C[thermistor] * pow(log(r), 3))) - 273.15;
}
float get_digital_temp(int probe) {
switch (probe) {
case 1:
return sensors.getTempC(Probe1);
case 2:
return sensors.getTempC(Probe2);
case 3:
return sensors.getTempC(Probe3);
case 4:
return sensors.getTempC(Probe4);
default:
return 0;
}
}
float get_flow_rate() {
float duration = 0;
int samples = 0;
while (FreqMeasure.available()) {
duration += FreqMeasure.read();
samples++;
}
return FreqMeasure.countToFrequency(duration) * FREQUENCY_TO_LITERS_PER_HOUR * samples;
}
void setup() {
Serial.begin(9600);
FreqMeasure.begin();
analogReference(EXTERNAL);
ADCSRA &= ~(bit (ADPS0) | bit (ADPS1) | bit (ADPS2));
ADCSRA |= bit (ADPS1) | bit (ADPS2);
sensors.begin();
sensors.setResolution(Probe1, 12);
sensors.setResolution(Probe2, 12);
sensors.setResolution(Probe3, 12);
sensors.setResolution(Probe4, 12);
sensors.setWaitForConversion(false);
}
void loop() {
//unsigned long timer = millis();
sensors.requestTemperatures();
String output = "";
for (int i = 0; i < 6; i++) {
output += get_analog_temp(i);
output += " ";
}
delay(500);
for (int i = 1; i < 5; i++) {
output += get_digital_temp(i);
output += " ";
}
output += get_flow_rate();
Serial.println(output);
//Serial.println(millis() - timer);
}
Nun zu meinen Fragen:
Was genau tut diese Funktion
#define ADC_PLUS_BITS 5
float read_analog(int pin) {
unsigned long sum = analogRead(pin);
for (int i = 1; i < pow(4, ADC_PLUS_BITS); i++) {
sum += analogRead(pin);
}
return (sum >> ADC_PLUS_BITS) / pow(2, ADC_PLUS_BITS);
Welchen Sinn ergibt dieses Array, das ja aus sechs verschiedenen Koffizienten besteht, obwohl nur vier Sensoren angeschlossen sind und wie wird sicher gestellt, das für jeden Sensor die richtigen Koeffizienten zugewiesen werden
float get_analog_temp(int thermistor) {
const float A[6] = {1.111424e-03, 1.537616e-03, 1.250530e-03, 1.512060e-03, 1.640398e-03, 1.613705e-03};
const float B[6] = {2.225275e-04, 1.599151e-04, 2.081287e-04, 1.635745e-04, 1.472821e-04, 1.516699e-04};
const float C[6] = {2.427177e-07, 4.491194e-07, 2.482240e-07, 4.305526e-07, 4.650907e-07, 4.490601e-07};
const int SENSE_RESISTOR[] = {9963, 9970, 9946, 9988, 9964, 9962};
Was genau bewirkt diese Funktion?
float v = read_analog(thermistor);
if (v < 263) return 0.0;
if (v > 882) return 80.0;
Unterschiedliche Spannung des DS18B20 bei verschiedenen Temperaturen?
Danke