#include <Arduino.h>
#include <TM1637Display.h>
#include <MCP9808.h> 

// Module connection pins (Digital Pins)
#define CLK 2
#define DIO 3

//knob analog pin
#define KNOB 3

//initializing variables
int potAdjusted = 0;
int potInput = 0;
int currentTemp = 60;
bool knobMode = false;
float tempAnchor = 0.0;
float knobThresh = 2; // threshold for knob sensor
int knobTime = 0;
uint8_t e = 0; 
float temp = 32;
float tempF = 0.0;

TM1637Display display(CLK, DIO);
MCP9808 mySensor(0);

void setup() {
  display.setBrightness(1); // 7 segment display brightness setting (1 - 7, 0=off)
  pinMode(4, OUTPUT); // setup switch pin to output
  mySensor.begin(); // Temperature sensor initialize (100kHz default)
  display.showNumberHexEx(0xf,0,false,1,3);
  //Serial.begin(9600); // setup serial monitor for debug
}

void loop() {
  // temperature adjustment knob
  potInput = analogRead(KNOB); // read knob position (0-1023)
  potAdjusted = map(potInput, 0, 1023, 80, 120); // adjust knob from 0-1023 to Temp in F 80-150

  // temperature sensor
  e = mySensor.read(); //read current status
  temp = mySensor.tAmbient / 16; // convert to degrees C (per datasheet)
  tempF = (temp * 9.0 / 5.0) + 32.0; //convert to degrees F
  currentTemp = int(tempF); // convert to integer for display
  
  // Simple temperature control (if less than... make more hot)
  if (potAdjusted > currentTemp) {
      digitalWrite(4, HIGH);
  }
  else{
      digitalWrite(4,LOW);
  }

  if(knobMode == true){
    display.setBrightness(2);
    display.showNumberDec(potAdjusted, true, 3, 0);   // new Temp
    if(potAdjusted < (tempAnchor + knobThresh) && potAdjusted > (tempAnchor - knobThresh)){
      if(knobTime > 10){
        knobMode = false;
      }
      else{
        knobTime = knobTime + 1;
      }
    }
    else{
      knobTime = 0;
      tempAnchor = potAdjusted;
    }
  }
  else{
    display.setBrightness(1);
    display.showNumberDec(currentTemp, true, 3, 0);   // current Temp
    knobMode = false;
    if(potAdjusted > (tempAnchor + knobThresh) || potAdjusted < (tempAnchor - knobThresh)){
      tempAnchor = potAdjusted;
      knobMode = true;
    }
  }
  // debug info
  //Serial.print(tempAnchor);
  //Serial.print(potAdjusted);
  //Serial.println();

  delay(100); // timing delay

  //display.clear();
  //delay(500);
}
