/*
waterlevel.pde
Eric Ayars
12/4/2011
Used in conjuncion with a relay and a capacitive water level sensor to
flash the Christmas tree lights as an indicator of water level in the
tree-stand.
This mod makes the tree blink "water..." repeatedly, in Morse code,
when the water level is low.
*/
#include <CapSense.h>
#define GOOD 425
#define FAIR 410
long level; // storage for C measurement value
CapSense sensor = CapSense(11,12); // 470kOhm resistor between 11 and 12.
// Water sensor cap is between 12 and gnd.
byte flasher = 13; // pin controlling relay
int timescale = 500; // everything happens in multiples of 0.5 second
void blink(int interval) {
// turns relay off for timescale milliseconds, turns it back on,
// then waits interval.
// Note that relay is NC, so HIGH turns lights off.
digitalWrite(flasher, HIGH);
delay(timescale);
digitalWrite(flasher, LOW);
delay(interval);
}
void dit() {
digitalWrite(flasher, LOW);
delay(timescale);
digitalWrite(flasher, HIGH);
delay(timescale);
}
void dah() {
digitalWrite(flasher, LOW);
delay(3*timescale);
digitalWrite(flasher, HIGH);
delay(timescale);
}
void space() {
delay(2*timescale);
}
void MorseWater() {
// turn off lights
digitalWrite(flasher, HIGH);
space(); space(); space();
// Flash a request in Morse code
dit(); dah(); dah(); space(); // w
dit(); dah(); space(); // a
dah(); space(); // t
dit(); space(); // e
dit(); dah(); dit(); space(); // r
}
void setup() {
pinMode(flasher, OUTPUT);
digitalWrite(flasher, LOW);
sensor.set_CS_AutocaL_Millis(0xFFFFFFFF); // turn off autocalibrate
sensor.set_CS_Timeout_Millis(5000); // set timeout to 5 seconds
// Serial.begin(9600);
}
void loop() {
level = sensor.capSenseRaw(20);
// Serial.print(level);
// Serial.print('\n');
if (level > GOOD) {
// Make sure lights are on.
digitalWrite(flasher, LOW);
delay(timescale);
} else if (level > FAIR) {
// Water is low, but not horribly so.
blink(10*timescale);
} else {
// Water is very low, possibly dry.
MorseWater();
}
}