You are not logged in.

Naozumi

Neu Hier!

Posts: 3

Date of registration: Oct 27th 2016

Thanks: 1

  • Send private message

41

Thursday, October 27th 2016, 10:53am

Erster versuch einer eigenen Lüftersteuerung

Hi Scynd

klasse Project hast du da!!
Wollte mich auch mal dran versuchen und hab hier ein Code für einen attiny85 von Digispark.

Könnte das so klappen?
Ich habe mich anstatt des NTC für einen TMP36 entschieden da ich mir dann die Steinhardt Formel sparen kann..

Ich weiß der Code ist jetzt nicht nach Richtline geschrieben aber das ist mein erster Code in C. Drum sei es mir verziehen...

Die Lüfterkurve besteht aus 5 teilen.
Erster Teil ist die Mindestdrehzahl bis zu einer bestimmten Temperatur.
2. bis 4. Teil ist eine Linearfunktion die je nach Temperatur steiler wird.
Sobald die Temperatur einen bestimmten Wert überschritten hat wird die Maximaldrehzahl verwendet.
Zusätzlich kann die ganze Kennlinie mithilfe des Potis manuell nach oben verschoben werden.


Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
int temp1 = 30;

int speed1 = 20;

int temp2 = 40;

int speed2 = 40;

int temp3 = 50;

int speed3 = 60;

int temp4 = 60;

int speed4 = 80;

int speedMax = 100;



int AI_TMP36 = 0; //THIS IS P5, P5 is Analog Input 0, so when you are using analog read you refer to it as 0

int time= 20;

int temp[10];

int temperature = 0;

int AI_potentiometer = 3;

int manualAdjust = 0;

int AO_clkAmplifier = 4;

int clkOutputPercent = 0;

int clkOutputValue = 0;

int DO_greenLed = 0;

int DO_yellowLed = 1;

int DO_redLed = 2;



void setup() 
{
pinMode(AO_clkAmplifier, OUTPUT);
pinMode(DO_greenLed, OUTPUT);
pinMode(DO_yellowLed, OUTPUT);
pinMode(DO_redLed, OUTPUT);
pinMode(AI_potentiometer, INPUT);
pinMode(AI_TMP36, INPUT);
}


void loop() 
{


//get average Temperature in Celsius
{

for (int i = 0; i < 10; i++)
{
temp[i] = map(analogRead(AI_TMP36), 0, 410, -50, 150);
delay(time);
}

temperature=(temp[0]+temp[1]+temp[2]+temp[3]+temp[4]+temp[5]+temp[6]+temp[7]+temp[8]+temp[9])/10;

}


//get manual adjust in Percent
{
manualAdjust = map(analogRead(AI_potentiometer), 0, 1023, 0, 100);
}


//calculate clk output in percent, add manualAdjust and then convert in analog output range
{

if (temperature <= temp1) // Minimal speed
{
clkOutputPercent = speed1;
}

if (temperature > temp1 and temperature <= temp2) // Speed2
{
int m1 = (speed2 - speed1) / (temp2 - temp1); // calculate linear function
int b1 = speed2 - m1 * temp2;
int fx1 = m1 * temperature + b1;
clkOutputPercent = fx1;
}

if (temperature > temp2 and temperature <= temp3) // Speed3
{
int m2 = (speed3 - speed2) / (temp3 - temp2); // calculate linear function
int b2 = speed3 - m2 * temp3;
int fx2 = m2 * temperature + b2;
clkOutputPercent = fx2;
}

if (temperature > temp3 and temperature <= temp4) // Speed4
{
int m3 = (speed4 - speed3) / (temp4 - temp3); // calculate linear function
int b3 = speed4 - m3 * temp4;
int fx3 = m3 * temperature + b3;
clkOutputPercent = fx3;
}

if (temperature > temp4) // set maximal speed when temperature > temp4
{
clkOutputPercent = speedMax;
}

clkOutputPercent = clkOutputPercent + manualAdjust; // add manualAdjust to rise the speed manually

if (clkOutputPercent > 100) // maximal 100% limiter
{
clkOutputPercent = 100;
}

clkOutputValue = (255 / 100 * clkOutputPercent); //convert from Percent to Analog output range

analogWrite(AO_clkAmplifier, clkOutputValue);
}


// set Temperature Leds
{

if (temperature <= temp1)
{
digitalWrite(DO_greenLed, HIGH);
digitalWrite(DO_yellowLed, LOW);
digitalWrite(DO_redLed, LOW);
}

if (temperature > temp1 and temperature <= temp2)
{
digitalWrite(DO_greenLed, HIGH);
digitalWrite(DO_yellowLed, HIGH);
digitalWrite(DO_redLed, LOW);
}

if (temperature > temp2 and temperature <= temp3)
{
digitalWrite(DO_greenLed, LOW);
digitalWrite(DO_yellowLed, HIGH);
digitalWrite(DO_redLed, LOW);
}

if (temperature > temp3 and temperature <= temp4)
{
digitalWrite(DO_greenLed, LOW);
digitalWrite(DO_yellowLed, HIGH);
digitalWrite(DO_redLed, HIGH);
}

if (temperature > temp4)
{
digitalWrite(DO_greenLed, LOW);
digitalWrite(DO_yellowLed, LOW);
digitalWrite(DO_redLed, HIGH);
}

}
}

