// simple thermostat
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#define ONE_WIRE_BUS_1 3
#define TEMPERATURE_PRECISION 11 // 0.125deg resolution
OneWire oneWire_range (ONE_WIRE_BUS_1);
DallasTemperature dallasRange (&oneWire_range);
LiquidCrystal_I2C lcd (0X27, 20, 4);
const byte PinButs [] = { 6, 7, 8, 9, 10 };
const int Nbut = sizeof(PinButs);
byte butState [Nbut];
enum { Bsel, Bup, Bdown, Bright, Benter };
// -------------------------------------
struct Room {
DallasTemperature *sensor;
int setPt;
const char *desc;
float tempC;
bool on;
}
rooms [] {
{ &dallasRange, 20, "range" }
} ;
Room *pR = & rooms [0];
// -------------------------------------
char s [90];
char t [20];
char u [20];
// -----------------------------------------------------------------------------
int
chkButtons ()
{
for (unsigned n = 0; n < Nbut; n++) {
byte but = digitalRead (PinButs [n]);
if (butState [n] != but) { // state change
butState [n] = but;
delay (30); // debounce
if (LOW == but) // pressed
return n;
}
}
return -1;
}
// -----------------------------------------------------------------------------
void menu ()
{
switch (chkButtons ()) {
case Bsel:
break;
case Bup:
pR->setPt++;
break;
case Bdown:
pR->setPt--;
break;
case Bright:
break;
case Benter:
break;
}
}
// -----------------------------------------------------------------------------
void display ()
{
lcd.clear ();
dtostrf (pR->tempC, 5, 1, t);
sprintf (s, "%s %3dC %s", t, pR->setPt, pR->desc);
lcd.print (s);
}
// -----------------------------------------------------------------------------
void heating ()
{
pR->sensor->requestTemperatures ();
pR->tempC = pR->sensor->getTempCByIndex (0);
if (pR->on)
pR->on = pR->tempC > pR->setPt;
}
// -----------------------------------------------------------------------------
unsigned long msec0;
void loop ()
{
unsigned long msec = millis ();
if (msec - msec0 >= 1000) {
msec0 = msec;
display ();
}
menu ();
}
// -----------------------------------------------------------------------------
void setup ()
{
lcd.init ();
lcd.print ("Hello World");
dallasRange.begin();
dallasRange.setResolution(TEMPERATURE_PRECISION);
for (int n = 0; n < Nbut; n++) {
pinMode (PinButs [n], INPUT_PULLUP);
butState [n] = digitalRead (PinButs [n]);
}
delay (500);
}
RESET
UP
AIRGUN
CLUB
RANGE
AIRGUN
RANGE
CLUB
SELECT
ENTER
RIGHT
DOWN
BOILER
DS3821
FITTED
HEARTBEAT
Uses the internal pullup resistors for the button inputs