0-8-15 User
Vice Admiral
- Registriert
- Jan. 2008
- Beiträge
- 7.154
Das ursprüngliche Ziel des Projekts war die Erfassung der Vor- und Rücklauftemperatur sowie der aktuellen Raumtemperatur zur Weiterverwendung in einer softwarebasierten Regelung der Lüfterdrehzahlen (unter Linux).
Nach und nach kamen dann weitere Sensoren hinzu, die zwar (vorerst) keine Verwendung in der Lüfterregelung finden, aber dennoch aufschlussreiche Informationen liefern.
Die Steinhart-Hart Koeffizienten der NTC Widerstände (XSPC Temperatursensoren) wurden nach folgendem Prinzip: https://www.thinksrs.com/downloads/pdfs/applicationnotes/LDC Note 4 NTC Calculator.pdf mit dem SRS Thermistor Calculator (https://www.thinksrs.com/downloads/programs/therm calc/ntccalibrator/ntccalculator.html) bestimmt.
Die Impulsrate des Turbinendurchflussmessers wurde durch Auslitern bestimmt.
Die Sensordaten werden einmal pro Sekunde per USB (seriell) an den Computer übermittelt.
Sämtliche Lüfter sind direkt am Mainboard angeschlossen und werden per Software geregelt. Dabei werden die Radiatorlüfter nach der Wassertemperatur (unter Berücksichtigung der momentanen Vor-, Rücklauf- und Raumtemperatur) und die Gehäuselüfter nach der Temperatur des VRM Kühlkörpers geregelt.
Positionierung der Sensoren:
Die NTC Temperatursensoren TH1 bis TH5 messen die Wassertemperatur vor und nach jeder Komponente im Kreislauf.
Der NTC Temperatursensor TH6 misst die Temperatur des VRM Kühlkörpers. Der Sensor wurde mit Wärmeleitpaste bestrichen und in die Mitte des Kühlkörpers eingeführt.
Die digitalen Temperatursensoren D1 bis D3 messen die Lufttemperatur im jeweiligen Ansaugbereich der drei Radiatoren.
Der digitale Temperatursensor D4 überwacht die Raumtemperatur (außerhalb des direkten Einzugbereichs der Radiatorlüfter).
Exemplarische Visualisierung der Sensordaten:
Quelltext:
Schaltbild:
Nach und nach kamen dann weitere Sensoren hinzu, die zwar (vorerst) keine Verwendung in der Lüfterregelung finden, aber dennoch aufschlussreiche Informationen liefern.
Verwendete Komponenten | Verwendetes Werkzeug |
1 x Arduino Nano 3.x 1 x USB 2.0 Kabel Typ A/Mini-B 2 x 4,7 kΩ, Metallschichtwiderstand 6 x 10 kΩ, 0.1%, Metallschichtwiderstand 1 x Aqua Computer Durchflusssensor high flow 1 x Aqua Computer aquaero Durchflusssensorkabel (optional) 5 x XSPC G1/4 Temperatursensor 1 x XSPC 10k Temperatursensor 4 x DS18B20 Temperaturfühler ~ 100 EUR | Lötkolben Lötzinn Drähte Steckbrücken-Set (optional) Steckboard (optional) Lochrasterplatine, Hartpapier, 50x100mm (optional) Multimeter (optional) |
Die Steinhart-Hart Koeffizienten der NTC Widerstände (XSPC Temperatursensoren) wurden nach folgendem Prinzip: https://www.thinksrs.com/downloads/pdfs/applicationnotes/LDC Note 4 NTC Calculator.pdf mit dem SRS Thermistor Calculator (https://www.thinksrs.com/downloads/programs/therm calc/ntccalibrator/ntccalculator.html) bestimmt.
Die Impulsrate des Turbinendurchflussmessers wurde durch Auslitern bestimmt.
Die Sensordaten werden einmal pro Sekunde per USB (seriell) an den Computer übermittelt.
Sämtliche Lüfter sind direkt am Mainboard angeschlossen und werden per Software geregelt. Dabei werden die Radiatorlüfter nach der Wassertemperatur (unter Berücksichtigung der momentanen Vor-, Rücklauf- und Raumtemperatur) und die Gehäuselüfter nach der Temperatur des VRM Kühlkörpers geregelt.
Positionierung der Sensoren:
Die NTC Temperatursensoren TH1 bis TH5 messen die Wassertemperatur vor und nach jeder Komponente im Kreislauf.
Pumpe -> TH1 -> Bottom_Radiator -> TH2 -> Top_Radiator -> TH3 -> CPU -> TH4 -> GPU -> TH5 -> External_Radiator -> AGB
Der NTC Temperatursensor TH6 misst die Temperatur des VRM Kühlkörpers. Der Sensor wurde mit Wärmeleitpaste bestrichen und in die Mitte des Kühlkörpers eingeführt.
Die digitalen Temperatursensoren D1 bis D3 messen die Lufttemperatur im jeweiligen Ansaugbereich der drei Radiatoren.
Der digitale Temperatursensor D4 überwacht die Raumtemperatur (außerhalb des direkten Einzugbereichs der Radiatorlüfter).
Exemplarische Visualisierung der Sensordaten:
Quelltext:
C:
#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);
}
Schaltbild:
Zuletzt bearbeitet:
(Syntax-Highlighting, Links korrigiert)