This post has been edited 1 times, last edit by "Naozumi" (Oct 27th 2016, 12:22pm)


Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 912

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 73

  • Send private message

42

Friday, October 28th 2016, 9:03am

Hi Naozumi!
Also erstmal muss ich sagen, der Code , besonders für die Lüfterkurve sehen echt gut aus. Muss ich mir merken :D
Der einzigen Fehler die ich gefunden habe sind in Zeile 90, 98 und 106.

Aus

Source code

1
if (temperature > temp1 and temperature <= temp2)

musst du

Source code

1
if (temperature > temp1 && temperature <= temp2)

machen. Oder funktioniert das mit "and"? Wäre mir jetzt zumindest nicht bekannt :rolleyes:

Dann sage ich mal, Hut ab :thumbsup:

Wenn die die Steuerung gebaut hast, würde ich mich freuen, wenn du sie hier im Forum mal vorstellen würdest, da das wirklich eine schöne kleine Steuerung ist, die ja auch wunderbar auf mehr Kanäle erweitert werden kann :thumbup:


Gruß Scynd


1 registered user thanked already.

Users who thanked for this post:

Naozumi (28.10.2016)

Naozumi

Neu Hier!

Posts: 3

Date of registration: Oct 27th 2016

Thanks: 1

  • Send private message

43

Friday, October 28th 2016, 9:53am

Danke für deine Anerkennung und Hilfe xD
In unseren Codes für die Maschinen die wir programmieren machen wir das nur so mit and....
Ich weiß nicht wie das bei Microcontrollern ist.
Wie ich sehe bist du auch Mschinenbautechniker xD
Ich bin in der sparte Sekundär und Teritär verpackung unterwegs und arbeite mit Steuerungen wie Rockwell, Schneider(elau) und S7

Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 912

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 73

  • Send private message

44

Friday, October 28th 2016, 10:43am

Hehehe, jaja die Maschinenbauer ^^
Programmiertechnisch habe ich in der Arbeit gar nichts zu tun, da ich im Testgeschäft (Vibration und Schock) tätig bin, von daher bin ich da relativ blank was das Wissen angeht :P
Ich habe mich rein aus Hobbygründen an die Programmierung rangewagt und schnell Spaß daran gefunden.


Naozumi

Neu Hier!

Posts: 3

Date of registration: Oct 27th 2016

Thanks: 1

  • Send private message

45

Friday, October 28th 2016, 11:34am

Eine frage noch
Der PWM ausgang von dem attiny85 kann doch direkt an den PWM eingang vom 12v Lüfter angeschlossen werden oder?

hier eine etwas aufgeräumtere version des Codes

Quellcode

Quoted


//Variables for Fancurve calculation
{
int temp1 = 30;

int speed1 = 20;

int temp2 = 40;

int speed2 = 40;

int temp3 = 50;

int speed3 = 60;

int temp4 = 60;

int speed4 = 80;

int speedMax = 100;
}

//Constantes
{
int AI_TMP36 = 0; //THIS IS P5, P5 is Analog Input 0, so when you are using analog read you refer to it as 0

int DO_greenLed = 0;

int DO_yellowLed = 1;

int DO_redLed = 2;

int AI_potentiometer = 3;

int AO_clkAmplifier = 4;
}

//Aplication Variables
{
int temp[10];

int time= 20;

int temperature = 0;

int manualAdjust = 0;

int clkOutputPercent = 0;

int clkOutputValue = 0;
}




void setup()
{
pinMode(AO_clkAmplifier, OUTPUT);
pinMode(DO_greenLed, OUTPUT);
pinMode(DO_yellowLed, OUTPUT);
pinMode(DO_redLed, OUTPUT);
pinMode(AI_potentiometer, INPUT);
pinMode(AI_TMP36, INPUT);
}


void loop()
{

//get average Temperature in Celsius
{

for (int i = 0; i < 10; i++)
{
temp = map(analogRead(AI_TMP36), 0, 410, -50, 150);
delay(time);
}
temperature=(temp[0]+temp[1]+temp[2]+temp[3]+temp[4]+temp[5]+temp[6]+temp[7]+temp[8]+temp[9])/10;
}


//calculate clk output in percent, add manualAdjust and then convert in analog output range
{

if (temperature <= temp1) // Minimal speed
{
clkOutputPercent = speed1;
}

if (temperature > temp1 and temperature <= temp2) // Speed2
{
int m1 = (speed2 - speed1) / (temp2 - temp1); // calculate linear function
int b1 = speed2 - m1 * temp2;
int fx1 = m1 * temperature + b1;
clkOutputPercent = fx1;
}

if (temperature > temp2 and temperature <= temp3) // Speed3
{
int m2 = (speed3 - speed2) / (temp3 - temp2); // calculate linear function
int b2 = speed3 - m2 * temp3;
int fx2 = m2 * temperature + b2;
clkOutputPercent = fx2;
}

if (temperature > temp3 and temperature <= temp4) // Speed4
{
int m3 = (speed4 - speed3) / (temp4 - temp3); // calculate linear function
int b3 = speed4 - m3 * temp4;
int fx3 = m3 * temperature + b3;
clkOutputPercent = fx3;
}

if (temperature > temp4) // set maximal speed when temperature > temp4
{
clkOutputPercent = speedMax;
}

manualAdjust = map(analogRead(AI_potentiometer), 0, 1023, 0, 100);
clkOutputPercent = clkOutputPercent + manualAdjust; // add manualAdjust to rise the speed manually

if (clkOutputPercent > 100) // maximal 100% limiter
{
clkOutputPercent = 100;
}

clkOutputValue = (255 / 100 * clkOutputPercent); //convert from Percent to Analog output range

analogWrite(AO_clkAmplifier, clkOutputValue);
}


// set Temperature Leds
{

if (temperature <= temp1)
{
digitalWrite(DO_greenLed, HIGH);
digitalWrite(DO_yellowLed, LOW);
digitalWrite(DO_redLed, LOW);
}

if (temperature > temp1 and temperature <= temp2)
{
digitalWrite(DO_greenLed, HIGH);
digitalWrite(DO_yellowLed, HIGH);
digitalWrite(DO_redLed, LOW);
}

if (temperature > temp2 and temperature <= temp3)
{
digitalWrite(DO_greenLed, LOW);
digitalWrite(DO_yellowLed, HIGH);
digitalWrite(DO_redLed, LOW);
}

if (temperature > temp3 and temperature <= temp4)
{
digitalWrite(DO_greenLed, LOW);
digitalWrite(DO_yellowLed, HIGH);
digitalWrite(DO_redLed, HIGH);
}

if (temperature > temp4)
{
digitalWrite(DO_greenLed, LOW);
digitalWrite(DO_yellowLed, LOW);
digitalWrite(DO_redLed, HIGH);
}

}
}

1 registered user thanked already.

Users who thanked for this post:

the_leon (04.12.2016)

Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 912

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 73

  • Send private message

46

Friday, October 28th 2016, 1:53pm

Achso, es geht um einen 4Pin Lüfter.
Naja, du muss, bevor du den PWM Pin vom Arduino an den PWM Pin vom Lüfter hängen kannst, die Frequenz des PWM Pins des Arduino erhöhen. Der läuft standartmäßig auf 490Hz glaub ich.
Laut Intel Spezifikation muss der aber 25kHz sein. 25kHz kannst du mit den Atmega AVRs nicht passend einstellen, aber 31,3kHz gehen.

Dazu hab ich hier schon ein Tutorial verfasst

Leider weiß ich nicht, ob das mit dem Befehl auch einfach beim Tiny klappt. musst du mal testen. Da wird eigentlich einfach nur ein Prescaler Wert geändert der aus dem Haupttakt des AVR(Tiny), den Takt des Timers einstellt, an dem auch der PWM hängt.


luke301

Neu Hier!

Posts: 2

Date of registration: Dec 4th 2016

  • Send private message

47

Sunday, December 4th 2016, 9:42pm

Hi,

