UCL-Embedded-Automatic-Arduino-Pet-Feeder

3,999

27

5

Ever been in a situation where you had to leave your beloved pet at home while you're on vacation, running errands or at work? Or perhaps your petsitter is on a tight schedule, making every minute saved invaluable in ensuring your pet's well-being.

Well, fret not! Thanks to our recent development from the Automation Engineering department at UCL Odense, we've created a guide on how you can create this magnificent machine.

Using the powerful and compact hardware solutions of an Arduino Mega 2560, a Stepper Motor, Stepper Driver and an Ultrasonic Sensor making for one sturdy unit.

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: Hardware Required

- 1x Arduino Mega 2560

- 1x Stepper Motor 12V 28BYJ-48

- 1x Stepper Motor Driver ULN2003

- 1x Ultrasonic sensor HC-SR04

- 1x Clock Module DS1307

- 1x 0.91" IIC I2C 128x32 SSD1306 SPI OLED Display Module

- 20x Wires M/F & 2x Wire M/M

- 1x Breadboard

- 1x Battery

Step 2: Setup

Power = 5V

Ground = GND

OLED_MOSI = 9

OLED_CLK = 10

OLED_DC = 11

OLED_CS = 12

OLED_RESET = 13

trigPin = 2

echoPin = 3

RTC SDA = SDA 20

RTC SCL = SCL 21

motorPin1Feed = 22

motorPin2Feed = 24

motorPin3Feed = 26

motorPin4Feed = 28

Step 3: 3D Printing... 3D Printing... and Some More 3D Printing

As you might've noticed there's quite the amount of STL-files attached to this Instructable, so it's quite a necessity for our construction to have a 3D printer at hand.

Although we used all of our designs to create this machine, there are a couple of STL-files you can technically live without;

  • "mount-base-pet-feeder.stl" - Depends on how you intend to set up the cabin containing the wiring, Arduino, Stepper Motor and Step Driver
  • "left-mount-adjuster-pet-feeder.stl" -
  • "right-mount-adjuster-pet-feeder.stl" -
  • "left-spacer-mount-adjuster-pet-feeder.stl" -
  • "right-spacer-mount-adjuster-pet-feeder.stl" -
  • "Bowl-v2.stl" - We won't hold a grudge if you don't use our purpose-built bowl.
  • "M&M's.stl" - This was only used for rendering and illustrating our Automatic PetFeeder in Autodesk Fusion 360. **Not to be used as food for your pet. We hold no responsibility in improper usage**

Step 4: Let's Add Some Code

<p>//Basic Embedded Programming 2. Semester Project UCL</p><p>//TinyRTC I2C module DS1307
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}</p><p>#include 
#include 
#include 
#include 
#include 
#include 
RTC_DS1307 RTC;
//#include DS1307 rtc(SDA, SCL);</p><p>//declaring variables for the motor (driver) pins
int motorPin1Feed = 22;
int motorPin2Feed = 24;
int motorPin3Feed = 26;
int motorPin4Feed = 28;</p><p>//if(hour >= 
int petFeedMorning;
int petFeedAfternoon;</p><p>int petFedMorning;
int petFedAfternoon;</p><p>//Declare ultrasonic sensor pins
int trigPin = 2;    // Trigger
int echoPin = 3;    // Echo
long duration, cm, inches;</p><p>// Variables will change:
//Millis()
long previousMillis = 0;        // will store last time LED was updated</p><p>// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 1000; // interval at which to blink (milliseconds)</p><p>//Disp millis()
//int period = 1000;
unsigned long time_now = 0;</p><p>#define STEPSFeed 64
#define STEPSTop 64  //Number of steps per revolution
#define STEPSBottom 64  //Number of steps per revolution</p><p>//The pin connections need to be 4 pins connected
// to Motor Driver In1, In2, In3, In4 and then the 
// here in the sequence 1-3-2-4 for proper sequencing of 28BYJ48
Stepper small_stepperFeed(STEPSFeed, motorPin1Feed, motorPin3Feed, motorPin2Feed, motorPin4Feed);</p><p>Stepper small_stepperTop(STEPSTop, motorPin1Top, motorPin3Top, motorPin2Top, motorPin4Top);</p><p>int Steps2TakeFeed;
int Steps2TakeTop;</p><p>unsigned long startMillis;  //some global variables available anywhere in the program
unsigned long currentMillis;
const unsigned long period = 1000;  //the value is a number of milliseconds</p><p>#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels</p><p>// Declaration for SSD1306 display connected using software SPI (default case):
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
  OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);</p><p>// 'Logo 2', 128x32px
