// 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);
}
Loading
ds18b20
ds18b20
Loading
ds18b20
ds18b20
Loading
ds18b20
ds18b20
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