INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Encoder in Lüftersteuern integrieren
31.01.2021, 12:33
Beitrag #1
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

}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.02.2021, 12:18
Beitrag #2
RE: Encoder in Lüftersteuern integrieren
(31.01.2021 12:33)Hilbus schrieb:  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.

Wenn ich dich richtig verstanden habe so möchtest du die Solltemperatur über einen Rotary Encoder verstelle können. Ich bin gerade bei einem ähnlichen Projekt. Vielleicht hilft dir mein code ja weiter.

Code:
#include "DHT.h"                             // DHT11 / DHT22 Bibliothek
#include <LiquidCrystal_I2C.h>               // LCD Display Bibliothek (I2C)
LiquidCrystal_I2C lcd(0x27, 16, 2);          // Adresse + Display festlegen

DHT dht1(5, DHT22);             // DHT_PIN / DHT_Type
DHT dht2(6, DHT22);             // DHT_PIN / DHT_Type
DHT dht3(7, DHT22);             // DHT_PIN / DHT_Type

float t1, t2, t3;                // Variable für Temperaturwerte der 3 Sensoren
uint8_t sollwert = 40;           // Gewünschter Sollwert der Temperatur

// Für Abstand der Messungen
uint32_t messen_time = 0;        // Zeit der letzten Messung
uint16_t messabstand = 5000;     // Zeitabstand zwischen den Messungen

// KY-040 Rotary Encoder
const int clk1_pin = 2;          // Pin für clk
const int dt1_pin = 3;           // Pin für dt
int clk1_pin_alt;                // Um Drehimpuls zu erkennen
int clk1_pin_neu;                // Um Drehimpuls zu erkennen

// KY-040 Taster
const int sw1_pin = 4;           // Pin für Tastendruck
boolean sw1_pos_neu = LOW;       // Um Tastendruck zu erkenne
boolean sw1_pos_alt = LOW;       // Um Tastendruck zu erkenne
uint32_t sw1_time = 0;           // Zeitmessung zum entprellen
uint8_t entprellen = 200;        // Verzögerung der entprellung
boolean sollwert_fest = true;    // Verhindern das der Sollwert geändert werden kann

const int ssr1_pin = 9;          // Pin für SSR
boolean heizung = false;         // Heizung an oder aus

// --- setup -----------------------------------------------------------------

void setup() {

  pinMode (clk1_pin, INPUT_PULLUP);
  pinMode (dt1_pin, INPUT_PULLUP);
  pinMode (sw1_pin, INPUT_PULLUP);
  pinMode (ssr1_pin, OUTPUT);

  digitalWrite(ssr1_pin, LOW);             // SSR1 aus
  clk1_pin_alt = digitalRead(clk1_pin);    

  lcd.begin();
  dht1.begin();  
  dht2.begin();  
  dht3.begin();  
  
  Serial.begin(115200);

  lcd.setCursor(0, 0);
  lcd.print("Sollwert: ");
  lcd.setCursor(12, 0);
  lcd.print(sollwert);
  lcd.setCursor(14, 0);
  lcd.print("C");

  // 1. Messung ohne Zeitverzögerung
  messen();
  anzeigen_ser();
  anzeigen_lcd();
  messen_time = millis();
  ssr();
}

// --- loop -----------------------------------------------------------------

void loop() {
  if (millis() - messen_time > messabstand) {
    messen_time = millis();
    messen();
    anzeigen_ser();
    anzeigen_lcd();
    ssr();
  }

  Rotary_Taster();
  if (sollwert_fest == false) {
    Rotary();    
  }
}

// --- messen -----------------------------------------------------------------

void messen() {
   t1 = dht1.readTemperature();
   t2 = dht2.readTemperature();
   t3 = dht3.readTemperature();
}
  
// --- anzeigen_ser -----------------------------------------------------------

