diff --git a/dog-feeder.ino b/dog-feeder.ino new file mode 100644 index 0000000..796a304 --- /dev/null +++ b/dog-feeder.ino @@ -0,0 +1,128 @@ +#include +#include "LowPower.h" + +// Dusplay definitions +byte sevenSegDigits[9] = { B00001001 , // = 1 + B10110011 , // = 2 + B10011011 , // = 3 + B11001001 , // = 4 + B11011010 , // = 5 + B11111000 , // = 6 + B00001011 , // = 7 + B11111011 , // = 8 + B11001011 // = 9 + }; +byte sevenSegDP = B00000100; // = DP + + +// Pin definition +// -buttons +const int buttonTimeCyclePin = 3; +const int buttonConfirmPin = 2; +// -display +const int latchPin = 11; +const int clockPin = 9; +const int dataPin = 12; +// -servo +Servo doorServo; +const int servoPin = 5; + +const int MIN_TIME = 1800; +const int MIN_TIME_TEST = 8; // for testing + +void setup() { + Serial.begin(9600); + + // set all pin to the correct mode + // -buttons + pinMode(buttonTimeCyclePin, INPUT_PULLUP); //define pinMode and use Pull-up resistor + pinMode(buttonConfirmPin, INPUT_PULLUP); + // -display + pinMode(latchPin, OUTPUT); + pinMode(clockPin, OUTPUT); + pinMode(dataPin, OUTPUT); + // -servo + doorServo.attach(servoPin); + doorServo.write(82); + delay(2000); +} + +void displayNumber(int cycleMultiply) { + bool bDP = ((cycleMultiply % 2) == 0); + int digitIndex = (cycleMultiply - 1) / 2; + + Serial.println(digitIndex); + + digitalWrite(latchPin, LOW); + + shiftOut(dataPin, clockPin, MSBFIRST, sevenSegDigits[digitIndex]+(sevenSegDP*bDP)); + + digitalWrite(latchPin, HIGH); +} + +void displayBlank(){ + digitalWrite(latchPin, LOW); + shiftOut(dataPin, clockPin, MSBFIRST, B00000000); + digitalWrite(latchPin, HIGH); +} + +void displayBlink(int cycleMultiply) { + for (int i = 1; i <= 4; i++) { + displayNumber(cycleMultiply); + delay(300); + displayBlank(); + delay(100); + } +} + +int getSleepDuration() { + int cycleMultiply = 1; + displayNumber(cycleMultiply); + + while(true) { + if (digitalRead(buttonTimeCyclePin) == LOW) { + cycleMultiply = cycleMultiply % 18; + cycleMultiply++; + Serial.print("Increased timer by 1: "); + Serial.println(cycleMultiply); + displayNumber(cycleMultiply); + } + if (digitalRead(buttonConfirmPin) == LOW) { + Serial.print("Confirmed timer: "); + Serial.println(cycleMultiply); + displayBlink(cycleMultiply); + return MIN_TIME * cycleMultiply; + } + delay(200); + } +} + +void deepSleep(int sleepDuration) { + int sleepCycles = sleepDuration / 8; + for (int i = 1; i <= sleepCycles; i++) { + LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); + Serial.print("Finished cycle: "); + Serial.println(i); + Serial.flush(); + } + + Serial.println("Done sleeping"); +} + +void openDoor() { + doorServo.write(10); + delay(1000); +} + +void loop() { + + int sleepDuration = getSleepDuration(); + + Serial.print("Got sleep duration: "); + Serial.println(sleepDuration); + Serial.println("Entering sleep mode."); + Serial.flush(); + + deepSleep(sleepDuration); + openDoor(); +}