ich verfolge den Thread nun schon eine ganze Weile und habe selbst damit begonnen auf der Basis hier eine Lüftersteuerung für meinen PC zu erstellen.
Ich bin jetzt soweit, dass ich die Temperatur Regelung mit der Poti Steuerung kombiniert habe und theoretisch soweit wäre alles auf eine Platine zu bringen und den Einbau ins Gehäuse zu planen.
Ich fände es allerdings einbautechnisch besser, wenn ich den Poti durch Software ersetzen könnte und per Java GUI diesen quasi simuliere.
Hier zwei Ideen, wie ich denke, dass es funktionieren könnte:

1.: Einen USB-Header auf dem Mainboard mit dem Arduino verbinden und das ganze über USB realisieren. Hätte auch den Vorteil, dass man den Arduino in eingebautem Zustand weiter programmieren könnte.
2.: Den physischen COM-Port meines Mainboards verwenden, um so über die RX-TX Anschlüsse des Arduinos mit diesem zu kommunizieren.

Könnte davon irgendwas funktionieren?

Vielleicht ist ja irgendjemand fit auf diesem Gebiet und kann mir weiterhelfen. Vielen Dank schon mal.

Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 912

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 73

  • Send private message

48

Monday, December 5th 2016, 7:39am

Hi luke,
ich würde den USB Header nehmen. Wie du schon gesagt hast, kannst du dann auch einfach weiter am Arduino programmieren. Ich werde das genauso mit meiner Wasserkühlungssteuerung machen.
Ich bin leider nicht fit in Java, von daher kann ich da nicht helfen. Ich habe bisher begonnen, mit Visual Studio in C# ein Programm zu schreiben mit dem ich die Temperaturen und Auslastungen des Computers auslese. Das funktioniert bisher schon mal, allerdings erkennt es noch nicht zuverlässig jede Hardware. Ich habe geplant, dass die Software dann mit dem Arduino Daten über die serielle Schnittstelle austauscht. Also CPU und GPU Temp zum Arduino und Wassertemperatur und Lüftergeschwindigkeit zurück zum PC. Das habe ich aber noch nicht implementiert. Ich habe auch schon ewig nichts mehr an der Software gemacht, da ich sie nochmal neu und schön als WPS machen wollte (aktuell ist es ein Windows Form).

Wäre aber cool, wenn du das mit Java hinbekommst und dein Projekt dann hier vorstellst :thumbsup:


Gruß Scynd


luke301

Neu Hier!

Posts: 2

Date of registration: Dec 4th 2016

  • Send private message

49

Monday, December 5th 2016, 3:55pm

Ist es eigtl. einfach so möglich den Arduino während dem Betrieb mit Daten über USB zu versorgen?

Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 912

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 73

  • Send private message

50

Monday, December 5th 2016, 8:54pm

Jup, über den seriellen Port. Das kannst du einfach testen. Du kannst in den eingebauten seriellen Monitor der Arduino IDE oben was eintrage und an den Arduino senden. Auf dem Arduino muss natürlich der passende Code laufen um das auslesen und weiter verarbeiten zu können.

Da gibt es schon Beispielcode in der Arduino IDE. Unter Datei/Beispiele/Communication sind ein paar Serielle Beispiele.


Gruß Bert


misfit

Neu Hier!

Posts: 3

Date of registration: Oct 8th 2017

  • Send private message

51

Monday, October 16th 2017, 6:53am

Hi zusammen und vielen Dank an Scynd für die Anleitung.

Bin auch noch ein Frischling im Thema Arduino und habe mir das Projekt mal als erstes vorgenommen.

Thema ist ich habe einen Kühlschrank mit einem kleinen Hitzestau und will mit der Lüftersteuerung und nem 140er Super Silent Lüfter bisschen die Luft verquirlen *ggg*

Meine Teileliste sieht wie folgt aus:

Arduino Nano V3.0 (hatte ich noch hier rumfahren)
Meanwell RS25-12
NTC10kOhm an 2m Siliconkabel
Kaltgeräte-Einbaustecker
Kaltgerätekabel
240V/10A Switch
10kOhm Wiederstand
140mm PWM Lüfter 3 adrig

Das ganze kommt dann ich ein 3D gedrucktes Gehäuse.

So jetzt zu meiner Frage. Kann ich das ganze mit dem Nano umsetzen?
Sollte doch funktionieren.

Wenn jemand Anregungen hat.....

Gruß,
Sascha

This post has been edited 1 times, last edit by "misfit" (Oct 16th 2017, 7:07am)


Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 912

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 73

  • Send private message

52

Monday, October 16th 2017, 7:32am