void anzeigen_ser() {
    Serial.print("\t");
    Serial.print("T1: ");
    Serial.print(t1);
    Serial.print(" C\t");

    Serial.print("T2: ");
    Serial.print(t2);
    Serial.print(" C\t");

    Serial.print("T3: ");
    Serial.print(t3);
    Serial.print(" C\t");
    
//    Serial.println();
}

// --- anzeigen_lcd -----------------------------------------------------------

void anzeigen_lcd() {
  lcd.setCursor(0, 1);
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print(t1);
  lcd.setCursor(4, 1);
  lcd.print(" ");
  lcd.setCursor(6, 1);
  lcd.print(t2);
  lcd.setCursor(10, 1);
  lcd.print(" ");
  lcd.setCursor(12, 1);
  lcd.print(t3);
  lcd.setCursor(16, 1);
  lcd.print(" ");
}

// --- Rotary Taster auswerten -----------------------------------------------

void Rotary_Taster() {
  sw1_pos_neu = digitalRead(sw1_pin);     // aktuelle Tasterposition abfragen
  
  if (sw1_pos_neu == LOW && sw1_pos_alt == HIGH && millis() - sw1_time > entprellen) {
    sw1_time = millis();             // Wenn sich Position geändert hat und entprellt ist
    sollwert_fest = !sollwert_fest;  // Rotary Sperre wechseln
    if (sollwert_fest == true) {     // Markierung im LCD löschen
      lcd.setCursor(15, 0);
      lcd.print(" ");
    }
    else {                           // Markierung im LCD setzen
      lcd.setCursor(15, 0);
      lcd.print("*");
    }
  }

  sw1_pos_alt = sw1_pos_neu;         // aktuelle Tasterposition speichern
}

// --- Rotary Encoder auswerten ------------------------------------------------

void Rotary() {
  clk1_pin_neu = digitalRead(clk1_pin);          // Auslesen des aktuellen Statuses
  if (clk1_pin_neu != clk1_pin_alt) {            // Überprüfung auf Änderung
    if (digitalRead(dt1_pin) != clk1_pin_neu) {  // Pin_CLK hat sich zuerst verändert
      if (sollwert < 50) {                       // Und Sollwert ist kleiner 50
        sollwert ++;  
      }
    }
    else {                                       // Andernfalls hat sich Pin_DT zuerst verändert
      if (sollwert > 20) {                       // Und Sollwert ist größer 20
        sollwert--;        
      }
    }
    lcd.setCursor(12, 0);
    lcd.print(sollwert);
  }
  clk1_pin_alt = clk1_pin_neu;
}  

// --- SSR ------------------------------------------------------------------

void ssr() {
  if (sollwert > t1) {
    digitalWrite(ssr1_pin, HIGH);
//    analogWrite(ssr1_pin, 255);
    lcd.setCursor(10, 0);
    lcd.print("H");      
    Serial.println("H");
  }
  else {
    digitalWrite(ssr1_pin, LOW);
//    analogWrite(ssr1_pin, 0);
    lcd.setCursor(10, 0);
    lcd.print(" ");      
    Serial.println("");
  }
}

Harry

Wenn etwas nicht funktioniert -> Kondensator hinzufügenSmile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.02.2021, 21:04
Beitrag #3
RE: Encoder in Lüftersteuern integrieren
Ich habe versucht deinen Code in meinen zu Integrieren. Ist mir leider nicht gelungen. Hast du vielleicht eine Idee wie ich das schaffen könnte?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.02.2021, 21:11
Beitrag #4
RE: Encoder in Lüftersteuern integrieren
(02.02.2021 21:04)Hilbus schrieb:  Ich habe versucht deinen Code in meinen zu Integrieren. Ist mir leider nicht gelungen. Hast du vielleicht eine Idee wie ich das schaffen könnte?

Was für ein Encoder benutzt du um den Wert zu ändern?

Harry

Wenn etwas nicht funktioniert -> Kondensator hinzufügenSmile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.02.2021, 21:25
Beitrag #5
RE: Encoder in Lüftersteuern integrieren
https://www.reichelt.de/entwicklerboards...30QAvD_BwE

So einen Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.02.2021, 21:43
Beitrag #6
RE: Encoder in Lüftersteuern integrieren
Den gleichen benutze ich auch.

Funktioniert dein code, abgesehen vom Encoder.
Messen und anzeigen funktioniert?

Falls nein, benutze am besten mein code.
Entfernst meinen DHT2 + DHT3 und tauscht mein Display gegen deins aus.

Harry

Wenn etwas nicht funktioniert -> Kondensator hinzufügenSmile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.02.2021, 17:34 (Dieser Beitrag wurde zuletzt bearbeitet: 04.02.2021 17:34 von Hilbus.)
Beitrag #7
RE: Encoder in Lüftersteuern integrieren
Ich habe versucht deinen Code in meinen zu Integrieren. Die Variable kann ich anscheinend mit den Encoder verändern, leider Zeigt der Display einen Fehler an. Weißt du vielleicht woran das liegt?


#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;

const int clk1_pin = 7; // Pin für clk
const int dt1_pin = 1; // Pin für dt
int clk1_pin_alt; // Um Drehimpuls zu erkennen
int clk1_pin_neu;

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);
}
{
clk1_pin_neu = digitalRead(clk1_pin); // Auslesen des aktuellen Statuses
if (clk1_pin_neu != clk1_pin_alt) { // Überprüfung auf Änderung
if (digitalRead(dt1_pin) != clk1_pin_neu) { // Pin_CLK hat sich zuerst verändert
if (sollTemp < 50) { // Und Sollwert ist kleiner 50
sollTemp ++;
}
}
else { // Andernfalls hat sich Pin_DT zuerst verändert
if (sollTemp > 20) { // Und Sollwert ist größer 20
sollTemp--;
}
}
lcd.setCursor(12, 0);
lcd.print(sollTemp);
}
clk1_pin_alt = clk1_pin_neu;
}

}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.02.2021, 19:43
Beitrag #8
RE: Encoder in Lüftersteuern integrieren
Setzte dein code bitte in codetags und formatier ihn.

Was für ein Fehler hast du im Display.

Noch ein Tipp zum Display. Benutze lieber ein I2C anstelle einem paralellen Display. Ist viel einfach zu verkabeln und spart einen Menge Ports.

Harry

Wenn etwas nicht funktioniert -> Kondensator hinzufügenSmile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  KY-040 Rotary Encoder Harry 11 881 09.01.2021 01:14
Letzter Beitrag: rev.antun
  Konflikt bei Rotary Encoder Karl Stanger 9 673 02.01.2021 13:39
Letzter Beitrag: hotsystems
  Rotary Encoder und I2C Display gleichzeitig verwenden BenGroll 3 1.113 27.07.2020 10:23
Letzter Beitrag: hotsystems
  7 Segment Display mit Rotary Encoder SA154 2 928 26.05.2020 13:40
Letzter Beitrag: MicroBahner
  Konfiguration i2c Encoder Igom 4 1.143 01.03.2020 13:23
Letzter Beitrag: bytecook
  Rotary Encoder - gedrückt und gleichzeitig drehen Gerdchen03 6 1.511 29.10.2019 10:49
Letzter Beitrag: Tommy56
  Menue und klick-Encoder bojojo 2 1.702 23.11.2018 13:46
Letzter Beitrag: bojojo
  Probleme mit Umstellung von Tastern auf Encoder MasterOfPuppets 5 1.787 09.11.2018 22:29
Letzter Beitrag: hotsystems
Wink per Rotary Encoder Bewegungsmelder aktivieren Davidsen74 34 8.064 09.03.2017 18:17
Letzter Beitrag: Davidsen74
  Dc Getriebemotor mit encoder clemens5555 3 2.982 12.02.2017 14:07
Letzter Beitrag: Binatone

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste