Zusatzlüfter für PC PWM gesteuerte Lüfter

Programmierung der Arduino UNO, Arduino MEGA, Arduino Nano, ........
Benutzeravatar
Admin
Administrator
Beiträge: 28
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Zusatzlüfter für PC PWM gesteuerte Lüfter

Beitrag von Admin »

Danke, auch schöne Weihnachten.

Grüße
Franz

Benutzeravatar
Admin
Administrator
Beiträge: 28
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Zusatzlüfter für PC PWM gesteuerte Lüfter

Beitrag von Admin »

Im Programm wird kontrolliert, ob die CPU Temperatur über oder unter 50 Grad ist. Ist die CPU Temp. über 50 Grad, wird der zweite Lüfter zugeschalten. Ist das nicht gewünscht, muss man eben diesen Teil rausnehmen. Welcher Teil das ist, ist rel. einfach zu finden, weil ich die Programmteile mit Überschriften versehe, an denen man die Funktion des Teiles erkennt. Hier erst mal das ganze Programm. Unten gehe ich auf die Teile ein, die das Zusammenspiel der beiden Lüfter Steuern.

Code: Alles auswählen

// Version vom 19.09.2020 um 12:00
// PWM Port 9+10 auf 31300Hz eingestellt
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h> // LCD Display
// -------------LCD Display Acresse 0x3F oder 0x27----------------
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

int messwert1 = 0;
int messwert1_2 = 0;
int messwert2 = 0;
int messwert2_2 = 0;
const unsigned long Timer2 = (60000UL * 60); // Alle 60 Min. Lüftertausch
unsigned long VorherMilles2 = 0;
byte wechsel2 = 0;
byte luefteralarm = 0;
byte sensortausch = 1;// Wenn die Sensoren vertauscht sind dann "1" eintragen
// -------PWM Ausgabepins für UNO festlegen--------------------
const int PWM_PIN1 = 9;  // PWM Ausgabepin festlegen
const int PWM_PIN2 = 10;  // PWM Ausgabepin festlegen
const byte PWMmin = 30; // Minimaler PWM Wert für die Lüfter Motoren

const int delayTimeM1 = 2000; // Alle 2 Sekunden Temperatur-Auswertung
unsigned long VorherMillesM1 = 0;

const unsigned long Baud_Rate = 9600;
const unsigned char One_Wire_Bus = 2; // Sensoren auf Pin
OneWire oneWire(One_Wire_Bus);
DallasTemperature sensoren (&oneWire);

int Anzahl_Sensoren = 0;
int is = 0; // Zaehler fuer die Sensoren
int ia = 0; // Zaehler fuer die Adressstellen 0-7
int Sensor = 0;
DeviceAddress tempDeviceAddress; // Fuer die Adressausgabe
int numberOfDevices; // Fuer die Adressausgabe

void setup() {
  sensoren.begin();
  Serial.begin(9600);
  lcd.begin(20, 4);
  lcd.backlight();
  lcd.clear();
  lcd.setCursor (0, 0);
  lcd.print (F("Luefter"));
  lcd.setCursor (9, 0);
  lcd.print (F("Temp."));
  lcd.setCursor (16, 0);
  lcd.print (F("PWM"));
  lcd.setCursor (0, 1);
  lcd.print (F("-------------------"));
  lcd.setCursor (0, 2);
  lcd.print (F("CPU"));
  lcd.setCursor (0, 3);
  lcd.print (F("Raum"));
  // ----------PWM Tackt beim UNO Pin 9 & 10 auf 31300Hz ändern---------------
  TCCR1B = TCCR1B & 0b11111000 | 0x01;

  // ----------Input und Output Pin bestimmen---------------------------------
  pinMode(PWM_PIN1, OUTPUT);
  pinMode(PWM_PIN2, OUTPUT);

  // Anzahl der Sesoren ermitteln
  Anzahl_Sensoren = sensoren.getDeviceCount();

  // Ermitteln der Sensor-Adressen
  for (is = 0; is < Anzahl_Sensoren; is++)
  {
    if (sensoren.getAddress(tempDeviceAddress, is))
    {
      Serial.println ();
      printAddress(tempDeviceAddress);
    }
  }
  // Kein blockierendes Warten auf die Messung!!
  // Spart 740ms Loop Zeit bei der Messung
  sensoren.setWaitForConversion(false);
}
//---------------------------------------------------------------------------
// Ausgabe der Sensor-Adressen
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t ia = 0; ia < 8; ia++)
  {
    if (deviceAddress[ia] < 16)
    {
      Serial.print("0"); //ist die Hex Adresse kleiner 16 dann erste Stelle eine "0"
    }
    Serial.print(deviceAddress[ia], HEX);
  }
}
//---------------------------------------------------------------------------
void loop() {
  //------------------------------Temperatur Auslesen--------------------------
  if (millis() - VorherMillesM1 >= delayTimeM1)
  {
    VorherMillesM1 = millis();

    //Temperaturen Auslesen
    if (Sensor == 0) //Bei jedem ersten Durchgang Temperaturen holen
    {
      sensoren.requestTemperatures();
    }
    // Hier werden die Temperaturen aufs Display gebracht
    if (Sensor < Anzahl_Sensoren)
    {
      Sensor ++;
      float temperatur = sensoren.getTempCByIndex(Sensor - 1);
      // -----------Messfehler überbrücken--------------------------------
      // ----Sensor1------
      if ((temperatur < 0) && (Sensor == 1))
      {
        temperatur = 40;
      }
      // ----Sensor2------
      if ((temperatur < 0) && (Sensor == 2))
      {
        temperatur = 30;
      }
      //------------------------------------------------------------------
      // ---------------Lüfter Überwachung -------------------------------
      if ((temperatur > 50) && (Sensor == 1))
      {
        luefteralarm = 1; // Zweiten Lüfter zur CPU Lüftung zuschalten
      }
      if ((temperatur < 40) && (Sensor == 1))
      {
        luefteralarm = 0;
      }
      // -----------------------------------------------------------------
      // --Sensorwerte ins Display in messwert1 oder messwert2 übergeben--
      //-------Wenn sensoren nicht vertauscht sind------------------------
      if (sensortausch == 0)
      {
        if (Sensor == 1)
        {
          messwert1 = temperatur;
          lcd.setCursor (9, 2);
          lcd.print (F("      "));
          lcd.setCursor (9, 2);
          lcd.print (temperatur);
        }
        if (Sensor == 2)
        {
          messwert2 = temperatur;
          lcd.setCursor (9, 3);
          lcd.print (F("      "));
          lcd.setCursor (9, 3);
          lcd.print (temperatur);
        }
        if (Sensor == Anzahl_Sensoren)
        {
          Sensor = 0;
        }
      }
      //------------------------------------------------------------------
      //----------Wenn Sensoren vertauscht sind---------------------------
      if (sensortausch == 1)
      {
        if (Sensor == 1)
        {
          messwert2 = temperatur;
          lcd.setCursor (9, 3);
          lcd.print (F("      "));
          lcd.setCursor (9, 3);
          lcd.print (temperatur);
        }
        if (Sensor == 2)
        {
          messwert1 = temperatur;
          lcd.setCursor (9, 2);
          lcd.print (F("      "));
          lcd.setCursor (9, 2);
          lcd.print (temperatur);
        }
        if (Sensor == Anzahl_Sensoren)
        {
          Sensor = 0;
        }
      }
      //-------------------Sensortausch Ende------------------------------
    }
    //-----------------------Temperatur auslesen Ende---------------------------------
    // Temperaturwerte 30-100 Grad, in PWM Wert "PWMmin"-255 umwandeln
    messwert1_2 = map(messwert1, 25, 100, (PWMmin - 1), 255);
    messwert2_2 = map(messwert2, 25, 100, (PWMmin - 1), 255);
    //Wenn PWM Drehzahl Lüfter kleiner 25 dann unsicherer Lauf, also Lüfter aus
    if (messwert1_2 < PWMmin)
    {
      messwert1_2 = 0;
    }
    if (messwert1_2 > 255)
    {
      messwert1_2 = 255;
    }
    //Wenn PWM Drehzahl Lüfter 2 kleiner 30 dann unsicherer Lauf, also Lüfter aus
    if (messwert2_2 < PWMmin)
    {
      messwert2_2 = 0;
    }
    if (messwert2_2 > 255)
    {
      messwert2_2 = 255;
    }
    if (wechsel2 == 0) // Lüfterwechsel 1 & 2 wenn Zeit gekommen ist
    {
      lcd.setCursor (5, 2);
      lcd.print (F("1"));
      lcd.setCursor (5, 3);
      lcd.print (F("2"));
      analogWrite (PWM_PIN1, messwert1_2); // Analogwert Ausgabe an PWM Pin.9
      analogWrite (PWM_PIN2, messwert2_2); // Analogwert Ausgabe an PWM Pin.10
      if (luefteralarm == 1)
      {
        analogWrite (PWM_PIN2, messwert1_2); // Analogwert Ausgabe an PWM Pin.9
      }
    }
    if (wechsel2 == 1) // Lüfterwechsel 1 & 2 wenn Zeit gekommen ist
    {
      lcd.setCursor (5, 2);
      lcd.print (F("2"));
      lcd.setCursor (5, 3);
      lcd.print (F("1"));
      analogWrite (PWM_PIN1, messwert2_2); // Analogwert Ausgabe an PWM Pin.9
      analogWrite (PWM_PIN2, messwert1_2); // Analogwert Ausgabe an PWM Pin.10
      if (luefteralarm == 1)
      {
        analogWrite (PWM_PIN1, messwert1_2); // Analogwert Ausgabe an PWM Pin.9
      }
    }

    lcd.setCursor (16, 2);
    lcd.print (F("    "));
    lcd.setCursor (16, 2);
    lcd.print (messwert1_2);

    if (luefteralarm == 1)
    {
      lcd.setCursor (16, 3);
      lcd.print (F("    "));
      lcd.setCursor (16, 3);
      lcd.print (messwert1_2);
    }
    else
    {
      lcd.setCursor (16, 3);
      lcd.print (F("    "));
      lcd.setCursor (16, 3);
      lcd.print (messwert2_2);
    }
  }
  //----Zeitsteuerung für Lüfterwechsel------
  if (millis() - VorherMilles2 >= Timer2)
  {
    VorherMilles2 = millis();
    wechsel2 = !wechsel2;
  }
  //-----------------------------------------
}



