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

Fertige Geräte mit Bilden, Schaltungen, Programmen vorstellen.
Benutzeravatar
Admin
Administrator
Beiträge: 1194
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: 1194
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: 1194
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: 5
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: 1194
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: 1194
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
HRKRG
Beiträge: 5
Registriert: Mo 7. Dez 2020, 16:27
Kontaktdaten:

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

Beitrag von HRKRG »

entschulddige das ich mich jetz erst melde muste auf einen neuen Arduino warten hatte Ihn zerschossen
Bitte schau noch mal über das Programm
Habe den Messwert 1_2 und 2_2 verändert da drehen die Lüfter schneller
Bitte kommentiere wechsel 2 ich weiß nicht ob ich es richtig gemacht habe

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 = 4;
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 > 60) && (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, 70, (PWMmin-1), 255);
    messwert2_2 = map(messwert2, 25, 70, (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;
  }
}



mit freundlichen Herms Rolf Krüger :) :) :) :xx:
Benutzeravatar
Admin
Administrator
Beiträge: 1194
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

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

Beitrag von Admin »

Und jetzt soll ich alles durchsuchen, wo du die Werte verändert hast, dass die Lüfter schneller drehen ?
Kopiere mir bitte die Programmzeilen, wo du das verändert hast, dann kann ich mir das anschauen.

Und was soll ich bei wechsel2 "kommentieren"? ?

Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1194
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 du dich nicht mehr rührst. Ich fürchte du verwechselst da was. Wir haben keinen Dienstleister Vertrag. Deshalb helfe ich gerne, aber man sollte sich bemühen es den Helfenden möglichst leicht zu machen, dass er versteht worum es dir geht. Wenn du jemanden suchst der dir die Füße küßt, dann mußt du einen suchen der für mehr als 100,- Euro in der Std. "deine Auftrage bearbeitet". Hier ist das leider nicht der Fall. Ich mache das als Hobby, und wenn man mir freundlich begegnet, mache ich das auch gerne.

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

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

Beitrag von Admin »

Ich habe jetzt doch nochmal das Programm ein wenig angepasst. Die PWM - Steuerung für die Zusatzlüfter am PC hatte in der letzten Zeit doch immer mal wieder falsche Messwerte bekommen. Und ich habe in dem Programm bisher eine "Ersatztemperatur" als Messung übernommen, wenn der "Messwert" sicher nicht richtig war. Das war beim CPU Lüfter 40 Grad, bei der Raumtemp. 30 Grad. Gestern habe ich mal den Kopf zur Seite gelegt, dass das Hirn zusammenläuft, und habe dabei entschieden dass das Schwachsinn ist. Wenn ich dauend richtige Werte messe, und dann nur einen eindeutig falschen Wert bekomme, dann kann ich ja auch den letzten richtigen Messwert anstelle der Falsch-Messung einsetzen. Was ja eindeutig besser ist. Deshalb habe ich das Programm angepasst.
Hier ist das neue jetzt mal für den UNO:

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, 20, 4);

int messwert1 = 0;
int messwert1_2 = 0;
int temp1alt = 0;
int messwert2 = 0;
int messwert2_2 = 0;
int temp2alt = 0;
unsigned long Beginn = 0;
const unsigned long Timer2 = (60000UL * 60); // Alle 60 Min. Lüftertausch
unsigned long VorherMilles2 = 0;
byte wechsel2 = 0;
byte luefteralarm = 0;
byte sensortausch = 0;// 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 = 35; // 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();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor (0, 0);
  lcd.print (F("L\365fter"));
  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() {
  Beginn = millis();
  //------------------------------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))
      {
        temp1alt = temperatur;
      }
      if ((temperatur < 0) && (Sensor == 1))
      {
        /*Serial.println(F("Sensor1"));
          Serial.println(temperatur);
          Serial.println(temp1alt);
          Serial.println(Beginn / 60000);
        */
        temperatur = temp1alt;
      }
      // ----Sensor2------
      if ((temperatur > 0) && (Sensor == 2))
      {
        temp2alt = temperatur;
      }
      if ((temperatur < 0) && (Sensor == 2))
      {
        /*Serial.println(F("Sensor2"));
          Serial.println(temperatur);
          Serial.println(temp2alt);
          Serial.println(Beginn / 60000);
        */
        temperatur = temp2alt;
      }
      //------------------------------------------------------------------
      // ---------------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 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------
  if (millis() - VorherMilles2 >= Timer2)
  {
    VorherMilles2 = millis();
    wechsel2 = !wechsel2;
  }
  //-----------------------------------------
}
Antworten

Zurück zu „Fertige Projekte Vorstellen“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste