Encoder in Lüftersteuern integrieren

Hallo Liebes Forum,

Ich habe eine kleine Lüftersteuerung für mein 3D Druckgehäuse gebaut. Im großen und ganzen ist es nur ein Lüfter, ein Temperatursensor und ein Display, wo die Ist und Soll Temperatur ausgegeben wird. Dies funktioniert recht gut.

Nun möchte ich gern die Soll Temperatur mit einem Encoder Steuern. Also die Variable verändern, sodass ich die Temperatur im Gehäuse Steuern kann.
Da ich absoluter Anfänger bin habe ich der größten Teil des Code aus dem Internet zusammen kopiert und für meine Verhältnisse angepasst. Dies hat so weit auch bei dem ersten Teil funktioniert nur bei dem Encoder komme ich einfach nicht weiter.

Vielleicht habt ihr ja eine Lösung für mein Problem.

#include "DHT.h"
#include <LiquidCrystal.h>

#define DHTPIN 2 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define fan 8

const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

int ENB2 = 9;
int maxHum = 60;
int sollTemp = 25;


DHT dht(DHTPIN, DHTTYPE);

void setup() {
pinMode(fan, OUTPUT);
Serial.begin(9600);
dht.begin();
lcd.begin(16, 2);


}

void loop() {
delay(2000);

float h = dht.readHumidity();

float t = dht.readTemperature();

if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}

if(t > sollTemp) {
digitalWrite(fan, HIGH);
analogWrite(ENB2, 100);
} else {
digitalWrite(fan, LOW);

}

Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C ");


lcd.setCursor(0,0);
lcd.print("sollTemp.:");
lcd.print(sollTemp);
lcd.print(" \337C");
lcd.setCursor(0, 1);
lcd.print("istTemp.: ");
lcd.print(t);
lcd.print(" \337C"); // Kürzel \337 für das °-Zeichen verwenden

}

Hallo
nimm dir eines der vielen Encoder-Tutorial aus dem weltweiten Netz und erzeuge einen Sketch mit dem du eine Variable von Min nach Max verändern kannst. Wenn dieser Sketch zu deiner Zufriedenheit funktioniert kannst du beide zusammenfügen.
p.s. die delay()-Funktion muss aber dazu ersetzt werden. Hierzu eignet sich ein Zeitgeber, basierend auf der millis()-Funktion, sehr gut. Schaue dir dazu das IDE Beispiel BLINKWITHOUTDELAY an.

@TO: Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter oder gehe in der IDE auf Bearbeiten - Für Forum kopieren und füge es hier ein).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Hallo,

dazu musst Du doch nicht die Ist Drehzahl wissen. Wenn es zu warm ist muss die Drehzahl höher.

Du strebst eine Solltemperatur an aus der Differenz zu Soll und Istwert bildest Du den Drehzahlsollwert. Das kann stetig sein oder auch in Stufen Wenn Du es ein Wenig übertrieben magst kannst Du dafür auch einen PID Regler verwenden.

Heinz

Ich habe schon recht viele Tutorials probiert und auch versucht die codes bei mir zu Integrieren. Hat leider nicht funktioniert.

Und Rentner: Ich muss es nur irgendwie schaffen, dass ich mit der Encoder die "int sollTemp = 25;" Variable verändern kann.

Der Grund dahinter ist, dass falls ich mal kein ABS drucken will sind z.b. PLA wo ich nicht so eine Wärme benötige, möchte ich einfach mit dem Encoder diese Variable herunter drehen.

Hallo
bringt dein Slicer keine Temperatursteuerung für verschiedene Filamentmaterialen mit ?

Es geht um mein Druckergehäuse. Ich habe meine 3D Drucker eingebaut und das Problem ist das die Temperatur zu hoch wird. Der Lüfter den ich Verbaut habe regelt schon die Temperatur. Nur ich möchte gern mit dem Encoder die Solltemperatur Steuern.

Was hat der Slicer mit dem Gehäuse, in dem sein 3D Drucker steht und wo die warme Luft abgesaugt werden soll, zu tun?

ups... paar Sekunden zu langsam :frowning:

hilbus1000:
Es geht um mein Druckergehäuse. Ich habe meine 3D Drucker eingebaut und das Problem ist das die Temperatur zu hoch wird. Der Lüfter den ich Verbaut habe regelt schon die Temperatur. Nur ich möchte gern mit dem Encoder die Solltemperatur Steuern.

jetzt hat es klick gesagt
Mein Drucker ist bereits in einem Gehäuse eingebaut, darum die gedankliche Fehlleitung :slight_smile:

Hallo Paul,

Ich habe deinen oben geposteten code "überarbeitet".
Es gibt eine nützliche Funktion die beim Programmstart den Dateinamen des Quelltextes und das Compilirdatum und -uhrzeit auf den seriellen Monitor ausgibt. Das baue ich bei mir in alle Programme ein.

Und eine nicht-blockierende Timing-funktion die etwas einfacher zu handhaben ist als die "klassisch-puristische"
code-Version.

Außerdem ist eine Zählvariable eingebaut die auf der seriellen Schnittstelle das neue Programmverhalten visualisiert.
Die Schleife läuft rasend schnell durch was man am extrem schnellen Hochzähle der Variable sieht aber nur alle 2 Sekunden wird der Tempetarursensor ausgelesen und die Werte ausgegeben.

Dann habe ich noch

Werte ausgeben in ein eigenes Unterprogramm gesteckt wie sich das für gut struktiertes Programmieren gehört.
Und Variablen einen selbst selbsterklärenden Namen gegeben.
Such du mal den Buchstaben "h" im Programmtext da gibt es so viele Fundstellen die nicht die sind Variable sind

Der Sketch compiliert ich habe aber nicht die passende Hardware.
Jetzt kannst du die Encoder-Abfrage in direkt hinter

void loop() {

einfügen und der Encoder wird die ganze zeigt abgefragt

#include "DHT.h"
#include <LiquidCrystal.h>

#define DHTPIN 2 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define fan 8

const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

int ENB2 = 9;
int maxHum = 60;
int sollTemp = 25;

float relHum;  
float temperature;

DHT dht(DHTPIN, DHTTYPE);


void PrintFileNameDateTime() {  // prints out filename and compile-timestamp
  Serial.println("Code running comes from file ");
  Serial.println(__FILE__);
  Serial.print("  compiled ");
  Serial.print(__DATE__);
  Serial.print(" ");
  Serial.println(__TIME__);  
}


boolean TimePeriodIsOver (unsigned long &expireTime, unsigned long TimePeriod) {
  unsigned long currentMillis  = millis();  
  if ( currentMillis - expireTime >= TimePeriod )
  {
    expireTime = currentMillis; // set new expireTime
    return true;                // more time than TimePeriod) has elapsed since last time if-condition was true
  } 
  else return false;            // not expired
}

unsigned long MyTestTimer = 0;  // variables MUST be of type unsigned long

void MesswerteAnzeigen(float p_hum, float p_temp) {
  
  Serial.print("Humidity: ");
  Serial.print(p_hum);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(p_temp);
  Serial.println(" *C ");

  lcd.setCursor(0, 0);
  lcd.print("sollTemp.:");
  lcd.print(sollTemp);
  lcd.print(" \337C");
  lcd.setCursor(0, 1);
  lcd.print("istTemp.: ");
  lcd.print(p_temp);
  lcd.print(" \337C"); // Kürzel \337 für das °-Zeichen verwenden
}  



void setup() {
  pinMode(fan, OUTPUT);
  Serial.begin(9600);
  Serial.println();
  PrintFileNameDateTime();
  
  dht.begin();
  lcd.begin(16, 2);
}

unsigned long myCounter = 0;
 
void loop() {
  
  myCounter++; // Variable bei jedem SChleifendurchlauf um 1 erhöhen
  // bEdingung wird nur nach ABlauf von 2000 Millisekunden wahr
  // ==> code innerhalb der if-bedingung wird nur alle zwei Sekunden ausgeführt
  if (TimePeriodIsOver(MyTestTimer,2000) ) {
    // Wert der Variable an serielle Schnittstelle senden
    Serial.print("myCounter=");
    Serial.println(myCounter);
    
    relHum      = dht.readHumidity();  
    temperature = dht.readTemperature();
  
    if (isnan(relHum) || isnan(temperature)) {
      Serial.println("Failed to read from DHT sensor!");
      return;
    }

    // Lüfter an / aus
    if (temperature > sollTemp) {
      digitalWrite(fan, HIGH);
      analogWrite(ENB2, 100);
    } 
    else {
      digitalWrite(fan, LOW);
    }
    
    MesswerteAnzeigen(relHum,temperature); 
  }  
  
}

vgs

Stefan hab vielen Dank,

ich muss mich Entschuldigen für mein Unwissen.

Ich habe mal gegoogelt nach einer Encoder abfrage, wenn ich die jetzt reinkopiere funktioniert schonmal das herrunter zählen. Aber wie schaffe ich es das ich damit die Variable "int sollTemp = 25;" Steuere?

Na dazu musst du den Code mit Encoderabfrage posten: eS gibt sooo viele Varianten von Encoder-Abfrage
vgs

Ich habe es gerade nochmal mit 2 unterschiedlichen Abfragen versucht und bekomme es einfach nicht hin.

#include "DHT.h"
#include <LiquidCrystal.h>


#define DHTPIN 2 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define fan 8


const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);


int ENB2 = 9;
int maxHum = 60;
int sollTemp = 25;


int messungPin1 = LOW;
int messungPin1Alt = LOW;
int encoderWert = 0;


float relHum;  
float temperature;


DHT dht(DHTPIN, DHTTYPE);




void PrintFileNameDateTime() {  // prints out filename and compile-timestamp
  Serial.println("Code running comes from file ");
  Serial.println(__FILE__);
  Serial.print("  compiled ");
  Serial.print(__DATE__);
  Serial.print(" ");
  Serial.println(__TIME__);  
}




boolean TimePeriodIsOver (unsigned long &expireTime, unsigned long TimePeriod) {
  unsigned long currentMillis  = millis();  
  if ( currentMillis - expireTime >= TimePeriod )
  {
    expireTime = currentMillis; // set new expireTime
    return true;                // more time than TimePeriod) has elapsed since last time if-condition was true
  } 
  else return false;            // not expired
}


unsigned long MyTestTimer = 0;  // variables MUST be of type unsigned long


void MesswerteAnzeigen(float p_hum, float p_temp) {
  
  Serial.print("Humidity: ");
  Serial.print(p_hum);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(p_temp);
  Serial.println(" *C ");


  lcd.setCursor(0, 0);
  lcd.print("sollTemp.:");
  lcd.print(sollTemp);
  lcd.print(" \337C");
  lcd.setCursor(0, 1);
  lcd.print("istTemp.: ");
  lcd.print(p_temp);
  lcd.print(" \337C"); // Kürzel \337 für das °-Zeichen verwenden
}  






void setup() {
  pinMode(fan, OUTPUT);
  Serial.begin(9600);
  Serial.println();
  PrintFileNameDateTime();
  
  dht.begin();
  lcd.begin(16, 2);


  pinMode(1, INPUT);
 pinMode(7, INPUT);
 Serial.begin(9600);
}


unsigned long myCounter = 0;
 
void loop() {
   messungPin1 = digitalRead(1);
 if ((messungPin1 == HIGH) && (messungPin1Alt == LOW)) {
 if (digitalRead(7) == HIGH) {
 encoderWert++;
 } else {
 encoderWert--;
 }
 Serial.println (encoderWert);
 }
 messungPin1Alt = messungPin1;


  
  
  myCounter++; // Variable bei jedem SChleifendurchlauf um 1 erhöhen
  // bEdingung wird nur nach ABlauf von 2000 Millisekunden wahr
  // ==> code innerhalb der if-bedingung wird nur alle zwei Sekunden ausgeführt
  if (TimePeriodIsOver(MyTestTimer,2000) ) {
    // Wert der Variable an serielle Schnittstelle senden
    Serial.print("myCounter=");
    Serial.println(myCounter);
    
    relHum      = dht.readHumidity();  
    temperature = dht.readTemperature();
  
    if (isnan(relHum) || isnan(temperature)) {
      Serial.println("Failed to read from DHT sensor!");
      return;
    }


    // Lüfter an / aus
    if (temperature > sollTemp) {
      digitalWrite(fan, HIGH);
      analogWrite(ENB2, 100);
    } 
    else {
      digitalWrite(fan, LOW);
    }
    
    MesswerteAnzeigen(relHum,temperature); 
  }  
  
}
[code/]

Mal sehen wo es weiter geht, hier oder da.

Moko,

im Arduinoforum hat mir anfangs keine geantwortet also habe ich den frage nochmals hier reingestellt.

Ich habe jetzt schon recht viel ausprobiert und bin leicht verzweifelt. Ich wäre euch sehr dankbar wenn ihr mir wenigstens ein Lösungsansatz oder ein Link gebt wo ich das Problem lösen kann.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.