Hallo zusammen, ich bin gerade dabei ein Lüftersteuerung aufzubauen die sich selbst nach einem eingegebenen Sollwert regelt. Die Programmteile habe ich aus verschiedenen Vorlagen zusammenkopiert und nach bestem Wissen auf meine Bedürfnisse angepasst. Generell war die Funktion bisher auch gegeben!
Ich habe heute den Temperatursensor von einem DHT 11 auf einen DS18B20 gewechselt, da der DHT zu ungenau war.
Seitdem habe ich das Problem, dass meine 4 parallel geschalteten Lüfter in der "Stufe LOW" anlaufen und kurze Zeit später wieder ausgehen. Dabei wird der Temperaturwert des Temperatursensors kurz auf -127 °C angezeigt. Das geschieht immer nur in der Stufe Low und selten in der Stufe 1. Mit dem DHT hatte ich diese Probleme nicht und die Lüfter liefen sauber auf kleinster Stufe! Ich vermute das der one wire Temperatursensor mit der PWM Steuerung für die Lüfter "durcheinander" kommt. Mir fehlt leider die Erfahrung um hier weiterzukommen.
Wer kann helfen?
Verwendete Hardware:
- Arduino Uno
- 12V externe Spannungsversrgung
- Temperatursensor DS18B20
- 4x IRF520 Treiber Modul (parallel angeschlossen)
- Rotary Encoder um die Solltemperatur einzugeben
So verhält sich das Problem: Dropbox - File Deleted
So schaut der Sketch aus:
// Library for I2C / TWI device communication
#include <Wire.h>
// Library to control the LCD screen
#include <LiquidCrystal_I2C.h>
// Library to control Temperature Controler
#include <OneWire.h>
#include <DallasTemperature.h>
/*
* Set the correct chip for your LCD
* Use 0x27 when you have the PCF8574 chip made by NXP
* The last two digits represent the LCD size
* e.g. 20x4 or 16x2
*/
LiquidCrystal_I2C lcd(0x27, 20, 4);
float solltemp = 25; // Setze solltemperatur auf Startwert
volatile int pinA = 4; // Rotary encoder Pin A
int pinB = 3; // Rotary encoder Pin B
volatile int pinAstateCurrent = LOW; // Current state of Pin A
volatile int pinAStateLast = pinAstateCurrent; // Last read value of Pin A
//====================================== Temperatureinstellungen
#define stufe1 solltemp+1
#define stufe2 solltemp+2
#define stufe3 solltemp+3
#define stufe4 solltemp+4
#define stufe5 solltemp+5
//==============================================================
#define ONE_WIRE_BUS 2 //Datenbus für onewire ist auf 2 gesteckt
#define FanPin 9 //Lüfter Pin setzen
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass oneWire reference to Dallas Temperature.
float temp;
String status;
void setup() {
pinMode (pinA, INPUT); // Set PinA as input
pinMode (pinB, INPUT); // Set PinB as input
pinMode(FanPin,OUTPUT); // Set FanPin as output
// Einstellung der PWM Frequenz //
TCCR1B = TCCR1B & B11111000 | B00000001; // set timer 1 divisor to 1 for PWM frequency of 31372.55 Hz
// Atach a CHANGE interrupt to PinB and exectute the update function when this change occurs.
attachInterrupt(digitalPinToInterrupt(pinB), update, CHANGE);
// LCD
lcd.init(); // initialise the LCD
lcd.backlight(); // turn backlight on
//i°2 Sensoren
sensors.begin(); // Startup the library
}
void loop() {
sensors.requestTemperatures(); // Send the command to get temperatures
delay(500); //Verzögerung
temp = sensors.getTempCByIndex(0); //Ausgelesene Temperatur in Variable schreiben
//Show on LCD
lcd.setCursor(0,0);
lcd.print("L\365ftersteuerung");
lcd.setCursor(0,1);
lcd.print("Aktuell: ");
lcd.print(temp);
lcd.print("\337C");
lcd.setCursor(0,2);
lcd.print("Soll: ");
lcd.print(solltemp);
lcd.print("\337C");
lcd.setCursor(0,3);
lcd.print("Status: ");
lcd.print(status);
//Control FAN
if (temp <= solltemp) { digitalWrite(FanPin,LOW); status = "AUS "; }else
if (temp >= stufe5) { digitalWrite(FanPin,HIGH); status = "Stufe-MAX"; }else
if (temp >= stufe4) { analogWrite(FanPin,195); status = "Stufe-4 "; }else
if (temp >= stufe3) { analogWrite(FanPin,155); status = "Stufe-3 "; }else
if (temp >= stufe2) { analogWrite(FanPin,125); status = "Stufe-2 "; }else
if (temp >= stufe1) { analogWrite(FanPin,45); status = "Stufe-1 "; }else
if (temp >= solltemp) { analogWrite(FanPin,25); status = "Stufe-LOW";}
}
//Update Funkiton
void update() {
// ROTATION DIRECTION
pinAstateCurrent = digitalRead(pinA); // Read the current state of Pin A
// If there is a minimal movement of 1 step
if ((pinAStateLast == LOW) && (pinAstateCurrent == HIGH)) {
if (digitalRead(pinB) == HIGH) { // If Pin B is HIGH
solltemp++;
} else {
solltemp--;
}
}
pinAStateLast = pinAstateCurrent; // Store the latest read value in the currect state variable
}```