Hier ist mal der Erste Teil. Der sorgt dafür, dass der Lüfter 2 ab einer CPU Temp. von 51 Grad die selbe Drehzahl läuft wie der Lüfter 1. Will man das nicht, einfach nur luefteralarm = 1; auskommentieren.

Code: Alles auswählen

 // ---------------Lüfter Überwachung -------------------------------
      if ((temperatur > 50) && (Sensor == 1))
      {
        luefteralarm = 1; // Zweiten Lüfter zur CPU Lüftung bei über 50 Grad zuschalten
      }
      if ((temperatur < 40) && (Sensor == 1))
      {
        luefteralarm = 0; // Wenn der zweite Lüfter ausschließlich seine eigene Drehzahl laufen soll
      }
      // -----------------------------------------------------------------

Hier ist noch die Zeitsteuerung für den automatischen Lüfterwechsel, der hier im Programm eingebaut ist. Da der CPU Lüfter immer wesentlich mehr belastet wird, beide Lüfter aber in das selbe PC Gehäuse blasen, wechsle ich jede Stunde die Belastung für die beiden Lüfter. Der eine Lüfter bläst nur je nach Raumtemperatur mehr oder weniger Stark, der andere bläst je nach CPU Temp. mehr oder weniger Stark. Da die CPU immer mehr Temperatur hat, läuft dieser immer in höheren Drehzahlen. Wenn man den Tausch nicht brauchen kann, weil die beiden Lüfter verschiedene Teile Lüften, muss man den Teil ausser Betrieb setzen. Also wechsel2 = !wechsel2; einfach auskommentieren.

Code: Alles auswählen

   //----Zeitsteuerung für Lüfterwechsel------
  if (millis() - VorherMilles2 >= Timer2)
  {
    VorherMilles2 = millis();
    wechsel2 = !wechsel2;
  }
  //-----------------------------------------

Benutzeravatar
Admin
Administrator
Beiträge: 28
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Zusatzlüfter für PC PWM gesteuerte Lüfter

Beitrag von Admin »

Schade, dass es als dankeschön auf meine Information zur Änderung des Programm´s auf deine Belange nur per Mail eine Aufforderung zum löschen deiner Beiträge gibt. Ich lösche aber keine Beiträge auf die ich, oder jemand anders, geantwortet hat. Ein Forum ist eine Information für Schreiber und Leser im Forum. Da werden keine Beiträge gelöscht, um dann die anderen Beiträge zusammenhangslos stehen zu lassen.

Franz

HRKRG
Beiträge: 4
Registriert: Mo 7. Dez 2020, 16:27
Kontaktdaten:

Re: Zusatzlüfter für PC PWM gesteuerte Lüfter

Beitrag von HRKRG »

Hallo HerrFranz
ich Danke dir für das Umstellen jetzt geht es ich habe die Umschaltung auskommentiert
mir ist nicht bewust das ich geschrieben habe das Sie die Mails Löschen sollen
bitte schau noch mal drüber ob ich es richtig gemacht habe
nun kann ich anfangen das in eine kleine Kiste bauen für den Wohnwagen
Mit 75 Jahren ist das nicht mehr so leicht so etwas zu lernen
ich hoffe das ich es richtig gemacht habe ene Antwort währe nett
M.F.G
Rolf Krüger


Code: Alles auswählen

// Version vom 19.09.2020 um 12:00
//PWM Port 11+12 auf 31300Hz eingestellte/html/luf
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h> // LCD Display
// -------------LCD Display Acresse 0x3F oder 0x27----------------
LiquidCrystal_I2C lcd (0x27,20,4);/// 1, 0, 4, 5, 6, 7, 3, POSITIVE);

int messwert1 = 0;
int messwert1_2 = 0;
int messwert2 = 0;
int messwert2_2 = 0;
const unsigned long Timer2 = (60000UL * 60); // Alle 60 Min. Lüftertausch
unsigned long VorherMilles2 = 0;
byte wechsel2 = 0;
byte luefteralarm = 0;
byte sensortausch = 1;// Wenn die Sensoren vertauscht sind dann "1" eintragen
// -------PWM Ausgabepins für Mega festlegen--------------------
const int PWM_PIN1 = 9;  // PWM Ausgabepin festlegen
const int PWM_PIN2 = 10;  // PWM Ausgabepin festlegen
const byte PWMmin = 30; // Minimaler PWM Wert für die Lüfter Motoren

const int delayTimeM1 = 2000; // Alle 2 Sekunden Temperatur-Auswertung
unsigned long VorherMillesM1 = 0;

const unsigned long Baud_Rate = 9600;
const unsigned char One_Wire_Bus = 2; // Sensoren auf Pin
OneWire oneWire(One_Wire_Bus);
DallasTemperature sensoren (&oneWire);

int Anzahl_Sensoren = 2;
int is = 2; // Zaehler fuer die Sensoren
int ia = 2; // Zaehler fuer die Adressstellen 0-7
int Sensor = 0;
DeviceAddress tempDeviceAddress; // Fuer die Adressausgabe
int numberOfDevices; // Fuer die Adressausgabe

