The Final Curtain - the Shower Timer
by udubinsky in Circuits > Arduino
4906 Views, 42 Favorites, 0 Comments
The Final Curtain - the Shower Timer

Parts List











Arduino pro mini
Potentiometer
Momentary Push Button
220 ohm Resistor
On/Off switch
Battery Case an batteries
Copper tape
some wires
Dual (8 digits) max7291 7-segment display
Piezo buzzer
Diagram

Most of it you can understand from the diagram,
I'm using two stripes of copper tape one for ground the other 5v.
Each component is soldered to them as needed.
just remember to send it a bit with a flat screw to pill it's lamination.
Push Button


The push button is connented to 5v at the first pin and to both the arduino digital 4 pin and through a 220ohm resistor to ground (pull down) at the second pin.
Potentiometer

pin 1 is connected to 5v
pin 2 is connected to arduino analog pin 0
pin 3 is connected to ground
Piezzo Buzzer

Long pin (positive) is connected to arduino PWM 3 (digital 3)
Short pin is connected to ground
Dual (8 Digits) Max7291 7-segment Display

DIN connected to arduino pin 5
CS connected to arduino pin 6
CLK connected to arduino pin 7
VCC connected to 5v
GND is connected to ground
ON / OFF Switch


pin 1 connected to battery case's Red wire
pin 2 connected to arduino RAW
pin 3 is not connected.
The second black / blue wire of the battery case is connected to arduino GND
THE CODE

#define MAX7219_DIN 5
#define MAX7219_CS 6 #define MAX7219_CLK 7
#define Bot 4 #define BZzz 3 #define Pot 0
boolean runMode = false; long runTime = 0;
void initialise() { digitalWrite(MAX7219_CS, HIGH); pinMode(MAX7219_DIN, OUTPUT); pinMode(MAX7219_CS, OUTPUT); pinMode(MAX7219_CLK, OUTPUT); }
void output(byte address, byte data) { digitalWrite(MAX7219_CS, LOW); shiftOut(MAX7219_DIN, MAX7219_CLK, MSBFIRST, address); shiftOut(MAX7219_DIN, MAX7219_CLK, MSBFIRST, data); digitalWrite(MAX7219_CS, HIGH); }
void setup() { Serial.begin (9600); pinMode (Bot, INPUT); pinMode (BZzz, OUTPUT); // put your setup code here, to run once: initialise(); output(0x0f, 0x00); //display test register - test mode off output(0x0c, 0x01); //shutdown register - normal operation output(0x0b, 0x07); //scan limit register - display digits 0 thru 7 output(0x0a, 0x0f); //intensity register - max brightness output(0x09, 0xff); //decode mode register - CodeB decode all digits output(0x08, 15); //digit 7 (leftmost digit) data output(0x07, 15); output(0x06, 15); output(0x05, 15); output(0x04, 15); output(0x03, 15); output(0x02, 15); output(0x01, 15); //digit 0 (rightmost digit) data
}
void loop() { if (!runMode){ runTime = analogRead (Pot); runTime = map (runTime, 5, 1020, 1, 12) * 5; Serial.println (runTime); output(0x05, runTime % 10); output(0x06, runTime / 10); if (digitalRead (Bot)) { delay (20); runTime = runTime * 60000 + millis(); tone (BZzz, 1000); delay (300); noTone (BZzz); runMode = true; } if (runMode) { int Bip = true; while (millis() <= runTime) { int minuts, seconds; minuts = (runTime - millis ()) / 60000 ; Serial.print (minuts); output(0x05, minuts % 10); output(0x06, minuts / 10); Serial.print (" : "); seconds = ((runTime - millis ()) % 60000) / 1000; Serial.println (seconds); output(0x01, seconds % 10); output(0x02, seconds / 10); if (digitalRead (Bot)) { Bip = false; delay (100); break; } //delay (1000); } if (Bip) { for (int i = 1; i <= 10; i++) { tone (BZzz, 1000); output(0x08, 15); //digit 7 (leftmost digit) data output(0x07, 15); output(0x06, 15); output(0x05, 15); output(0x04, 15); output(0x03, 15); output(0x02, 15); output(0x01, 15); delay (200); Serial.println ("Bip Bip Bip..."); noTone (BZzz); output(0x08, 10); //digit 7 (leftmost digit) data output(0x07, 10); output(0x06, 10); output(0x05, 10); output(0x04, 10); output(0x03, 10); output(0x02, 10); output(0x01, 10); delay (200); tone (BZzz, 1000); output(0x08, 15); //digit 7 (leftmost digit) data output(0x07, 15); output(0x06, 15); output(0x05, 15); output(0x04, 15); output(0x03, 15); output(0x02, 15); output(0x01, 15); delay (200); Serial.println ("Bip Bip Bip..."); noTone (BZzz); output(0x08, 10); //digit 7 (leftmost digit) data output(0x07, 10); output(0x06, 10); output(0x05, 10); output(0x04, 10); output(0x03, 10); output(0x02, 10); output(0x01, 10); delay (400); } } output(0x08, 15); //digit 7 (leftmost digit) data output(0x07, 15); output(0x06, 15); output(0x05, 15); output(0x04, 15); output(0x03, 15); output(0x02, 15); output(0x01, 15); runMode = false; } }
}
Firmware Version Update
The update adds a stopwatch functionality.
Also, when the timer finish counting and beeping, its starts counting the time passed since the end of the timer and stops only on button press.
#define MAX7219_DIN 5
#define MAX7219_CS 6 #define MAX7219_CLK 7
#define Bot 4 #define BZzz 3 #define Pot 0
#define stopWatch 65
boolean runMode = false, stopWatchMode; long runTime = 0;
void initialise() { digitalWrite(MAX7219_CS, HIGH); pinMode(MAX7219_DIN, OUTPUT); pinMode(MAX7219_CS, OUTPUT); pinMode(MAX7219_CLK, OUTPUT); }
void output(byte address, byte data) { digitalWrite(MAX7219_CS, LOW); shiftOut(MAX7219_DIN, MAX7219_CLK, MSBFIRST, address); shiftOut(MAX7219_DIN, MAX7219_CLK, MSBFIRST, data); digitalWrite(MAX7219_CS, HIGH); }
void setup() { Serial.begin (9600); pinMode (Bot, INPUT); pinMode (BZzz, OUTPUT); // put your setup code here, to run once: initialise(); output(0x0f, 0x00); //display test register - test mode off output(0x0c, 0x01); //shutdown register - normal operation output(0x0b, 0x07); //scan limit register - display digits 0 thru 7 output(0x0a, 0x0f); //intensity register - max brightness output(0x09, 0xff); //decode mode register - CodeB decode all digits output(0x08, 15); //digit 7 (leftmost digit) data output(0x07, 15); output(0x06, 15); output(0x05, 15); output(0x04, 15); output(0x03, 15); output(0x02, 15); output(0x01, 15); //digit 0 (rightmost digit) data
}
void loop() { if (!runMode){ runTime = analogRead (Pot); runTime = map (runTime, 5, 1020, 1, 14) * 5; if (runTime == 70) { runTime = 65; } Serial.println (runTime); if (runTime <= 60) { output(0x05, runTime % 10); output(0x06, runTime / 10); output(0x01, 15); output(0x02, 15); stopWatchMode = false; } if (runTime == stopWatch) { stopWatchMode = true; output(0x01, 0); output(0x02, 0); output(0x05, 0); output(0x06, 0); } if (digitalRead (Bot)) { delay (40); if (!stopWatchMode) { runTime = runTime * 60000 + millis(); tone (BZzz, 300); delay (300); } else { runTime = millis (); tone (BZzz, 200); delay (400); } noTone (BZzz); runMode = true; } if (runMode) { if (!stopWatchMode) { int Bip = true; while (millis() <= runTime) { int minuts, seconds; minuts = (runTime - millis ()) / 60000 ; Serial.print (minuts); output(0x05, minuts % 10); output(0x06, minuts / 10); Serial.print (" : "); seconds = ((runTime - millis ()) % 60000) / 1000; Serial.println (seconds); output(0x01, seconds % 10); output(0x02, seconds / 10); if (digitalRead (Bot)) { while (digitalRead (Bot)) { Bip = false; runMode = false; stopWatchMode = false; //Serial.println ("all False"); output(0x08, 10); //digit 7 (leftmost digit) data output(0x07, 10); output(0x06, 10); output(0x05, 10); output(0x04, 10); output(0x03, 10); output(0x02, 10); output(0x01, 10); } break; } //end if digitalRead Bot } if (Bip) { runTime = millis (); for (int i = 1; i <= 10; i++) { tone (BZzz, 300); output(0x08, 15); //digit 7 (leftmost digit) data output(0x07, 15); output(0x06, 15); output(0x05, 15); output(0x04, 15); output(0x03, 15); output(0x02, 15); output(0x01, 15); delay (200); Serial.println ("Bip Bip Bip..."); noTone (BZzz); output(0x08, 10); //digit 7 (leftmost digit) data output(0x07, 10); output(0x06, 10); output(0x05, 10); output(0x04, 10); output(0x03, 10); output(0x02, 10); output(0x01, 10); delay (200); tone (BZzz, 300); output(0x08, 15); //digit 7 (leftmost digit) data output(0x07, 15); output(0x06, 15); output(0x05, 15); output(0x04, 15); output(0x03, 15); output(0x02, 15); output(0x01, 15); delay (200); Serial.println ("Bip Bip Bip..."); noTone (BZzz); output(0x08, 10); //digit 7 (leftmost digit) data output(0x07, 10); output(0x06, 10); output(0x05, 10); output(0x04, 10); output(0x03, 10); output(0x02, 10); output(0x01, 10); delay (400); stopWatchMode = true; } } // end void Bip output(0x08, 15); //digit 7 (leftmost digit) data output(0x07, 15); output(0x06, 15); output(0x05, 15); output(0x04, 15); output(0x03, 15); output(0x02, 15); output(0x01, 15); //runMode = false; } // end of runMode !stopWatchMode (timer Mode) if (stopWatchMode) { // StopWatch Run Mode begin int minuts, seconds; while (!digitalRead (Bot)) { minuts = (millis () - runTime) / 60000 ; Serial.print (minuts); output(0x05, minuts % 10); output(0x06, minuts / 10); Serial.print (" : "); seconds = ((millis () - runTime) % 60000) / 1000; Serial.println (seconds); output(0x01, seconds % 10); output(0x02, seconds / 10); } runMode = false; stopWatchMode = false; delay (500); } } }
}