static const unsigned char myBitmap [] PROGMEM = {
  0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 
  0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 
  0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 
  0xff, 0xbc, 0x3c, 0xc6, 0x1e, 0x0e, 0x07, 0xfc, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 
  0xff, 0xbc, 0x3c, 0xc6, 0x3c, 0x0f, 0x07, 0xfc, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 
  0xff, 0xb4, 0x7c, 0xc6, 0x78, 0x1f, 0x07, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 
  0xff, 0xbe, 0x7c, 0xc6, 0xf0, 0x1b, 0x87, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 
  0xff, 0xbe, 0x7c, 0xc7, 0xe0, 0x1b, 0x87, 0xf8, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 
  0xff, 0xb6, 0x7c, 0xc7, 0xe0, 0x39, 0x87, 0xf8, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 
  0xff, 0xba, 0x5c, 0xc7, 0xf0, 0x31, 0xc7, 0xf8, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 
  0xff, 0xbb, 0xdc, 0xc7, 0x70, 0x7f, 0xc7, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 
  0xff, 0xbb, 0xdc, 0xc6, 0x38, 0x7f, 0xc7, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 
  0xff, 0xbb, 0xdc, 0xc6, 0x1c, 0x60, 0xe7, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 
  0xff, 0xbb, 0x9c, 0xc6, 0x1e, 0xe0, 0xe7, 0xfc, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 
  0xff, 0xb9, 0x9c, 0xc6, 0x0e, 0xe0, 0x67, 0xfc, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 
  0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 
  0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 
  0xff, 0x80, 0x00, 0x00, 0x00, 0x60, 0xe7, 0xfc, 0xe0, 0xc7, 0x0e, 0x73, 0x83, 0x07, 0xe1, 0xff, 
  0xff, 0x80, 0x00, 0x00, 0x00, 0x60, 0xc7, 0xfc, 0xf0, 0xc7, 0x0e, 0x73, 0x83, 0x0f, 0xf1, 0xff, 
  0xff, 0x80, 0x00, 0x00, 0x00, 0x60, 0xe7, 0x00, 0xf8, 0xc7, 0x8e, 0x73, 0xc3, 0x1c, 0x39, 0xff, 
  0xff, 0x80, 0x00, 0x00, 0x00, 0x60, 0xe7, 0x00, 0xf8, 0xc7, 0x8e, 0x73, 0xe3, 0x38, 0x19, 0xff, 
  0xff, 0x80, 0x00, 0x00, 0x00, 0x60, 0xc7, 0x00, 0xfc, 0xc6, 0xce, 0x73, 0x63, 0x38, 0x01, 0xff, 
  0xff, 0x80, 0x00, 0x00, 0x00, 0x7f, 0xe7, 0xfc, 0xec, 0xc6, 0xee, 0x73, 0x73, 0x38, 0x01, 0xff, 
  0xff, 0x80, 0x00, 0x00, 0x00, 0x7f, 0xe7, 0xfc, 0xee, 0xc6, 0x6e, 0x73, 0x33, 0x38, 0xf9, 0xff, 
  0xff, 0x80, 0x00, 0x00, 0x00, 0x60, 0xc7, 0x00, 0xe6, 0xc6, 0x7e, 0x73, 0x1b, 0x30, 0xf9, 0xff, 
  0xff, 0x80, 0x00, 0x00, 0x00, 0x60, 0xc7, 0x00, 0xe3, 0xc6, 0x3e, 0x73, 0x1b, 0x38, 0x19, 0xff, 
  0xff, 0x80, 0x00, 0x00, 0x00, 0x60, 0xe7, 0x00, 0xe3, 0xc6, 0x3e, 0x73, 0x0f, 0x38, 0x39, 0xff, 
  0xff, 0xbf, 0xff, 0xff, 0xfc, 0x60, 0xc7, 0xfc, 0xe1, 0xc6, 0x1e, 0x73, 0x0f, 0x1e, 0x79, 0xff, 
  0xff, 0xbf, 0xff, 0xff, 0xfc, 0x60, 0xc7, 0xfc, 0xe1, 0xc6, 0x0e, 0x73, 0x07, 0x0f, 0xf9, 0xff, 
  0xff, 0xbf, 0xff, 0xff, 0xfc, 0x60, 0xe7, 0xfe, 0xe0, 0xc6, 0x0e, 0x73, 0x07, 0x07, 0xc9, 0xff, 
  0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 
  0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff
};</p><p>void setup() {</p><p>  Wire.begin();
  //Serial Port begin
  Serial.begin(9600);
  // Using this to set the initial time:
  // DS1307 seconds, minutes, hours, day, date, month, year
  // setDS1307time(30,9,19,1,1,4,19);
  // 1 = Sunday
  
  //Define inputs and outputs (Ultrasonic sensor)
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);</p><p>  startMillis = millis();  //initial start time</p><p>  // put your setup code here, to run once:
  small_stepperFeed.setSpeed(200);
  small_stepperTop.setSpeed(200);</p><p>  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }</p><p>  // Show initial display buffer contents on the screen --
  // the library initializes this with an Adafruit splash screen.
  display.display();
  delay(500); // Pause for 2 seconds</p><p>  // Clear the buffer
  display.clearDisplay();</p><p>}</p><p>void loop() {
  
  //Over 35 cm display length, time, day and date
  if(cm >= 45) {
    ultrasonic();
    displayTimeSerial();
    displayTimeDisplay();
    delay(750);
    displayDayDateDisplay();
    delay(750);
    checkTime();
    Serial.print("Morning: ");
    Serial.println(petFeedMorning);
    Serial.print("Afternoon: ");
    Serial.println(petFeedAfternoon);
    }
  //Between 35 cm (under) and 5 cm (over) feed pet, turn motor CW
  //else if(cm <= 20 && hour >= 7 && hour <= 13) {
  if(cm <= 45 && cm >8) {
    ultrasonic();
    stepMotorFeed();
  }
  //Under 5 cm display length, time, day and date
  else if(cm <= 8) {
    ultrasonic();
    displayTimeSerial();
    displayTimeDisplay();
    if(petFedMorning <1) {
      petFedMorning +1;
      Serial.print(petFedMorning);
    }
  }
}</p><p>void setDS1307time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
  // sets time and date data to DS1307
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();
}</p><p>void readDS1307time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0); // set DS1307 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
  // request seven bytes of data from DS1307 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}</p><p>void checkTime() {
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // retrieve data from DS1307
  readDS1307time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  
  if(hour >= 6 && hour <= 11) {
    petFeedMorning = 1;
  }
  else if (hour >= 5 && hour <= 13) {
    petFeedMorning = 0;
  }
  if(hour >= 17 && hour <= 21) {
    petFeedAfternoon = 1;
  }
  else if(hour <= 16 && hour >= 18) {
    petFeedAfternoon = 0;
  }
  
}</p><p>void displayTimeSerial()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // retrieve data from DS1307
  readDS1307time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  //Current function prints this on the serial monitor
  Serial.print(hour, DEC);
  
  // convert the byte variable to a decimal number when displayed
  Serial.print(":");
  if (minute<10)
  {
    Serial.print("0");
  }
  Serial.print(minute, DEC);
  Serial.print(":");
  if (second<10)
  {
    Serial.print("0");
  }</p><p>  //Print seconds on serial monitor
  Serial.print(second, DEC);
  Serial.print(" ");
  //Print numerical day of the month on serial monitor
  Serial.print(dayOfMonth, DEC);
  Serial.print("/");
  //Print month on serial monitor
  Serial.print(month, DEC);
  Serial.print("/");
  //Print year on serial monitor
  Serial.print(year, DEC);
  Serial.print(" Day of week: ");
  //Determine specific day of the week
  switch(dayOfWeek){
  case 1:
    Serial.println("Sunday");
    break;
  case 2:
    Serial.println("Monday");
    break;
  case 3:
    Serial.println("Tuesday");
    break;
  case 4:
    Serial.println("Wednesday");
    break;
  case 5:
    Serial.println("Thursday");
    break;
  case 6:
    Serial.println("Friday");
    break;
  case 7:
    Serial.println("Saturday");
    break;
  }
}</p><p>void displayTimeDisplay()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // retrieve data from DS1307
  readDS1307time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  //Current function shows this on the OLED display
  //Display
  //TODO Millis
/*
  currentMillis = millis();  //get the current "time" (actually the number of milliseconds since the program started)
  if (currentMillis - startMillis >= period)  //test whether the period has elapsed
  {
    display.clearDisplay();
    display.display();
    display.setCursor(0,0);
    display.setTextSize(2);             // Draw 2X-scale text
    display.setTextColor(WHITE);
    display.print(cm);
    display.println(" Millis");
    display.display();
    digitalWrite(trigPin, LOW);
    delayMicroseconds(5);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    startMillis = currentMillis;  //IMPORTANT to save the start time of the current LED state.
  }
  */
  
  //Display distance measured from Ultrasonic sensor on OLED
  display.clearDisplay();
  display.display();
  display.setCursor(0,0);
  display.setTextSize(2);             // Draw 2X-scale text
  display.setTextColor(WHITE);
  display.print(cm);
  display.println(" cm");
  
  display.setTextSize(1);             // Draw 2X-scale text
  display.setTextColor(WHITE);
  display.println();
  //Display hours on OLED
  display.print(hour, DEC);
  
  //Converting the byte variable to a decimal number when displayed
  display.print(":");
  if (minute<10)
  {
    display.print("0");
  }
  //Display minutes on OLED
  display.print(minute, DEC);
  display.print(":");
  if (second<10)
  {
    display.print("0");
  }
  
  //Display seconds on OLED
  display.print(second, DEC);
  display.print(" ");</p><p>  //Between 35 cm (under) and 5 cm (over) feed pet, turn motor CW
  //else if(cm <= 20 && hour >= 7 && hour <= 13) {
  if(cm <= 35 && cm >5) {
    display.setCursor(85,25);
    display.setTextSize(1);             // Draw 2X-scale text
    display.setTextColor(WHITE);
    display.print("FEEDING");
  }
  //Under 5 cm display length, time, day and date
  else if(cm <= 5) {
    display.setCursor(85,25);
    display.setTextSize(1);             // Draw 2X-scale text
    display.setTextColor(WHITE);
    display.print("DONE");
  }
  
  display.display();
  //TODO Millis
  //delay(1000);
}</p><p>void displayDayDateDisplay()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  //Retrieving data from DS1307
  readDS1307time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  //Sending it to the OLED display
  //Display
  //TODO Millis
  //Day
  display.clearDisplay();
  display.setCursor(0,0);
  display.setTextSize(1);             // Draw 2X-scale text
  display.setTextColor(WHITE);
  display.println();</p><p>  //Determine specific day of the week
  switch(dayOfWeek){
  case 1:
    display.println("Sunday");
    //display.println();
    break;
  case 2:
    display.println("Monday");
    break;
  case 3:
    display.println("Tuesday");
    break;
  case 4:
    display.println("Wednesday");
    break;
  case 5:
    display.println("Thursday");
    break;
  case 6:
    display.println("Friday");
    break;
  case 7:
    display.println("Saturday");
    break;
  }
  //Date
  display.setTextSize(2);             // Draw 2X-scale text
  display.setTextColor(WHITE);
  display.print(dayOfMonth, DEC);
  display.print("/");
  display.print(month, DEC);
  display.print("/");
  display.print(year, DEC);
  display.println(" ");
  
  display.display();
  //TODO Millis
  //delay(500);
}</p><p>void ultrasonicTimeout() {
  // The sensor is triggered by a HIGH pulse of 10 or more microseconds.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
  /*
  //Without Millis
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  */</p><p>  currentMillis = millis();  //get the current "time" (actually the number of milliseconds since the program started)
  if (currentMillis - startMillis >= period)  //test whether the period has elapsed
  {
    digitalWrite(trigPin, LOW);
    delayMicroseconds(5);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    startMillis = currentMillis;  //IMPORTANT to save the start time of the current LED state.
  }
 
  // Read the signal from the sensor: a HIGH pulse whose
  // duration is the time (in microseconds) from the sending
  // of the ping to the reception of its echo off of an object.
  pinMode(echoPin, INPUT);
  duration = pulseIn(echoPin, HIGH);
 
  // Convert the time into a distance
  cm = (duration/2) / 29.1;     // Divide by 29.1 or multiply by 0.0343
  inches = (duration/2) / 74;   // Divide by 74 or multiply by 0.0135
  
  Serial.print(inches);
  Serial.print("in, ");
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();</p><p>  //delay(200);
}</p><p>void ultrasonic() {
  // The sensor is triggered by a HIGH pulse of 10 or more microseconds.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
  /*
  //Without Millis
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  */
  
  currentMillis = millis();  //get the current "time" (actually the number of milliseconds since the program started)
  if (currentMillis - startMillis >= period)  //test whether the period has elapsed
  {
    digitalWrite(trigPin, LOW);
    delayMicroseconds(5);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    startMillis = currentMillis;  //IMPORTANT to save the start time of the current LED state.
  }
 
  // Read the signal from the sensor: a HIGH pulse whose
  // duration is the time (in microseconds) from the sending
  // of the ping to the reception of its echo off of an object.
  pinMode(echoPin, INPUT);
  duration = pulseIn(echoPin, HIGH);
 
  // Convert the time into a distance
  cm = (duration/2) / 29.1;     // Divide by 29.1 or multiply by 0.0343
  inches = (duration/2) / 74;   // Divide by 74 or multiply by 0.0135
  
  Serial.print(inches);
  Serial.print("in, ");
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();
}</p><p>void stepMotorFeed() {
/*
  currentMillis = millis();  //get the current "time" (actually the number of milliseconds since the program started)
  if (currentMillis - startMillis >= period)  //test whether the period has elapsed
  {
    //function to turn stepper motor 32 steps left
    small_stepperFeed.setSpeed(300);  // 200 as max speed?
    //ultrasonic();
    Steps2TakeFeed  =   -3200;  // Rotate CW
    //ultrasonic();
    small_stepperFeed.step(Steps2TakeFeed);
    startMillis = currentMillis;  //IMPORTANT to save the start time of the current LED state.
  }
  */
  
  //function to turn stepper motor 32 steps left
  small_stepperFeed.setSpeed(300);  // 200 as max speed?
  //ultrasonic();
  Steps2TakeFeed  =   -520;  // Rotate CW
  //ultrasonic();
  small_stepperFeed.step(Steps2TakeFeed);
}</p><p>void testdrawlogo() {
  display.clearDisplay();</p><p>  display.drawBitmap(
    (display.width()  - SCREEN_WIDTH ),
    (display.height() - SCREEN_HEIGHT),
    myBitmap, SCREEN_WIDTH, SCREEN_HEIGHT, 1);
  display.display();
  // Invert and restore display, pausing in-between
  display.invertDisplay(true);
  delay(1000);
  display.invertDisplay(false);
  delay(8000);
}</p>
Arduino Contest 2019

Participated in the
Arduino Contest 2019

1 Person Made This Project!

Recommendations

  • Made with Math Contest

    Made with Math Contest
  • Multi-Discipline Contest

    Multi-Discipline Contest
  • Robotics Contest

    Robotics Contest

5 Discussions

0
None
Benjamin12q235

5 months ago

Which 3d printer did you use for this project?

1
None
randofo

6 months ago

It looks like you are feeding your pets m&ms. :)

What software did you use to design the 3d parts?

3 replies
0
None
MikaelHerandofo

Reply 6 months ago

We used Autodesk Fusion 360 :)

1
None
randofoMikaelHe

Reply 6 months ago

Out of curiosity, were you required to use Fusion 360 for the class, or something you decided on your own?

0
None
MikaelHerandofo

Reply 6 months ago

We actually started out using some rather simple 3D programs, but ultimately they ended up causing more problems than good. Obviously it's not an easy switch with no previous experience, but it definitely helped refine our product :)