void setup() {
  sensoren.begin();
  Serial.begin(9600);
    //lcd.begin(20, 4);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor (0, 0);
  lcd.print (F("Luefter"));
  lcd.setCursor (9, 0);
  lcd.print (F("Temp."));
  lcd.setCursor (16, 0);
  lcd.print (F("PWM"));
  lcd.setCursor (0, 1);
  lcd.print (F("-------------------"));
  lcd.setCursor (0, 2);
  lcd.print (F("KuelS"));
  lcd.setCursor (0, 3);
  lcd.print (F("Frost"));
  // ----------PWM Tackt beim MEGA Pin 11 & 12 auf 31300Hz ändern---------------
  TCCR1B = TCCR1B & 0b11111000 | 0x01;

  // ----------Input und Output Pin bestimmen---------------------------
  pinMode(PWM_PIN1, OUTPUT);
  pinMode(PWM_PIN2, OUTPUT);

  // Anzahl der Sesoren ermitteln
  Anzahl_Sensoren = sensoren.getDeviceCount();

  // Ermitteln der Sensor-Adressen
  for (is = 0; is < Anzahl_Sensoren; is++)
  {
    if (sensoren.getAddress(tempDeviceAddress, is))
    {
      Serial.println ();
      printAddress(tempDeviceAddress);
    }
  }
  // Kein blockierendes Warten auf die Messung!!
  // Spart 740ms Loop Zeit bei der Messung
  sensoren.setWaitForConversion(false);
}
//---------------------------------------------------------------------------
// Ausgabe der Sensor-Adressen
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t ia = 0; ia < 8; ia++)
  {
    if (deviceAddress[ia] < 16)
    {
      Serial.print("0"); //ist die Hex Adresse kleiner 16 dann erste Stelle eine "0"
    }
    Serial.print(deviceAddress[ia], HEX);
  }
}
//---------------------------------------------------------------------------
void loop() {
  //------------------------------Temperatur Auslesen--------------------------
  if (millis() - VorherMillesM1 >= delayTimeM1)
  {
    VorherMillesM1 = millis();

    //Temperaturen Aulesen
    if (Sensor == 0) //Bei jedem ersten Durchgang Temperaturen holen
    {
      sensoren.requestTemperatures();
    }
    // Hier werden die Temperaturen aufs Display gebracht
    if (Sensor < Anzahl_Sensoren)
    {
      Sensor ++;
      float temperatur = sensoren.getTempCByIndex(Sensor - 1);
      // -----------Messfehler überbrücken--------------------------------
      // ----Sensor1------
      if ((temperatur < 0) && (Sensor == 1))
      {
        temperatur = 40;
      }
      // ----Sensor2------
      if ((temperatur < 0) && (Sensor == 2))
      {
        temperatur = 30;
      }
      //------------------------------------------------------------------
      // ---------------Lüfter Überwachung -------------------------------
      if ((temperatur > 50) && (Sensor == 1))
      {
        // luefteralarm = 1; // Zweiten Lüfter zur CPU Lüftung zuschalten
      }
      if ((temperatur < 40) && (Sensor == 1))
      {
        luefteralarm = 0;
      }
      // --Sensorwerte ins Display in messwert1 oder messwert2 übergeben--
      //-------Wenn sensoren nicht vertauscht sind------------------------
      if (sensortausch == 0)
      {
        if (Sensor == 1)
        {
          messwert1 = temperatur;
          lcd.setCursor (9, 2);
          lcd.print (F("      "));
          lcd.setCursor (9, 2);
          lcd.print (temperatur);
        }
        if (Sensor == 2)
        {
          messwert2 = temperatur;
          lcd.setCursor (9, 3);
          lcd.print (F("      "));
          lcd.setCursor (9, 3);
          lcd.print (temperatur);
        }
        if (Sensor == Anzahl_Sensoren)
        {
          Sensor = 0;
        }
      }
      //------------------------------------------------------------------
      //----------Wenn Sensoren vertauscht sind---------------------------
      if (sensortausch == 1)
      {
        if (Sensor == 1)
        {
          messwert2 = temperatur;
          lcd.setCursor (9, 3);
          lcd.print (F("      "));
          lcd.setCursor (9, 3);
          lcd.print (temperatur);
        }
        if (Sensor == 2)
        {
          messwert1 = temperatur;
          lcd.setCursor (9, 2);
          lcd.print (F("      "));
          lcd.setCursor (9, 2);
          lcd.print (temperatur);
        }
        if (Sensor == Anzahl_Sensoren)
        {
          Sensor = 0;
        }
      }
      //-------------------Sensortausch Ende------------------------------
    }
    //---------------------------------------------------------------------------
       // Temperaturwerte 25-100 Grad, in PWM Wert "PWMmin"-255 umwandeln
    messwert1_2 = map(messwert1, 25, 100, (PWMmin-1), 255);
    messwert2_2 = map(messwert2, 25, 100, (PWMmin-1), 255);
    //Wenn PWM Drehzahl Lüfter 1 kleiner 30 dann unsicherer Lauf, also Lüfter aus
    if (messwert1_2 < PWMmin) 
    {
      messwert1_2 = 0;
    }
    if (messwert1_2 > 255)
    {
      messwert1_2 = 255;
    }
    //Wenn PWM Drehzahl Lüfter 2 kleiner 30 dann unsicherer Lauf, also Lüfter aus
    if (messwert2_2 < PWMmin)
    {
      messwert2_2 = 0;
    }
    if (messwert2_2 > 255)
    {
      messwert2_2 = 255;
    }
    //if (wechsel2 == 0) // Lüfterwechsel 1 & 2 wenn Zeit gekommen ist
    {
      lcd.setCursor (5, 2);
      lcd.print (F("1"));
      lcd.setCursor (5, 3);
      lcd.print (F("2"));
      analogWrite (PWM_PIN1, messwert1_2); // Analogwert Ausgabe an PWM Pin.9
      analogWrite (PWM_PIN2, messwert2_2); // Analogwert Ausgabe an PWM Pin.10
      if (luefteralarm == 1)
      {
        analogWrite (PWM_PIN2, messwert1_2); // Analogwert Ausgabe an PWM Pin.9
      }
    }
   // if (wechsel2 == 1) // Lüfterwechsel 1 & 2 wenn Zeit gekommen ist
    {
      lcd.setCursor (5, 2);
      lcd.print (F("2"));
      lcd.setCursor (5, 3);
      lcd.print (F("1"));
      analogWrite (PWM_PIN1, messwert2_2); // Analogwert Ausgabe an PWM Pin.9
      analogWrite (PWM_PIN2, messwert1_2); // Analogwert Ausgabe an PWM Pin.10
      if (luefteralarm == 1)
      {
        analogWrite (PWM_PIN1, messwert1_2); // Analogwert Ausgabe an PWM Pin.9
      }
    }
    lcd.setCursor (16, 2);
    lcd.print (F("    "));
    lcd.setCursor (16, 2);
    lcd.print (messwert1_2);

    if (luefteralarm == 1)
    {
      lcd.setCursor (16, 3);
      lcd.print (F("    "));
      lcd.setCursor (16, 3);
      lcd.print (messwert1_2);
    }
    else
    {
      lcd.setCursor (16, 3);
      lcd.print (F("    "));
      lcd.setCursor (16, 3);
      lcd.print (messwert2_2);
    }
  }
  //----Zeitsteuerung für Lüfterwechsel------
 // VorherMilles2 = millis();
   // wechsel2 = !wechsel2;
  }
  //-----------------------------------------}
  

Benutzeravatar
Admin
Administrator
Beiträge: 28
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Zusatzlüfter für PC PWM gesteuerte Lüfter

Beitrag von Admin »

In der Lüfterüberwachung war "luefteralarm =1;" noch nicht auskommentiert. Ich habe es noch geändert.

Franz

Benutzeravatar
Admin
Administrator
Beiträge: 28
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Zusatzlüfter für PC PWM gesteuerte Lüfter

Beitrag von Admin »

HRKRG hat geschrieben:
Do 21. Jan 2021, 18:06
Hallo HerrFranz
mir ist nicht bewust das ich geschrieben habe das Sie die Mails Löschen sollen
Rolf Krüger
Danke für die Antwort.
Ich fürchte das war ein anderer Rolf. Durch den gleichen Namen dachte ich die Mail war von dir. Es passte auch noch Zeitlich zusammen.

Entschuldigung, das war wohl eine Verwechslung.

Grüße
Franz

Antworten

Zurück zu „Programmierung der 8Bit Controller“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast