Since it was asked for, full code (minus loop()):
/* Sketch for Arduino to run the automatic cat feeder.
*
*
*/
//includes
#include <Servo.h> //for running the servo
#include <Wire.h> //required for RTClib
#include "RTClib.h" //to run the real time clock functionality. https://github.com/adafruit/RTClib
//status indicator values
const int onboardLedPin = 13;
//buzzer values
const boolean buzz = true; //turns on and off the buzzer functionality
const int buzzerPin = 8;
const int buzzLength = 250;
const int buzzDefaultFreq = 1000;
const int buzzFeedStartFreq = 2000;
const int buzzFeedEndFreq = 500;
const int buzzBattWarnFreq = 2000;
const int buzzConfirmFreq = 100;
//Servo setup
Servo dispenserServo;
const int servoPin = 11;
const int feedServoSpinTime = 2000;
const int STOP = 90;
const int SPIN_CLOCKWISE = 180;
const int SPIN_COUNTER_CLOCKWISE = 0;
//clock
boolean timingEnabled = true;
RTC_DS3231 rtc;
String feedTimes[] = {"7:00"};
//button
const int buttonPin = 7;
int buttonVal = 0;
//other
const int mainWait = 5000;
/*
* Does a buzz if it is set to.
*/
void doBuzz(int frequency, boolean wait){
if(buzz){
tone(buzzerPin, frequency, buzzLength);
if(wait){
delay(buzzLength);
}
}
}
/*
* Default function to not wait for buzz to finish.
*/
void doBuzz(){
doBuzz(buzzDefaultFreq, false);
}
void checkButton(){
buttonVal = digitalRead(buttonPin);
}
/*
* Determines if it is time to do the feeding.
*/
boolean isFoodTime(){
if(!timingEnabled){
return false;
}
DateTime curTime = rtc.now();
String hr = String(curTime.hour());
String mn = String(curTime.minute());
String time = hr + ":" + mn;
for(int i = 0; i < sizeof(feedTimes); i++){
if(feedTimes[i] == time){
return true;
}
}
return false;
}
String formatDateTime(DateTime dtIn){
return String(dtIn.month()) + "/" + String(dtIn.day()) + "/" + String(dtIn.year()) + " " + String(dtIn.hour()) + ":" + String(dtIn.minute()) + ":" + String(dtIn.second());
}
String formatDateTime(){
formatDateTime(rtc.now());
}
int getNumFromButton(int startAt){
doBuzz(buzzFeedEndFreq, true);
int longPressLength = 500;
int output = startAt;
bool counting = true;
do{
checkButton();
if(buttonVal == HIGH){
delay(longPressLength);
checkButton();
if(buttonVal == HIGH){
counting = false;
}else{
output++;
doBuzz(buzzConfirmFreq, true);
delay(longPressLength);
}
}
}while(counting);
doBuzz(buzzConfirmFreq, true);
delay(buzzLength);
doBuzz(buzzConfirmFreq, true);
return output;
}
void setTime(){
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
//Serial.print("Setting the clock... ("+formatDateTime()+")\n");
delay(buzzLength);
delay(buzzLength);
doBuzz(buzzConfirmFreq, true);
delay(buzzLength);
doBuzz(buzzConfirmFreq, true);
delay(buzzLength);
doBuzz(buzzConfirmFreq, true);
Serial.print("Getting Year... (");
int year = getNumFromButton(2000);
Serial.print(String(year) + ")\nGetting Month... (");
int month = getNumFromButton(1);
Serial.print(String(month) + ")\nGetting Day... (");
int day = getNumFromButton(1);
Serial.print(String(day) + ")\nGetting Hour... (");
int hour = getNumFromButton(0);
Serial.print(String(hour) + ")\nGetting Minute... (");
int minute = getNumFromButton(0);
Serial.print(String(minute) + ")\nGetting Second... (");
int second = getNumFromButton(0);
Serial.print(String(second) + ")\n");
delay(buzzLength);
doBuzz(buzzConfirmFreq, true);
Serial.print("Finished getting numbers.\n");
rtc.adjust(DateTime(year, month, day, hour, minute, second));
Serial.print("Clock set to: " + formatDateTime() + "\n");
}
/*
* Setup of things:
* - status led
* - buzzer
* - servo
*/
void setup(){
Serial.begin(9600);
Serial.print("\nBeginning setup of the CatFeeder.\n");
// status led
pinMode(onboardLedPin, OUTPUT);
// buzzer
pinMode(buzzerPin, OUTPUT);
doBuzz();
//servo
dispenserServo.attach(servoPin);
pinMode(servoPin, OUTPUT);
dispenserServo.write(STOP);
if(timingEnabled){
//clock
boolean rtcOn = rtc.begin();
Serial.print(String(rtcOn) + "\n");
if(! rtcOn){
Serial.print("Couldn't find RTC. Timing Disabled\n");
timingEnabled = false;
doBuzz(buzzConfirmFreq, true);
delay(buzzLength);
doBuzz(buzzConfirmFreq, true);
delay(buzzLength);
doBuzz(buzzConfirmFreq, true);
delay(buzzLength);
doBuzz(buzzConfirmFreq, true);
}else{
if(rtc.lostPower()){
Serial.println("Clock lost power.\n");
setTime();
}
}
}
if(!timingEnabled){
Serial.print("Timing disabled. Will only actuate on button press.\n");
}else{
Serial.print("Current time: " + formatDateTime());
}
//button
pinMode(buttonPin, INPUT);
Serial.print("Finished setup.\n\n");
}
Full code size:
Binary sketch size: 12,416 bytes (of a 32,256 byte maximum)