Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Automatic Auger Audiono pet feeder Copyright Roger Donoghue 28/03/2015 all rights reserved. For personal use only.
- Not for commercial use or resale.
- Allows you to set 2 feeding times and the quantity as a multiple of the default feed quantity.
- Uses a DS1307 real time clock to keep the time, with a rechargable battery built in.
- (You can use the arduino RTC example code in the IDE to set the clock , or use the rotary encoder as intended)
- */
- // include the library code:
- #include <Time.h>
- #include <TimeLib.h>
- #include <LiquidCrystal_I2C.h>
- #include <Wire.h> // needed for the RTC libraty
- #include <Time.h>
- #include <DS1307RTC.h> // Real Time Clock Library
- #include <Servo.h>
- int feedpin = 7; //test d'activation de pin
- int feedlight = 13; //test d'activation de pin
- int feedpin2 = 8; //fake pour test n'importe quoi
- int feedpin3 = 8; //fake pour test n'importe quoi
- // initialize the library with the numbers of the interface pins dor the LCD
- LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
- Servo feedServo;
- Servo stirServo;
- int pos = 0;
- volatile boolean TurnDetected;
- volatile boolean up;
- const int PinCLK=2; // Used for generating interrupts using CLK signal
- const int PinDT=3; // Used for reading DT signal
- const int PinSW=4; // Used for the push button switch of the Rotary Encoder
- const int buttonPin = A3; // the number of the pushbutton pin for manual feed 13
- int buttonState = 0;// variable for reading the manual feed pushbutton status
- int feed1hour = 22; // variables for feeding times and quantity
- int feed1minute = 04;
- int feed2hour = 22;
- int feed2minute = 06;
- int feed3hour = 22;
- int feed3minute = 08;
- int feedQty = 4;
- int feedRate = 800; //a pwm rate the triggers forward on the servo 75
- int feedReversal = 80; //a pwm rate that triggers reverse on the servo
- // play with these numbers for your servo. Mine is a Futaba digital servo
- // that I removed the pot from and the plastic lug, to make it continuous.
- void isr () { // Interrupt service routine is executed when a HIGH to LOW transition is detected on CLK
- if (digitalRead(PinCLK)) // this keeps an eye out for the rotary encoder being turned regardless of where the program is
- up = digitalRead(PinDT); // currently exectuting - in other words, during the main loop this ISR will always be active
- else
- up = !digitalRead(PinDT);
- TurnDetected = true;
- }
- void setup () {
- //serial time read//
- Serial.begin(9600);
- while (!Serial) ; // wait for serial
- delay(200);
- Serial.println("DS1307RTC Read Test");
- Serial.println("-------------------");
- // set up the LCD's number of columns and rows:
- lcd.begin(16, 2);
- pinMode(feedpin, OUTPUT); //test d'activation de pin pour le moteur
- pinMode(feedlight, OUTPUT);
- // setup the Rotary encoder
- pinMode(PinCLK,INPUT);
- pinMode(PinDT,INPUT);
- pinMode(PinSW,INPUT);
- pinMode(buttonPin, INPUT);
- attachInterrupt (0,isr,FALLING); // interrupt 0 is always connected to pin 2 on Arduino UNO
- lcd.setCursor(17,0);
- lcd.print("JF Larouche"); // A bit of fun :-)
- /*
- lcd.setCursor(17,1);
- lcd.print(" deer feeder");
- for (int positionCounter = 0; positionCounter < 17; positionCounter++) {
- // scroll one position left:
- lcd.scrollDisplayLeft();
- // wait a bit:
- delay(150);
- }
- delay(3000);
- for (int positionCounter = 0; positionCounter < 17; positionCounter++) {
- // scroll one position left:
- lcd.scrollDisplayRight();
- // wait a bit:
- */
- delay(500);
- // } // end of fun
- lcd.setCursor(17,0);
- lcd.print(" ");
- lcd.setCursor(17,1);
- lcd.print(" ");
- }
- void loop () { //Main program loop - most things in here!
- //timeread
- tmElements_t tm;
- if (RTC.read(tm)) {
- Serial.print("Ok, Time = ");
- print2digits(tm.Hour);
- Serial.write(':');
- print2digits(tm.Minute);
- Serial.write(':');
- print2digits(tm.Second);
- Serial.print(", Date (D/M/Y) = ");
- Serial.print(tm.Day);
- Serial.write('/');
- Serial.print(tm.Month);
- Serial.write('/');
- Serial.print(tmYearToCalendar(tm.Year));
- Serial.println();
- } else {
- if (RTC.chipPresent()) {
- Serial.println("The DS1307 is stopped. Please run the SetTime");
- Serial.println("example to initialize the time and begin running.");
- Serial.println();
- } else {
- Serial.println("DS1307 read error! Please check the circuitry.");
- Serial.println();
- }
- delay(9000);
- }
- delay(1000);
- }
- void print2digits(int number) {
- if (number >= 0 && number < 10) {
- Serial.write('0');
- }
- Serial.print(number);
- static long virtualPosition=0; // without STATIC it does not count correctly!!!
- tmElements_t tm; // This sectionm reads the time from the RTC, sets it in tmElements tm (nice to work with), then displays it.
- RTC.read(tm);
- lcd.setCursor(0, 0);
- printDigits(tm.Wday); //call to print digit function that adds leading zeros that may be missing
- lcd.print(":");
- printDigits(tm.Hour);
- lcd.print(":");
- printDigits(tm.Minute);
- lcd.print(":");
- printDigits(tm.Second);
- lcd.print(" ");
- lcd.print("Qty ");
- lcd.print(feedQty);
- lcd.print(" ");
- lcd.setCursor(0,1);
- lcd.print("1)");
- printDigits(feed1hour);
- lcd.print(":");
- printDigits(feed1minute);
- lcd.print(" 2)");
- printDigits(feed2hour);
- lcd.print(":");
- printDigits(feed2minute);
- lcd.print(" 3)");
- printDigits(feed3hour);
- lcd.print(":");
- printDigits(feed3minute);
- // MAIN BREAKOUT "IF" SECION BELOW THAT MONITORS THE PUSH BUTTON AND ENTERS PROGRAMMING IF IT'S PUSHED
- if (!(digitalRead(PinSW))) { // check if pushbutton is pressed
- // if YES then enter the programming subroutine
- lcd.blink(); // Turn on the blinking cursor:
- lcd.setCursor(5,0);
- lcd.print(" SET");
- virtualPosition = tm.Hour; //needed or the hour will be zero each time you change the clock.
- do {
- lcd.setCursor(0,0); // put cursor at Time Hour
- delay(500); // Delay needed or same button press will exit do-while as while is checking for another button push!
- if (TurnDetected) { // do this only if rotation was detected
- if (up)
- virtualPosition--;
- else
- virtualPosition++;
- TurnDetected = false; // do NOT repeat IF loop until new rotation detected
- }
- // Here I change the hour of time -
- if (virtualPosition >= 24) {virtualPosition = 0;}
- if (virtualPosition <= 0) {virtualPosition = 0;}
- tm.Hour = virtualPosition;
- RTC.write(tm);
- lcd.setCursor(0, 0);
- printDigits(tm.Hour); // then re-print the hour on the LCD
- } while ((digitalRead(PinSW))); // do this "do" loop while the PinSW button is NOT pressed
- lcd.noBlink();
- delay(1000);
- // SET THE MINS
- lcd.blink(); // Turn on the blinking cursor:
- virtualPosition = tm.Minute; //needed or the minute will be zero each time you change the clock.
- do {
- lcd.setCursor(3,0); // put cursor at Time Mins
- delay(500); // Delay needed or same button press will exit do-while as while is checking for another button push!
- if (TurnDetected) { // do this only if rotation was detected
- if (up)
- virtualPosition--;
- else
- virtualPosition++;
- TurnDetected = false; // do NOT repeat IF loop until new rotation detected
- }
- // Here I change the min of time -
- if (virtualPosition >= 60) {virtualPosition = 0;}
- if (virtualPosition <= 0) {virtualPosition = 0;}
- tm.Minute = virtualPosition;
- RTC.write(tm);
- lcd.setCursor(3, 0);
- printDigits(tm.Minute); // then re-print the min on the LCD
- } while ((digitalRead(PinSW)));
- lcd.noBlink();
- delay(1000);
- // SET THE QTY - Feed quantity
- lcd.blink(); // Turn on the blinking cursor:
- virtualPosition = feedQty; //needed or the qty will be zero.
- do {
- lcd.setCursor(14,0); // put cursor at QTY
- delay(500); // Delay needed or same button press will exit do-while as while is checking for another button push!
- if (TurnDetected) { // do this only if rotation was detected
- if (up)
- virtualPosition--;
- else
- virtualPosition++;
- TurnDetected = false; // do NOT repeat IF loop until new rotation detected
- }
- // Here I change the feed qty
- feedQty = virtualPosition;
- lcd.setCursor(14, 0);
- lcd.print(feedQty);
- } while ((digitalRead(PinSW)));
- lcd.noBlink();
- delay(1000);
- // SET THE Feed1 Hour
- lcd.blink(); // Turn on the blinking cursor:
- virtualPosition = feed1hour; //needed or will be zero to start with.
- do {
- lcd.setCursor(2,1); // put cursor at feed1hour
- delay(500); // Delay needed or same button press will exit do-while as while is checking for another button push!
- if (TurnDetected) { // do this only if rotation was detected
- if (up)
- virtualPosition--;
- else
- virtualPosition++;
- TurnDetected = false; // do NOT repeat IF loop until new rotation detected
- }
- // Here I change the feed1 hour
- if (virtualPosition >= 24) {virtualPosition = 0;}
- if (virtualPosition <= 0) {virtualPosition = 0;}
- feed1hour = virtualPosition;
- lcd.setCursor(2,1);
- printDigits(feed1hour);
- } while ((digitalRead(PinSW)));
- lcd.noBlink();
- delay(1000);
- // SET THE Feed1 Mins
- lcd.blink(); // Turn on the blinking cursor:
- virtualPosition = feed1minute; //needed or will be zero to start with.
- do {
- lcd.setCursor(5,1); // put cursor at feed1minute
- delay(500); // Delay needed or same button press will exit do-while as while is checking for another button push!
- if (TurnDetected) { // do this only if rotation was detected
- if (up)
- virtualPosition--;
- else
- virtualPosition++;
- TurnDetected = false; // do NOT repeat IF loop until new rotation detected
- }
- // Here I change the feed1 minute
- if (virtualPosition >= 60) {virtualPosition = 0;}
- if (virtualPosition <= 0) {virtualPosition = 0;}
- feed1minute = virtualPosition;
- lcd.setCursor(5,1);
- printDigits(feed1minute);
- } while ((digitalRead(PinSW)));
- lcd.noBlink();
- delay(1000);
- // SET THE Feed2 Hour
- lcd.blink(); // Turn on the blinking cursor:
- virtualPosition = feed2hour; //needed or will be zero to start with.
- do {
- lcd.setCursor(10,1); // put cursor at feed1hour
- delay(500); // Delay needed or same button press will exit do-while as while is checking for another button push!
- if (TurnDetected) { // do this only if rotation was detected
- if (up)
- virtualPosition--;
- else
- virtualPosition++;
- TurnDetected = false; // do NOT repeat IF loop until new rotation detected
- }
- // Here I change the feed1 hour
- if (virtualPosition >= 24) {virtualPosition = 0;}
- if (virtualPosition <= 0) {virtualPosition = 0;}
- feed2hour = virtualPosition;
- lcd.setCursor(10,1);
- printDigits(feed2hour);
- } while ((digitalRead(PinSW)));
- lcd.noBlink();
- delay(1000);
- // SET THE Feed2 Mins
- lcd.blink(); // Turn on the blinking cursor:
- virtualPosition = feed2minute; //needed or will be zero to start with.
- do {
- lcd.setCursor(13,1); // put cursor at feed1minute
- delay(500); // Delay needed or same button press will exit do-while as while is checking for another button push!
- if (TurnDetected) { // do this only if rotation was detected
- if (up)
- virtualPosition--;
- else
- virtualPosition++;
- TurnDetected = false; // do NOT repeat IF loop until new rotation detected
- }
- // Here I change the feed1 minute
- if (virtualPosition >= 60) {virtualPosition = 0;}
- if (virtualPosition <= 0) {virtualPosition = 0;}
- feed2minute = virtualPosition;
- lcd.setCursor(13,1);
- printDigits(feed2minute);
- } while ((digitalRead(PinSW)));
- lcd.noBlink();
- delay(1000);
- } // end of main IF rotary encoder push button checker
- // CHECK FOR MANUAL FEED BUTTON
- buttonState = digitalRead(buttonPin);
- if (buttonState == HIGH) {
- feed();
- }
- // CHECK FEEDING TIME AND FEED IF MATCHED
- if (tm.Hour == feed1hour && tm.Minute == feed1minute && tm.Second == 0) { // if I dont' check seconds are zero
- feed(); // then it'll feed continuously for 1 minute!
- }
- if (tm.Hour == feed2hour && tm.Minute == feed2minute && tm.Second == 0) {
- feed();
- }
- if (tm.Hour == feed3hour && tm.Minute == feed3minute && tm.Second == 0) { // if I dont' check seconds are zero
- feed(); // then it'll feed continuously for 1 minute!
- }
- } // End of main Loop
- void printDigits(int digits){ // utility function for digital clock display: prints leading 0
- if(digits < 10)
- lcd.print('0');
- lcd.print(digits);
- }
- void feed() {
- digitalWrite(13,HIGH);
- lcd.setCursor(17,0);
- lcd.print(" Miam Miam!!");
- for (int positionCounter = 0; positionCounter < 16; positionCounter++) {
- // scroll one position left:
- lcd.scrollDisplayLeft();
- // wait a bit:
- delay(150);
- }
- // Stir servo section If you don't need a stir servo simply comment out all fo this until the Auger rotate section
- stirServo.attach(feedpin); // I don't know if I need one either but I'm adding it now as it's easiest before I build it!
- for(pos = 0; pos <= 110; pos += 1) {
- stirServo.write(pos);
- delay(5); }
- delay(40000);
- for(pos = 110; pos>=0; pos-=1) {
- stirServo.write(pos);
- delay(5); }
- stirServo.detach();
- // rotate the Auger
- /*
- digitalWrite(feedpin2, HIGH); //test d'activation de pin
- digitalWrite(feedlight, HIGH);
- delay(feedQty *1000);
- digitalWrite(feedpin2, LOW); //test d'activation de pin
- digitalWrite(feedlight, LOW);
- /*
- feedServo.attach(feedpin3);
- for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
- // in steps of 1 degree
- {
- feedServo.write(pos); // tell servo to go to position in variable 'pos'
- delay(15); // waits 15ms for the servo to reach the position
- for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
- feedServo.write(pos); // tell servo to go to position in variable 'pos'
- delay(15); // waits 15ms for the servo to reach the position
- }
- feedServo.detach();
- */
- for (int positionCounter = 0; positionCounter < 16; positionCounter++) {
- // scroll one position left:
- lcd.scrollDisplayRight();
- // wait a bit:
- delay(150);
- }
- digitalWrite(13,LOW);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement