#define DEBUG           // show messages like "fan on, mid", "fan off"
 #define TEMP_DEBUG      // in addition to DEBUG show temp raw value every second


// minor feature. Week influence as I think. Can be 0 or 1
// 1 is better I feel
#define TEMP_CONTROL_TYPE     1

// inputs/outputs
#define INPUT_EN        6        // enable input
#define INPUT_TEMP      A3       // temp sensing input. Should be some A pin
#define OUTPUT_PWM      10       // pwm output, DONT CHANGE THIS PIN, connected to specified

#define PWM_DUTY_MIN       65        // minimal pwm %
#define PWM_DUTY_MAX       85        // maximal pwm %( dont set 100, 95 is great for max)
#define STARTUP_DELAY      2         // period for pumping up motor with constant ON output without pwm for better starting, seconds. 

#define TEMP_THRESHOLD     620
#define PWM_FREQ           770       // pwm frequency. It is just some value to get desired frequency. 720 is about 22kHz
#define PWM_STEP           7        // when temp is high and rising system increase pwm duty step by step by this value. Higher value - faster it ramp and slow down. 7 is ~1% duty per second.

enum {OFF = 0, RUNNING = 1, STARTUP = 2};

volatile bool _wdtFlag = 0;

byte enButtonTmp = 0;
byte mode = OFF;
byte tempTmp = 0;
byte tempTmp2 = 0;

uint16_t curTemp, prevTemp = 0, tmpTemp;
uint16_t dutyTmp;

byte startUpFlag = 0;

uint16_t dutyMin = PWM_FREQ / (100 / (float)PWM_DUTY_MIN);
uint16_t dutyMax = PWM_FREQ / (100 / (float)PWM_DUTY_MAX);
uint32_t time = 0;

void setup(){
  delay(500);

#ifdef DEBUG
  Serial.begin(9600);
#endif

  digitalWrite(OUTPUT_PWM, LOW);
  pinMode(OUTPUT_PWM, OUTPUT);


  // 1s timer using WDT
  //  WDTCSR = (1<<WDCE) | (1<<WDE);
  //  WDTCSR = (1<<WDCE) | (1<<WDIE) | (1<<WDP2) | (1<<WDP1);     // 1s

#ifdef DEBUG
  Serial.println("begin...");
  Serial.print("Temp control type: ");
  Serial.println(TEMP_CONTROL_TYPE, DEC);
  Serial.println();
  Serial.println();
#endif


  stopPwm();

  OCR1A = PWM_FREQ;
  OCR1B = dutyMin;
  TCNT1 = 0;
  TCCR1A = (1 << WGM11) | (1 << WGM10) | (1 << COM1B1);
  TCCR1B = (1 << WGM13) | (1 << WGM12);

  //OCR1A = PWM_FREQ;
  //OCR1B = dutyMin;

  delay(100);
}



void loop()
{
  enableHandler();

  if (millis() - time >= 1000) // 1 sec
  {
    time = millis();

    startUpHandler();

    tempHandler();
  }
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
ntc1:GND
ntc1:VCC
ntc1:OUT
led1:A
led1:C