#include <OneWire.h>
#define ONE_WIRE_BUS A4
OneWire oneWire(ONE_WIRE_BUS); // Create OneWire object and sets bus pin
#include <DallasTemperature.h>
DallasTemperature sensors(&oneWire); // Creates sensor object
#include <TM1637.h>
#define CLK A2
#define DIO A3
TM1637 tm(CLK, DIO); // Creates display object
#define DISPBRIGHTNESS 3 // Default display brightness value
#include <Button.h>
Button increaseTempButton(2); // Attach button to int_2
Button decreaseTempButton(3); // Attach button to int_3
#define RELAYPIN A5 // Sets the relay trigger to the A5 pin
#define DEFAULTOFFTEMP 15.00 // Sets temperature at which compressor turns off
#define DELAYTIME 600000 // Sets compressor off time
#define POLLTIME 200 // Sets temp polling interval
#define DISPLAYPAUSE 400 // Sets delay time to view temp setting
#include <EEPROM.h> // For preset temperature storage
#define EEPROMLOCATION 66 // EEPROM write location for manual wear leveling (not really needed)
void setup()
{
// put your setup code here, to run once:
pinMode(RELAYPIN, OUTPUT);
digitalWrite(RELAYPIN, HIGH); // Relay is on at startup
Serial.begin(9600);
sensors.begin(); // Starts sensor instance
tm.begin(); // Starts display instance
tm.setFloatDigitCount(2); // Sets display trailing decimals
tm.setBrightness(DISPBRIGHTNESS); // Sets display brightness
increaseTempButton.begin(); // Starts increase button object
decreaseTempButton.begin(); // Starts decrease button object
}
void loop()
{
// put your main code here, to run repeatedly:
float targetTemp = EEPROM.read(EEPROMLOCATION); // Read target temp from EEPROM
if(targetTemp <= 0.00 || targetTemp > 50.00)
{
targetTemp = DEFAULTOFFTEMP; // Set default to 15 degrees if no/garbage data in EEPROM
}
if (increaseTempButton.pressed())
{
targetTemp++; // Increment if increase button is pressed
DisplayTemp(targetTemp);
EEPROM.update(EEPROMLOCATION,targetTemp); // Update EEPROM
PauseTime(DISPLAYPAUSE); // Pause to display new target temp
}
if (decreaseTempButton.pressed())
{
targetTemp--; // Decrement if decrease button is pressed
DisplayTemp(targetTemp);
EEPROM.update(EEPROMLOCATION,targetTemp); // Update EEPROM
PauseTime(DISPLAYPAUSE); // Pause to display new target temp
}
Serial.println(targetTemp); // FOR DEBUGGING ONLY
float temp;
sensors.requestTemperatures(); // Request temperatures for all devices on bus
temp = sensors.getTempCByIndex(0); // Read temp sensor
DisplayTemp(temp); // Display sensor temperature
PauseTime(POLLTIME); // Pause between tem read times
Serial.println(temp); // FOR DEBUGGING ONLY
if (temp < targetTemp)
{
digitalWrite(RELAYPIN, LOW); // Turn off compressor if coil temp is too low
Serial.println("NADELAY!!!");
PauseTime(DELAYTIME); // Pause to defrost
} else
{
digitalWrite(RELAYPIN, HIGH); // Turn on compressor again after defrost
}
}
/***
Purpose: Universal delay timer using millis to prevent use of delay() function
Parameters:
int delayTime
Return value:
void
***/
void PauseTime(unsigned long delayTime)
{
unsigned long currentTime = millis();
while (millis() <= currentTime + delayTime)
{
Serial.println(currentTime/60000); // FOR DEBUGGING ONLY
Serial.println("LOOP DELAY");
}
}
/***
Purpose: Display temperature from sensor to display
Parameters:
float temp
Return valeu:
void
***/
void DisplayTemp(float temp)
{
tm.display(temp);
}