řeším jeden větší projekt a jeho součástí je i 120mm PC ventilátor. Šel jsem cestou 4 pinu jelikož 3 pin řízený přes mosfet vydává dost často nepříjemné zvuky. Přikládám funkční kód kde jsou otáčky ventilátoru řízeny na základě teploty + na sériovou linku jsou poslány informace o teplotě, hodnotě posílané do ventilátoru (regulace otáček) a otáčky ventilátoru. Snad někdo využije
Kód: Vybrat vše
#include <OneWire.h>
#include <DallasTemperature.h>
volatile byte half_revolutions;
unsigned int rpm;
unsigned long timeold;
const int pinCidlaDS = 4;
const int PWMPin = 3;
int sensorVal;
OneWire oneWireDS(pinCidlaDS);
DallasTemperature senzoryDS(&oneWireDS);
void setup()
{
Serial.begin(9600);
attachInterrupt(0, rpm_fun, RISING);
half_revolutions = 0;
rpm = 0;
timeold = 0;
pinMode(PWMPin, OUTPUT);
senzoryDS.begin();
TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
TCCR2B = _BV(WGM22) | _BV(CS21);
OCR2A = 79;
OCR2B = 0;
}
void loop()
{
if (half_revolutions >= 20) {
rpm = 30*1000/(millis() - timeold)*half_revolutions;
timeold = millis();
half_revolutions = 0;
}
senzoryDS.requestTemperatures();
int in, out;
sensorVal = senzoryDS.getTempCByIndex(0);
if(sensorVal > 90){
sensorVal = 90;
}
in = sensorVal;
out = map(in, 25, 90, 7, 79);
if(sensorVal < 25){
out = 0;
rpm = 0;
}
OCR2B = out;
Serial.print("Teplota cidla DS18B20: ");
Serial.print(senzoryDS.getTempCByIndex(0));
Serial.println(" stupnu Celsia");
Serial.println(out);
Serial.println(rpm,DEC);
}
void rpm_fun()
{
half_revolutions++;
}