5V Lüftersteuerung über Arduino Nano

Hallo Leute,
Ich will meinen Panasonic TV reparieren und habe festgestellt, dass dieser bei einem Transistor am Netzteil und an der CPU sehr warm wird. Um spätere Schäden oder erneute Reparaturen zu vermeiden, will ich gleich mal mit dazu 2 5V Lüfter einbauen inklusive ein paar Heatsinks. Die Lüfter werden über Temperaturwiderstände gesteuert und als Anleitung habe ich diese Webseite genutzt: 3.4 - Temperaturgesteuerter Lüfter - Scynd.de . Soweit so gut funktioniert das mit diesem Script mit jeweils einen. Nun sollen aber beide Lüfter unabhängig über einen Nano gesteuert werden. Jeder Lüfter hat seinen eigenen Widerstand. Ich habe schon verschiedene Sachen probiert. Zum einen 2 mal den Script zu machen, aber die Variablen anzupassen, oder einmal den Script drin zu haben, aber mehrere Pins anzugeben. Beides hat nicht funktioniert, bzw gab es einen Error. Was kann ich denn noch machen, dass es geht? Die 2 Transistoren habe ich weggelassen. Es sind ja nur 2 5V Lüfter und das ganze wird später von einem USB Anschluss vom TV mit Power versorgt.
Das Script sieht jetzt so aus:

// Konstanten

const int fanPin = 8;                 // Pin für den Lüfter
const int ntc = A1;                   // Pin für den 10kO NTC Wiederstand
const int ntcNominal = 10000;         // Wiederstand des NTC bei Nominaltemperatur
const int tempNominal = 25;           // Temperatur bei der der NTC den angegebenen Wiederstand hat
const int bCoefficient = 3977;        // Beta Coefficient(B25 aus Datenblatt des NTC)
const int serienWiederstand = 10000;  // Wert des Wiederstands der mit dem NTC in Serie geschalten ist

const int CPUfanPin = 9;                 // Pin für den Lüfter
const int CPUntc = A0;                   // Pin für den 10kO NTC Wiederstand
const int CPUntcNominal = 10000;         // Wiederstand des NTC bei Nominaltemperatur
const int CPUtempNominal = 25;           // Temperatur bei der der NTC den angegebenen Wiederstand hat
const int CPUbCoefficient = 3977;        // Beta Coefficient(B25 aus Datenblatt des NTC)
const int CPUserienWiederstand = 10000;  // Wert des Wiederstands der mit dem NTC in Serie geschalten ist
 
// Variablen
int fanSpeed = 0;          // Variable für die Lüftergeschwindigkeit
int fanMin = 60;           // Kleinster PWM Wert für den Lüfter befor er abschält
int fanOut = 1;            // Variable zum pürfen ob der Lüfter aus war
int tMin = 20;             // Untere Grenze des Temperaturbereichs
int tMax = 60;             // Obere Grenze des Temperaturbereichs
int abfrageZahl = 5;       // Je mehr abfragen, desto stabiler isr das Ergebnis, dauert aber länger
int abfrage[5];            // Array Variable für das Mitteln der Temperatur
float durchschnitt = 0;    // Variable für das Mitteln der Temperatur
float temp;                // Variable für die Berechnung der temperatur nach Steinhart

int CPUfanSpeed = 0;          // Variable für die Lüftergeschwindigkeit
int CPUfanMin = 60;           // Kleinster PWM Wert für den Lüfter befor er abschält
int CPUfanOut = 1;            // Variable zum pürfen ob der Lüfter aus war
int CPUtMin = 20;             // Untere Grenze des Temperaturbereichs
int CPUtMax = 60;             // Obere Grenze des Temperaturbereichs
int CPUabfrageZahl = 5;       // Je mehr abfragen, desto stabiler isr das Ergebnis, dauert aber länger
int CPUabfrage[5];            // Array Variable für das Mitteln der Temperatur
float CPUdurchschnitt = 0;    // Variable für das Mitteln der Temperatur
float CPUtemp;                // Variable für die Berechnung der temperatur nach Steinhart
 
 
void setup()
{
  TCCR1B = TCCR1B & 0b11111000 | 0x01;   // Setzt Timer1 (Pin 9 und 10) auf 31300Hz
  Serial.begin(9600);             // Baudrate für die Ausgabe am Serial Monitor
  pinMode(fanPin, OUTPUT);        // Setzt den Pin des Lüfters als Ausgang
  pinMode(ntc, INPUT);            // Setzt den Pin des NTC Wiederstands als Eingang
  pinMode(CPUfanPin, OUTPUT);        // Setzt den Pin des Lüfters als Ausgang
  pinMode(CPUntc, INPUT);            // Setzt den Pin des NTC Wiederstands als Eingang
  }
 
 
void loop()
{
  temperaturberechnung();      // Startet die Temperaturerfassungsroutine
   
  // Lüftergeschwindigkeit über den Temperaturbereich einstellen
  // TMin->0% PWM | TMax->100% PWM
  fanSpeed = map(temp, tMin, tMax, 0, 255);    
   
  // Wenn der PWM Wert unter den van FanMin fällt, schält der Lüfter ab
  if (fanSpeed < fanMin)
  {
    fanSpeed = 0;
    fanOut = 1;
  }
{

   
  // Lüftergeschwindigkeit über den Temperaturbereich einstellen
  // TMin->0% PWM | TMax->100% PWM
  CPUfanSpeed = map(CPUtemp, CPUtMin, CPUtMax, 0, 255);    
   
  // Wenn der PWM Wert unter den van FanMin fällt, schält der Lüfter ab
  if (CPUfanSpeed < CPUfanMin)
  {
    CPUfanSpeed = 0;
    CPUfanOut = 1;
  }
   
  // Hysterese
  if (fanOut == 1)
  {
    fanSpeed = 0;
  }
   
  if(temp >= 32)
  {
    if(fanOut == 1)
    {
      fanOut = 0;
      analogWrite(fanPin, 255);
    }
  }
  if (CPUfanOut == 1)
  {
    CPUfanSpeed = 0;
  }
   
  if(CPUtemp >= 32)
  {
    if(CPUfanOut == 1)
    {
      CPUfanOut = 0;
      analogWrite(CPUfanPin, 255);
    }
  }
   
  // PWM Wert auf 255 begerenzen  
  if (fanSpeed > 255)
  { 
    fanSpeed = 255;
  }
  if (CPUfanSpeed > 255)
  { 
    CPUfanSpeed = 255;
  }
   
  // Lüftergeschwindigkeit über den Seriellen Monitor ausgeben
  Serial.print("Lueftergeschwindigkeit: ");          
  Serial.println(fanSpeed);
  Serial.print("CPULueftergeschwindigkeit: ");          
  Serial.println(CPUfanSpeed);
 
  analogWrite(fanPin, fanSpeed);      // Den Lüfter mit dem PWM Wert ansteuern
  analogWrite(CPUfanPin, CPUfanSpeed);      // Den Lüfter mit dem PWM Wert ansteuern
  delay(500);  
} 
 
 
 
void temperaturberechnung()
{
  // Nimmt N Abfragen in einer Reihe, mit einem kurzen delay
  for (int i=0; i < abfrageZahl; i++)
  {
    abfrage[i] = analogRead(ntc);
    
    delay(10);
  }
   
  // Mittelt alle Abfragen
  durchschnitt = 0;
  for (int i=0; i < abfrageZahl; i++)
  {
    durchschnitt += abfrage[i];
  }
  durchschnitt /= abfrageZahl;
   
  // Umwandlung des Wertes in Wiederstand
  durchschnitt = 1023 / durchschnitt - 1;
  durchschnitt = serienWiederstand / durchschnitt;
   
  // Umrechnung aller Ergebnisse in die Temperatur mittels einer Steinhard Berechnung
  temp = durchschnitt / ntcNominal;     // (R/Ro)
  temp = log(temp);                     // ln(R/Ro)
  temp /= bCoefficient;                 // 1/B * ln(R/Ro)
  temp += 1.0 / (tempNominal + 273.15); // + (1/To)
  temp = 1.0 / temp;                    // Invertieren
  temp -= 273.15;                       // Umwandeln in °C
   
  // Ausgabe an den Seriellen Monitor
  Serial.print("Temperatur ");
  Serial.print(temp);
  Serial.println(" *C");
   
  delay(500);
  
 // Nimmt N Abfragen in einer Reihe, mit einem kurzen delay
  for (int i=0; i < CPUabfrageZahl; i++)
  {
    CPUabfrage[i] = analogRead(CPUntc);
    
    delay(10);
  }
   
  // Mittelt alle Abfragen
  CPUdurchschnitt = 0;
  for (int i=0; i < CPUabfrageZahl; i++)
  {
    CPUdurchschnitt += CPUabfrage[i];
  }
  CPUdurchschnitt /= CPUabfrageZahl;
   
  // Umwandlung des Wertes in Wiederstand
  CPUdurchschnitt = 1023 / CPUdurchschnitt - 1;
  CPUdurchschnitt = CPUserienWiederstand / CPUdurchschnitt;
   
  // Umrechnung aller Ergebnisse in die Temperatur mittels einer Steinhard Berechnung
  CPUtemp = CPUdurchschnitt / CPUntcNominal;     // (R/Ro)
  CPUtemp = log(temp);                     // ln(R/Ro)
  CPUtemp /= CPUbCoefficient;                 // 1/B * ln(R/Ro)
  CPUtemp += 1.0 / (CPUtempNominal + 273.15); // + (1/To)
  CPUtemp = 1.0 / CPUtemp;                    // Invertieren
  CPUtemp -= 273.15;                       // Umwandeln in °C
   
  // Ausgabe an den Seriellen Monitor
  Serial.print("CPUTemperatur ");
  Serial.print(CPUtemp);
  Serial.println(" *C");
   
  delay(500);
}

Allerdings gibt es auch hier Errors:

Arduino: 1.8.13 (Windows 10), Board: "Arduino Nano, ATmega328P (Old Bootloader)"
C:\Users\steph\Documents\Arduino\sketch_feb14a\sketch_feb14a.ino: In function 'void loop()':
sketch_feb14a:54:3: error: 'temperaturberechnung' was not declared in this scope
   temperaturberechnung();      // Startet die Temperaturerfassungsroutine
   ^~~~~~~~~~~~~~~~~~~~
sketch_feb14a:132:1: error: a function-definition is not allowed here before '{' token
 {
 ^
sketch_feb14a:202:1: error: expected '}' at end of input
 }
 ^
exit status 1
'temperaturberechnung' was not declared in this scope

MfG
Stephan

Hallo
lade am Besten Sketch hoch, damit wir sehen können was Du gemacht hast.
Und dazu einen Link zum verwendeten Lüfter.

stephanpr:
Beides hat nicht funktioniert, bzw gab es einen Error. Was kann ich denn noch machen, dass es geht?

Code zeigen
Fehlermeldung zeigen

Also wenn in deinem TV Transistoren zu heiß werden, liegt das sicher nicht an den Transistoren, sondern weil irgend etwas anderes defekt ist. Das solltest du suchen und reparieren.
So wie du diese Reparatur durchführen möchtest, geht das sicher nach hinten los.

Was verstehst Du unter "sehr warm"? Die meisten Halbleiter dürfen (im Silizium) 150°C warm werden. Das Gehäuse kann schon mal 60 - 80° warm werden. Wenn Du schon was machen willst genügt meines Erachtens schon ein Kühlkörper.
Grüße Uwe

paulpaulson:
Hallo
lade am Besten Sketch hoch, damit wir sehen können was Du gemacht hast.
Und dazu einen Link zum verwendeten Lüfter.

Einen Link zu den Lüftern habe ich leider nicht. einmal ist es ein 8,5V lüfter aus einer PS2 Slim und einmal ein alter Notebook Lüfter. Ich hebe solche Sachen meist auf für zukünftige Projekte. Der bearbeitete Script, so wie die Errors stehen jetz im Start Beitrag.

HotSystems:
Also wenn in deinem TV Transistoren zu heiß werden, liegt das sicher nicht an den Transistoren, sondern weil irgend etwas anderes defekt ist. Das solltest du suchen und reparieren.
So wie du diese Reparatur durchführen möchtest, geht das sicher nach hinten los.

Das ist mir schon klar, deswegen werden auch andere Teile gleich mit ausgetauscht. Ich habe zwar ein neues Netzteilboard da, aber habe ich die Befürchtung, dass es nur für 120V ist auf der Primärseite, da es aus den USA ist. Die defekten Bauteile sind auf der Sekundärseite und zum Glück baugleich.

stephanpr:
Das ist mir schon klar, deswegen werden auch andere Teile gleich mit ausgetauscht. Ich habe zwar ein neues Netzteilboard da, aber habe ich die Befürchtung, dass es nur für 120V ist auf der Primärseite, da es aus den USA ist. Die defekten Bauteile sind auf der Sekundärseite und zum Glück baugleich.

Ok, das hört sich nicht gerade an, als wenn da ein System hinter steckt.
Das 120V Netzteil solltest du besser nicht verwenden.

Mein Tipp, repariere es richtig oder lass es richtig reparieren.
Mehr möchte ich nicht mehr dazu sagen.

uwefed:
Was verstehst Du unter “sehr warm”? Die meisten Halbleiter dürfen (im Silizium) 150°C warm werden. Das Gehäuse kann schon mal 60 - 80° warm werden. Wenn Du schon was machen willst genügt meines Erachtens schon ein Kühlkörper.
Grüße Uwe

Das ist mir auch klar. Dennoch ist mir bei der Ersatzteilbeschaffung in EBay aufgefallen, das viele Netzteilboards so aussehen. Ich hatte das Glück, ein sauberes aus den USA zu bekommen, nur eben Leider eins für 120V. Deswegen werde ich nur 5 Bauteile übernehmen und dann die Lüfter einbauen. Kühlkörper habe ich schon soweit verteilt.

Hallo
formatiere den Sketch mit cntr+T und verfolge den Verlauf der {} Akkoladen.

paulpaulson:
Hallo
formatiere den Sketch mit cntr+T und verfolge den Verlauf der {} Akkoladen.

Hallo,
Danke hat funktioniert. einer hat am Ende von void loop gefehlt.

Ich vermute mal, dass das ein Schaltnetzteil ist. Diese haben einen 'Weitbereichseingang' im Allgemeinen von 100 - 240 Volt. Solange, wie du in diesem Bereich bleibst, ist egal was die bekommen. Und 'warm werden' ist seeeeehr relativ.

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