Hallo Community,
ich habe für meinen 3D-Drucker eine Temperaturreglung gebaut. Leider habe ich das Problem das nach ein paar Stunden der Arduino einfriert und nur ein resett hilft die Reglung wieder zu starten. Bis er sich aufhängt funktioniert alles wie es gewünscht ist.
Folgende Bauteile wurden verbaut.
-Arduino Uno
-LCD 16x2 mit I2C
-2x DHT 22
-10kohm Poti
-Meanwell RS15 Spannungsversorgung
-Noctua PWM FAN
Schaltplan im Anhang
Kurze Funktionsbeschreibung:
-mit Poti lässt sich die Soll Temp zwischen min und max einstellen.
-der Mittelwert der zwei DHT22 wird für die Temperaturreglung verwendet (alle 2 sek. wird Temp abgefragt)
-Dutycycle (PWM) Lüfter 10%-100% also der Lüfter läuft immer mit mind. 10%
-stellt man das Poti auf min dann soll der Lüfter unabhängig von der Temperatur mit 100% laufen
-stellt man das Poti auf max dann soll der Lüfter unabhängig von der Temperatur auf 10% laufen
-erste Zeile LCD zeigt die Soll Temp an oder ob Lüfter auf max oder min gestellt ist
-zweite Zeile LCD zeigt die Ist Temp und die aktuelle Geschwindigkeit des Lüfters
#include <TimerOne.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#define DHTPIN3 3
#define DHTPIN2 2
#define DHTTYPE DHT22
DHT dht2(DHTPIN2, DHTTYPE);
DHT dht3(DHTPIN3, DHTTYPE);
LiquidCrystal_I2C lcd(0x27,16,2);
int Poti = 0;
int wechsler = 0;
int min_temp = 10;
int max_temp = 60;
float soll_temp = 0;
float ist_temp =0;
float t2 = 0;
float t1 = 0;
float dutyCycle_P = 0;
unsigned long Startzeit_1 = 0;
unsigned long Startzeit_2 = 0;
unsigned long Startzeit_3 = 0;
const int fanPin = 9;
float dutyCycle = 0;
void setup() {
// put your setup code here, to run once:
lcd.init();
Timer1.initialize(40); // 40 us = 25 kHz
Serial.begin(9600);
dht2.begin();
dht3.begin();
}
void loop() {
// put your main code here, to run repeatedly:
Poti = analogRead(A0);
soll_temp = map(Poti, 0, 1023, min_temp, max_temp);
//Serial.println(soll_temp);
lcd.backlight();
//Nachricht ausgeben
if ((soll_temp > min_temp) && (soll_temp < max_temp))
{
lcd.setCursor(0,0);
lcd.print("Soll Temp ");
lcd.setCursor(10,0);
lcd.print(soll_temp,1);
lcd.setCursor(14,0);
lcd.print(" C");
}
else if (soll_temp < (min_temp + 1))
{
lcd.setCursor(0,0);
lcd.print(" Luefter 100% ");
}
else if (soll_temp > (max_temp -1 ))
{
lcd.setCursor(0,0);
lcd.print(" Luefter 10% ");
}
if ((millis() - Startzeit_2) > 4000)
{
if (wechsler == 0)
{
lcd.setCursor(0,1);
lcd.print("Ist Temp");
lcd.setCursor(10,1);
lcd.print(ist_temp,1);
lcd.setCursor(14,1);
lcd.print(" C");
wechsler = 1;
}
else if (wechsler == 1)
{
if (dutyCycle == 100)
{
lcd.setCursor(0,1);
lcd.print("FAN Speed ");
lcd.setCursor(11,1);
lcd.print(dutyCycle,0);
lcd.setCursor(14,1);
lcd.print(" %");
}
if (dutyCycle < 100)
{
lcd.setCursor(0,1);
lcd.print("FAN Speed ");
lcd.setCursor(12,1);
lcd.print(dutyCycle,0);
lcd.setCursor(14,1);
lcd.print(" %");
}
wechsler = 0;
}
Startzeit_2 = millis();
}
if ((millis() - Startzeit_1) > 2000)
{
t1 = dht2.readTemperature();
t2 = dht3.readTemperature();
Startzeit_1 = millis();
//Serial.print(millis());
//Serial.print(t1);
//Serial.print(t2);
}
ist_temp = (t1 + t2) / 2;
if ((soll_temp > min_temp) && (soll_temp < max_temp))
{
if ((millis() - Startzeit_3) > 2000)
{
dutyCycle_P = dutyCycle_P + (ist_temp - soll_temp);
if (dutyCycle_P < 100)
{
dutyCycle_P = 100;
}
if (dutyCycle_P > 1000)
{
dutyCycle_P = 1000;
}
Startzeit_3 = millis();
}
}
else if (soll_temp == min_temp)
{
dutyCycle_P = 1000;
}
else if (soll_temp == max_temp)
{
dutyCycle_P = 100;
}
else
{
dutyCycle_P = 500;
}
dutyCycle = map(dutyCycle_P, 100, 1000, 10, 100);
Timer1.pwm(fanPin, (dutyCycle / 100) * 1023);
}