Hallo misfit,
klar funktioniert das mit dem Nano. Für die PWM Lüfter musst du nur eine Zeile Code einfügen, damit die PWM Frequenz vom Arduino auf 31kHz eingestellt ist. Siehe hier
Die Restliche Steuerung kannst du hier unter 3.2 nachlesen ;)

Viel Spaß beim basteln! :thumbsup:

Gruß Scynd


1 registered user thanked already.

Users who thanked for this post:

misfit (24.10.2017)

misfit

Neu Hier!

Posts: 3

Date of registration: Oct 8th 2017

  • Send private message

53

Tuesday, October 24th 2017, 6:24am

Hi Zusammen,
also meine Bestellungen sind jetzt alle da.
Ich hätte aber noch zwei Fragen.
Das Gelbe Kabel vom Lüfter brauche ich nicht und das mit dem zweiten Widerstand habe nicht verstanden.
Ansonst habe ich mal ein Bilder angefügt.

Gruß,
Sascha
misfit has attached the following image:
  • Skizze.JPG

Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 912

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 73

  • Send private message

54

Tuesday, October 24th 2017, 7:36am

Hi Sascha,
wenn du die Drehzahl des Lüfters nicht auslesen willst, brauchst du das gelbe Kabel nicht. Der 10kOhm Widerstand bildet zusammen mit dem 10kOhm NTC einen Spannungsteiler.
Wenn du einen 10kOhm Widerstand an GND und einen 10kOhm an 5V anschließt und die Beiden verbindet, so ergibt sich in der Mitte eine Spannung von 2,5V. Ändert sich nun das Verhältnis die Widerstandswerte, so ändert sich auch die Spannung in der Mitte. Der NTC ist ja "nur" ein Widerstand, der bei Temperatur seinen Widerstandswert verändert. Mit dem Arduino misst man hier die Spannung der Mitte und berechnet aus dieser Änderung die Temperatur ;)


misfit

Neu Hier!

Posts: 3

Date of registration: Oct 8th 2017

  • Send private message

55

Wednesday, October 25th 2017, 6:36am

Hi Scynd,
ah jetzt ja ....Dankeschön.... verstehe. Werde aber bei mir dann die Drehzahl auch noch auslesen :-)



Gruß,

Sascha

Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 912

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 73

  • Send private message

56

Wednesday, October 25th 2017, 7:31am

Mach das. Wenn du Probleme mit der Drehzahl hast, melde dich einfach :thumbup:


black_devil

Neu Hier!

Posts: 4

Date of registration: Nov 3rd 2017

  • Send private message

57

Friday, November 3rd 2017, 1:26pm

Hallo, habe alles so aufgebaut wie im Beispiel 3.3, jedoch interessiert das meinen lüfter nicht wenn ich am poti drehe.

Die Drehzahl wird korrekt im Serial Monitor angezeigt und die Massen sind auch gebrückt.

Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 912

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 73

  • Send private message

58

Friday, November 3rd 2017, 8:45pm

Hallo black_devil,
winn der Poti richtig ausgelesen wird, dann begrenzt das den Fehler auf den MOSFET oder den Lüfter. Was für einen MOSFET und Lüfter hast du denn?
Kannst du ein Foto vom Aufbau machen, auf dem man alles erkennen kann? Dann kann ich besser weiterhelfen.

Gruß Scynd


black_devil

Neu Hier!

Posts: 4

Date of registration: Nov 3rd 2017

  • Send private message

59

Friday, November 3rd 2017, 8:59pm

Also als Lüfter verwende ich einen Fractal Design 140mm 3 Pin Lüfter

Als MOSFET einen IRLZ 34N



Ich hoffe du kannst alles erkennen

This post has been edited 1 times, last edit by "black_devil" (Nov 3rd 2017, 9:32pm)


der_george

"Mein Name ist George - Der George"

Posts: 4,803

Date of registration: Mar 17th 2010

Location: Da wo der Berch wohnt

Occupation: Inginöööör und Freundinbeschäftiger

Thanks: 354

  • Send private message

60

Sunday, November 5th 2017, 2:10am

Ich bin zwar nicht der Bert, aber ich glaube ich habe dein Fehler.

Deine unteren Versorgungsleisten (+- auf Breadboard) sind nicht versorgt, wenn ich das richtig sehe.

So long :0)
Meine Mods bei we-mod-it:
24h Stealth - 1.Platz 24h Livemodding DCMM 2010 | | taabar sin - 2. Platz Casemod DCMM 2012 | | 24h Semmetastic - 2. Platz 24h Livemodding DCMM 2013

Mein Modding-Verkaufsthread