Advertisement
TerAnYu

PWM Fan Control

Nov 24th, 2018
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // OneWire DS18B20 Temperature Switch on ATtiny85
  2. // http://www.nerdkits.com/forum/thread/2849/
  3. // source: http://www.electroschematics.com/9540/arduino-fan-speed-controlled-temperature/
  4.  
  5. #include <OneWire.h>
  6. #include <FanController.h>
  7.  
  8. // fan switch temperatures
  9. #define TEMP_MIN 30 // C°
  10. #define TEMP_MAX 50 // C°
  11.  
  12. // #define FT_START 3000 // msec
  13. #define FT_START 5000 // msec
  14. #define DELAY_TIMEOUT    1000
  15. #define PWM_MIN 60 // минимальное значение pwm
  16. #define PWM_MAX 255 // максимальное значение pwm
  17. // Choose a threshold in milliseconds between readings.
  18. // A smaller value will give more updated results,
  19. // while a higher value will give more accurate and smooth readings
  20. #define SENSOR_THRESHOLD 1000
  21.  
  22. // pins ds18b20
  23. #define DS_1 21
  24. #define DS_2 20
  25.  
  26. // #define STATUS_LED  2
  27. #define FAN_1 5
  28. #define FAN_2 6
  29.  
  30. // read speed
  31. #define FANRPM_1 14
  32. #define FANRPM_2 14
  33.  
  34. OneWire TemperatureSensor1(DS_1);  // Dallas one wire data buss pin, a 4.7K resistor pullup is needed
  35. OneWire TemperatureSensor2(DS_2);  // Dallas one wire data buss pin, a 4.7K resistor pullup is needed
  36. FanController FANRPM1(FANRPM_1, SENSOR_THRESHOLD);
  37. FanController FANRPM2(FANRPM_2, SENSOR_THRESHOLD);
  38.  
  39. void setup() {
  40.     Serial.begin(9600);
  41.    
  42.     pinMode(FAN_1, OUTPUT);
  43.     pinMode(FAN_2, OUTPUT);
  44.    
  45.     // pinMode(STATUS_LED, OUTPUT);
  46.  
  47.     // delay(1000);
  48.     // расскрутить после включения на максимум на время FT_START и после выставить минимальную скорость
  49.     analogWrite(FAN_1, PWM_MAX);
  50.     analogWrite(FAN_2, PWM_MAX);
  51.     delay(FT_START);
  52.     analogWrite(FAN_1, PWM_MIN);
  53.     analogWrite(FAN_2, PWM_MIN);
  54.  
  55.     //pinMode(FANRPM_1, INPUT);
  56.     //pinMode(FANRPM_2, INPUT);
  57.     FANRPM1.begin();
  58.     FANRPM2.begin();
  59. }
  60.  
  61. void loop() {
  62.     delay(DELAY_TIMEOUT);
  63.     Serial.print(F("ch1: "));
  64.     int temp1 = ReadSensor(&TemperatureSensor1);
  65.     SetFanSpeedWithTemp(FAN_1, temp1, FANRPM1);
  66.     Serial.print(F("ch2: "));
  67.     int temp2 = ReadSensor(&TemperatureSensor2);
  68.     SetFanSpeedWithTemp(FAN_2, temp2, FANRPM2);
  69. }
  70.  
  71. int16_t ReadSensor(OneWire *Sensor) {
  72.     byte data[12];
  73.     int16_t raw = 0;
  74.     int16_t celsius = 0;
  75.  
  76.     Sensor->reset();       // reset one wire buss
  77.     Sensor->skip();        // select only device
  78.     Sensor->write(0x44);   // start conversion
  79.     // delay(1000);        // wait for the conversion
  80.     Sensor->reset();
  81.     Sensor->skip();
  82.     Sensor->write(0xBE);   // Read Scratchpad
  83.     for (byte i = 0; i < 9; i++) {       // 9 bytes
  84.         data[i] = Sensor->read();
  85.     }
  86.     // Convert the data to actual temperature
  87.     raw = (data[1] << 8) | data[0];
  88.     celsius = raw / 16;
  89.     return celsius;
  90. }
  91.  
  92. void SetFanSpeedWithTemp(int fanPin, int temp, int FANRPM) {
  93.     int fanSpeed = PWM_MIN;
  94.     // if(temp < TEMP_MIN) {   // if temp is lower than minimum temp
  95.         // fanSpeed = 0;      // fan is not spinning
  96.         // digitalWrite(fanPin, LOW);      
  97.     // }
  98.     if(temp < TEMP_MIN) {
  99.         analogWrite(fanPin, PWM_MIN);      
  100.     }
  101.     if((temp >= TEMP_MIN) && (temp <= TEMP_MAX)) {  // if temperature is higher than minimum temp
  102.         fanSpeed = map(temp, TEMP_MIN, TEMP_MAX, PWM_MIN, PWM_MAX); // the actual speed of fan
  103.         analogWrite(fanPin, fanSpeed);  // spin the fan at the fanSpeed speed
  104.     }
  105.  
  106.     if(temp > TEMP_MAX) {        // if temp is higher than tempMax
  107.         fanSpeed = PWM_MAX;
  108.     }
  109.     // if(temp > TEMP_MAX) {        // if temp is higher than tempMax
  110.         // digitalWrite(STATUS_LED, HIGH);  // turn on led
  111.     // } else {                    // else turn of led
  112.         // digitalWrite(STATUS_LED, LOW);
  113.     // }
  114.     int fanPrecent = map(fanSpeed, PWM_MIN, PWM_MAX, 0, 100);
  115.    
  116.     Serial.print(temp);      // display the temperature
  117.     Serial.print(F("C; "));
  118.    
  119.     Serial.print(fanPrecent);    // display the fan percent
  120.     Serial.print(F("%; "));
  121.    
  122.     Serial.print(fanSpeed);    // display the fan pwm
  123.     Serial.print(F("pwm; "));
  124.  
  125. //    Serial.print(FANRPM_1);    // display the fan rpm
  126. //    unsigned int rpms = fan.getSpeed(); // Send the command to get RPM
  127.     Serial.print(FANRPM.getSpeed());
  128.     Serial.print(F("RPM; "));
  129.  
  130.     Serial.print(millis()/1000);    // display the second job after start
  131.     Serial.println(F("Sec"));
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement