Hi all
This is my first post and my first Arduino project. So please forgive me if I posted in the wrong place...
I have used my Nano as a development board to test my circuit and my code. Only yesterday have I decided to put it in ISP mode to flash my ATtiny85. I've since learnt that I can't put it back in "Arduino" mode and that I'll have to order a second ATmega chip but that's not my main issue...
I have developed a fan controller that uses a potentiometer (to set the minimum speed), an NTC (modeled here using two legs of a pot. I use it to gradually increase the speed), a MOSFET (to drive the fan) and a LED (as some sort of overheating indicator, it lights up when the NTC reaches a certain temperature).
Here's my schematic:
And here is my code (I'm using the Arduino language), scroll down to download it:
// variables declaration
int SensorPin = 2; // pin 7
int PWMPin = 0; // pin 5
int PotPin = 4; // pin 3
int LEDPin = 1; // pin 6
int SensorVal; // "temperature" from NTC
int PWMVal; // fan PWM output "speed"
int PotVal; // real potentiometer value, to define the cold/normal operation fan speed.
int PotValmapped; // lowest position shall correspond to the absolute minimum speed (see below) and not OFF, new potentiometer value
int MinSpeed=64; // absolute minimum speed, 0=0% and 255=100%, currently set to 25%, corresponds to lowest pot value
// Calibration variables
int NTCcold=512; // corresponds to ambient temperature, 10K for a 10k NTC @25°C
int NTChot=110; // corresponds to highest temperature before LED lights up, about 1.3K for a 10k NTC @80°C
int PotMin=0; // corresponds to lowest position on potentiometer
int PotMax=1023; // corresponds to highest position on potentiometer
// setup code, to run once
void setup() {
//set PWM frequency of PB0 (Pin 5, ATTiny85, fan output) to 31,250 Hz.
TCCR0B = TCCR0B & 0b11111000 | 0b001;
// define pin modes ATTiny85
pinMode(SensorPin, INPUT);
pinMode(PotPin, INPUT);
pinMode(PWMPin, OUTPUT);
pinMode(LEDPin, OUTPUT);
// Set fan to full speed for one second at startup (prevents stall)
analogWrite(PWMPin, 255);
delay(1500);
}
// main code, to run repeatedly
void loop() {
//read NTC sensor value
SensorVal = analogRead(SensorPin);
if( (SensorVal > NTCcold) && (SensorVal < 1000) ){ // in case ambient temperature is lower than 25°C
SensorVal = NTCcold;}
if( (SensorVal > NTCcold) && (SensorVal > 1000) ){ // NTC failure (open circuit)
SensorVal = NTChot-1;}
//read pot value
PotVal = analogRead(PotPin);
// map and assign pot/pwm values. 0 to 255 corresponds to 0 to 100%
PotValmapped = map(PotVal, PotMin, PotMax, MinSpeed, 254); // change potentiometer characteristic, lowest position corresponds to absolute minimum speed
PWMVal = map(SensorVal, NTCcold, NTChot, PotValmapped, 255); // linear fan curve from ambient to LED lighting up. PotValmapped is the minimum fan speed set by the potentiometer
// Overheating indicator
if (SensorVal<NTChot){
PWMVal=255; // full speed
digitalWrite(LEDPin, HIGH); // LED ON
}
else {
digitalWrite(LEDPin, LOW); // LED OFF
}
//write the PWM value to the pwm output pin
analogWrite(PWMPin, PWMVal);
delay(1000); // updates every second
}
The only differences with the Arduino code are
- the pin names
int SensorPin = A0;
int PWMPin = 3;
int PotPin = A1;
int LEDPin = 8; - the set frequency line (commented out for the Arduino, removing it and refreshing the ATtiny doesn't change anything, it just buzzes louder of course)
- the serial monitor (not shown here but irrelevant)
My problem is that while this works perfectly as intended on the Arduino, the potentiometer and NTC pins appear to be switched around on the ATTiny version (switching them back, which does not make sense, makes the NTC part work, but the potentiometer input is ignored).
I can see two possible issues, please let me know what you think:
1/ The ATtiny is not 100% compatible with the Arduino language.
2/ The calibration values (ie analogread 0-1023 and analogwrite 0-255) are not compatible with the ATtiny
What should I do to make this work?
Thumbs up if you read the whole post
Thanks!
fan.ino (2.66 KB)