#include <Arduino.h>
#include <LiquidCrystal.h>
//Function declarations
void settingsMenu(); //setup, display settings, etc
void setTemps(); //Setup for lower and upper limits
void getTemps(); //gets the probe temp
void displayTemps();
//Thermistor Setup
#define THERMISTORPIN A0 //Thermistor Pin
#define THERMISTORNOMINAL 10000 //Thermistor resistance at 25 degrees C
#define TEMPERATURENOMINAL 25 //Thermistor nomial temperature
#define NUMSAMPLES 5 //Number of data samples
int samples[NUMSAMPLES]; //Array to store samples
#define BCOEFFICIENT 3850 //Betta coefficient
#define SERIESRESISTOR 10000 //R1 Value
// LCD Display setup
const int rs = 0, rw = 1, en = 2, d0 = 3, d1 = 4, d2 = 5, d3 = 6, d4 = 7, d5 = 8, d6 = 9, d7 = 10;
LiquidCrystal lcd(rs, rw, en, d0, d1, d2, d3, d4, d5, d6, d7);
#define contrastPin 11
#define brightnessPin 12
//General inputs
#define upButton 13
#define downButton 14
#define okButton 15
#define menuButton 20
//General outputs
#define relayPin 21
//Other defenitions
float maxTemp;
float minTemp;
float UL;
float LL;
float thermValue;
int displaySetting;
int menuNumber;
void setup()
{
lcd.begin(16,2); //Initialize LCD
//PinMode declarations
pinMode(upButton, INPUT_PULLUP);
pinMode(downButton, INPUT_PULLUP);
pinMode(okButton, INPUT_PULLUP);
pinMode(menuButton, INPUT_PULLUP);
pinMode(relayPin, OUTPUT);
//Display company and product name
lcd.setCursor(4,0);
lcd.print("MBH Labs");
lcd.setCursor(0,1);
lcd.print("Temp Controller");
delay(3000);
lcd.clear();
//Get and display initial data
getTemps();
maxTemp = thermValue;
minTemp = thermValue;
displaySetting = 1;
displayTemps();
}
void loop()
{
//Get and display temp value
getTemps();
displayTemps();
//If low, Enter main menu
if (digitalRead(menuButton) == LOW)
{
settingsMenu();
}
//If either button is activated, change display setting
if (digitalRead(upButton) == LOW || digitalRead(downButton) == LOW)
{
switch (displaySetting)
{
case 1:
{
displaySetting = 2;
displayTemps();
delay(300);
}
break;
case 2:
{
displaySetting = 1;
displayTemps();
delay(300);
}
break;
}
}
}
// put function definitions here:
void settingsMenu()
{
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Settings");
delay(300);
menuNumber = 0;
for(;;)
{
if (digitalRead(upButton) == LOW && menuNumber < 3)
{
menuNumber += 1;
}
if (digitalRead(downButton) == LOW && menuNumber >0)
{
menuNumber -= 1;
}
switch (menuNumber)
{
case 0:
{
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Settings");
lcd.setCursor(0,1);
lcd.print("1: Set UL/LL");
delay(100);
}
break;
case 1:
{
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Settings");
lcd.setCursor(0,1);
lcd.print("2: Contrast");
delay(100);
}
break;
case 2:
{
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Settings");
lcd.setCursor(0,1);
lcd.print("3: Brightness");
delay(100);
}
break;
}
if (digitalRead(okButton) == LOW)
{
switch (menuNumber)
{
case 1:
{
setTemps();
}
break;
case 2:
}
}
if (digitalRead(menuButton) == LOW)
{
lcd.clear();
delay(300);
break;
}
}
}
void setTemps()
{
}
void getTemps()
{
uint8_t i;
float average;
// take N samples in a row, with a slight delay
for (i=0; i< NUMSAMPLES; i++)
{
samples[i] = analogRead(THERMISTORPIN);
delay(10);
}
// average all the samples out
average = 0;
for (i=0; i< NUMSAMPLES; i++)
{
average += samples[i];
}
average /= NUMSAMPLES;
// convert the value to resistance
average = 1023 / average - 1;
average = SERIESRESISTOR / average;
float steinhart;
steinhart = average / THERMISTORNOMINAL; // (R/Ro)
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro)
steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invert
steinhart -= 273.15; // convert absolute temp to C
thermValue = steinhart;
if (thermValue > maxTemp)
{
maxTemp = thermValue;
}
if (thermValue < minTemp)
{
minTemp = thermValue;
}
}
void displayTemps()
{
//lcd.clear();
lcd.setCursor(0,0);
lcd.print("T:");
lcd.print(thermValue,1);
if (displaySetting == 1)
{
lcd.setCursor(0,1);
lcd.print("H:");
lcd.print(maxTemp,1);
lcd.setCursor(7,1);
lcd.print("L:");
lcd.print(minTemp,1);
}
if (displaySetting == 2)
{
lcd.setCursor(0,1);
lcd.print("UL:");
lcd.print(UL,1);
lcd.setCursor(7,1);
lcd.print("LL:");
lcd.print(LL,1);
}
}