Moinsen,
ich bastel mir gerade eine typische temperaturgesteuerte Lüftung mit PWM Lüftern. Soweit funktioniert auch alles super. Temperatur wird auf Display ausgegeben und die Lüfter faden beim Steigen langsam bis zu einer maxTemp hoch. Nun habe ich nach folgendem Tutorial den Tachoausgang des PWM Lüfters angeschlossen und den darunter stehenden Code in meinen integriert: Reading PC Fan RPM with an Arduino | The Makers Workbench
Schließe ich alles nach dem Schaltbild an, funktioniert dies auch problemlos. Schalte ich aber nun die ganze Apperatur an mein Arduino mit einem zwischengeschalteten Transistor, wird nur noch Blödsinn angezeigt. Es kann also nur daran liegen, dass ich den Ground vom Netzteil des Lüfters durch den Transistor schicke und dies dann zu einem unkontrollierten Anzeigen von Zahlen kommt. Kennt jemand das Problem und kennt eine Lösung?
Anbei noch mein Code:
#define Tmax 45.0 // max. Temperatur
#define Tmin 20.0 // min. Temperatur
#define waittime 1000 // Aktualisierungszeit in ms
#include <LiquidCrystal.h>
#include <PWM.h>
int32_t frequency = 25000;
LiquidCrystal lcd(12, 11, 6, 5, 4, 3);
int i, temp;
int fan = 9;
int a, value;
float Temperatur = 0.0;
//***********************************************************
int NbTopsFan;
int Calc;
//The pin location of the sensor
int hallsensor = 2;
typedef struct{ //Defines the structure for multiple fans and their dividers
char fantype;
unsigned int fandiv;
}fanspec;
//Definitions of the fans
fanspec fanspace[]={{0,1},{1,2},{2,8}};
char fan1 = 1; //This is the varible used to select the fan and it's divider, set 1 for unipole hall effect sensor
//and 2 for bipole hall effect sensor
void rpm () //This is the function that the interupt calls
{
NbTopsFan++;
}
//This is the setup function where the serial port is initialised,
//and the interrupt is attached
//*****************************************************
void setup()
{
//***********************************************************
pinMode(hallsensor, INPUT);
//***********************************************************
Serial.begin(9600);
//***********************************************************
attachInterrupt(0, rpm, RISING);
//***********************************************************
lcd.begin(16,2);
pinMode(fan, OUTPUT);
pinMode(7, INPUT);
}
void loop() {
InitTimersSafe();
bool succes = SetPinFrequencySafe(9, frequency);
temp = ((5.0*analogRead(A0)*100.0)/1024);
Serial.println (temp);
fan = map(temp, Tmin, Tmax, 0, 255); // Tmin->0% // Tmax->100%
if (fan<25) fan = 0;
if (fan>255) fan = 255;
for (int i=0;i<4;i++)
{
analogWrite(9, fan); // PWM Geschwindigkeit setzen
}
//***********************************************************
NbTopsFan = 0; //Set NbTops to 0 ready for calculations
sei(); //Enables interrupts
delay (1000); //Wait 1 second
cli(); //Disable interrupts
Calc = ((NbTopsFan * 60)/fanspace[fan1].fandiv); //Times NbTopsFan (which is apprioxiamately the fequency the fan is spinning at) by 60 seconds before dividing by the fan's divider
Serial.print (Calc, DEC); //Prints the number calculated above
Serial.print (" rpm\r\n"); //Prints " rpm" and a new line
//***********************************************************
value = digitalRead(7);
//if(value == 1)
//{
// a =a+1;
// delay (1);
// }
// if(a>2)
// {
// a=0;
// }
//
// if (a==0)
// {
lcd.setCursor (0,0);
lcd.print("Temp.: ");
lcd.print(temp);
lcd.print('\xDF');
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("RPM: ");
lcd.print(Calc/20);
// }
// if (a==1)
// {
// lcd.setCursor (0, 0);
// lcd.print("Neuer Bildschirm!");
// }
}
Grüße,
Jan