IOT Pet Feeder Using the Blynk Mobile App and an ESP32 Mo...

About the project

today i show you how to make IOT Pet Feeder Using the Blynk Mobile App and an ESP32

Project info

Difficulty: Moderate

Estimated time: 1 hour

License: Apache License 2.0 (Apache-2.0)

Items used in this project

Hardware components

Digilent Stepper Motor Digilent Stepper Motor x 1
SG90 Micro-servo motor SG90 Micro-servo motor x 1
Arduino UNO Arduino UNO x 1
Espressif ESP32S Espressif ESP32S x 1

Software apps and online services

Arduino IDE Arduino IDE

Hand tools and fabrication machines

3D Printer (generic) 3D Printer (generic) x 1

Story


Hi friends , welcome back Today I’m gonna show you how I built your own Wi-Fi Controlled Automatic Pet Feeder so If you have a pet at your place and there is no one to feed him/her at the right time in your absence. So here we are building a IoT-based Pet Feeder which is simple, efficient, and economic. Using this automatic pet feeder, you can feed your Pet by using Blynk App or Web Dashboard from anywhere in the world.

You just have to press a button or set a time and the rest of the task will be done by this machine.

in this project we are using a NodeMCU ESP32 as the main controller, a Stepper motor to operate the pet feeder.


Thank You, NextPCB: This project is successfully completed because of the help and support from NextPCB. Guys if you have a PCB project, please visit their website and get exciting discounts and coupons.


Get $100 coupon from NextPCB: https://www.nextpcb.com/register

Check now our new offers here

Free shipping 0$ PCB Prototype:https://www.nextpcb.com/pcb-quote

Thanksgiving Christmas lucky draw 100% win: https://www.nextpcb.com/christmas-lucky-draw


You can set up a detailed meal schedule.

You can also just sprinkle some cat food remotely using your smartphone at any time and from anywhere.


Credit :- Smart Solution For home

Step 1: Components Required for Building Pet Feeder

1 / 2

NodeMCU ESP32

Stepper Motor

Jumper cable

3D printed Some File

Adapter

USB cable For Programming

Download STL File :- (Click Here)

Step 2: Electronics

1 / 3

Automatic Pet Feeder Circuit Diagram

Complete schematic for Automatic Pet Feeder is given above:

Connections are very simple as we are only connecting a Stepper Motor with ESP32.

STEPPER_IN1 27

STEPPER_IN2 26

STEPPER_IN3 25

STEPPER_IN4 33

GND GND

VCC VIN

Step 3: Programming ESP32 for Pet Feeder (Sample Program)

1 / 2

/* Comment this out to disable prints and save space */
#define BLYNK_PRINT Serial

#include <WiFi.h>
#include <WiFiClient.h>
const char ssid[] = "Your WiFi SSID"; // WiFi name
const char password[] = "Your WiFi Password"; // WiFi password

#include <BlynkSimpleEsp32.h>
char auth[] = "Your Blynk Auth Token"; // Blynk Authentication Token
WiFiServer server(80);

#include <SPI.h>
#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI(); // Resolution 135 x 240
#define FF17 &FreeSans9pt7b
#define FF21 &FreeSansBold9pt7b
#define ROW1 0,16
#define ROW2 0,38
#define ROW3 0,60
#define ROW4 0,82
#define ROW5 0,104
#define ROW6 0,126

#define BUTTON1 35
#define BUTTON2 0

#define STEPPER_IN1 27
#define STEPPER_IN2 26
#define STEPPER_IN3 25
#define STEPPER_IN4 33

#define REVOLUTION_STEP 2048 // 1 revolution

boolean stepperDirection = false;
int stepperStep = 0;
int stepperStepCount = 0;
boolean stepperMove = false;
long prevMillisStepper = 0;
int intervalStepper = 4; // Minimum is 2

boolean button1Pressed = false;
boolean button2Pressed = false;

BLYNK_WRITE(V0) // Button Widget is writing to pin V0
{
  stepperDirection = param.asInt();

  tft.fillRect(120, 65, 120, 25, TFT_BLACK);
  tft.setCursor(120, 82);
  if (stepperDirection) {
    tft.print("CCW");
  }
  else {
    tft.print("CW");
  }
}

BLYNK_WRITE(V1) // Button Widget is writing to pin V1
{
  int stepperSpeed = param.asInt();

  tft.fillRect(120, 87, 120, 25, TFT_BLACK);
  tft.setCursor(120, 104);
  if (stepperSpeed == 1) {
    intervalStepper = 4;
    tft.print("Low");
  }
  else if (stepperSpeed == 2) {
    intervalStepper = 3;
    tft.print("Medium");
  }
  else if (stepperSpeed == 3) {
    intervalStepper = 2;
    tft.print("High");
  }
}

BLYNK_WRITE(V2) // Button Widget is writing to pin V2
{
  stepperMove = true;
  stepperStepCount = 0;
  stepperStep = 1;

  tft.fillRect(120, 109, 120, 25, TFT_BLACK);
  tft.setCursor(120, 126);
  tft.print("Run");
}

void setup()
{
  pinMode(BUTTON1, INPUT_PULLUP);
  pinMode(BUTTON2, INPUT_PULLUP);
  
  pinMode(STEPPER_IN1, OUTPUT);
  pinMode(STEPPER_IN2, OUTPUT);
  pinMode(STEPPER_IN3, OUTPUT);
  pinMode(STEPPER_IN4, OUTPUT);

  Serial.begin(115200);
  Serial.print("Initialize Blynk.");

  tft.init();
  tft.setRotation(3);
  tft.fillScreen(TFT_BLACK);
  
  tft.setFreeFont(FF21);
  tft.setTextColor(TFT_BLUE);
  tft.setCursor(ROW1);
  tft.print("Blynk Status:");
  
  tft.setFreeFont(FF17);
  tft.setTextColor(TFT_WHITE);
  tft.setCursor(120, 16);
  tft.print("Initialize...");

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  Blynk.begin(auth, ssid, password);

  tft.fillRect(120, 0, 120, 35, TFT_BLACK);
  tft.setCursor(120, 16);
  tft.print("Ready!");

  tft.setFreeFont(FF21);
  tft.setTextColor(TFT_RED);
  tft.setCursor(ROW3);
  tft.print("STEPPER");
  tft.setTextColor(TFT_GREEN);
  tft.setCursor(ROW4);
  tft.print("Direction:");
  tft.setCursor(ROW5);
  tft.print("Speed:");
  tft.setCursor(ROW6);
  tft.print("Status:");

  tft.setFreeFont(FF17);
  tft.setTextColor(TFT_YELLOW);
  tft.setCursor(120, 82);
  tft.print("CW");
  tft.setCursor(120, 104);
  tft.print("Low");
  tft.setCursor(120, 126);
  tft.print("Stop");

  Blynk.virtualWrite(0, 0);
  Blynk.virtualWrite(1, 1);
  Blynk.virtualWrite(2, 0);
}

void loop()
{
  Blynk.run();
  
  if (digitalRead(BUTTON1) == LOW &&
      button1Pressed == false) {
    button1Pressed = true;
    
    stepperDirection = false;
    stepperMove = true;
    stepperStepCount = 0;
    stepperStep = 1;
  }
  else if (digitalRead(BUTTON1) == HIGH &&
           button1Pressed == true) {
    button1Pressed = false;
  }
  
  if (digitalRead(BUTTON2) == LOW) {
    
    stepperDirection = true;
    stepperMove = true;
    stepperStepCount = 0;
    stepperStep = 1;
  }
  else if (digitalRead(BUTTON2) == HIGH &&
           button2Pressed == true) {
    button2Pressed = false;
  }
  
  if (millis() - prevMillisStepper > intervalStepper) {
    
    if (stepperMove == true) {
      if (stepperDirection) {
        if (stepperStep++ >= 3) {
          stepperStep = 0;
        }
      }
      else {
        if (stepperStep-- == 0) {
          stepperStep = 3;
        }
      }

      if (stepperStepCount++ == REVOLUTION_STEP) {
        stepperMove = false;
        stepperStep = 4;

        Blynk.virtualWrite(2, 0);
        
        tft.fillRect(120, 109, 120, 25, TFT_BLACK);
        tft.setCursor(120, 126);
        tft.print("Stop");
      }

      switch (stepperStep) {
        case 0:
          digitalWrite(STEPPER_IN1, HIGH);
          digitalWrite(STEPPER_IN2, LOW);
          digitalWrite(STEPPER_IN3, LOW);
          digitalWrite(STEPPER_IN4, LOW);
          break;

        case 1:
          digitalWrite(STEPPER_IN1, LOW);
          digitalWrite(STEPPER_IN2, HIGH);
          digitalWrite(STEPPER_IN3, LOW);
          digitalWrite(STEPPER_IN4, LOW);
          break;

        case 2:
          digitalWrite(STEPPER_IN1, LOW);
          digitalWrite(STEPPER_IN2, LOW);
          digitalWrite(STEPPER_IN3, HIGH);
          digitalWrite(STEPPER_IN4, LOW);
          break;

        case 3:
          digitalWrite(STEPPER_IN1, LOW);
          digitalWrite(STEPPER_IN2, LOW);
          digitalWrite(STEPPER_IN3, LOW);
          digitalWrite(STEPPER_IN4, HIGH);
          break;

        default:
          digitalWrite(STEPPER_IN1, LOW);
          digitalWrite(STEPPER_IN2, LOW);
          digitalWrite(STEPPER_IN3, LOW);
          digitalWrite(STEPPER_IN4, LOW);
          break;
      }
    }

    prevMillisStepper = millis();
  }
}

Step 4: Software and Libraries

To use the ESP32 board with the Arduino library, you'll have to use the Arduino IDE with ESP32 board support. If you haven't already done that yet, you can easily install ESP32 Board support to your Arduino IDE by following this tutorial by Sparkfun.

Install the Libraries:

Before uploading the code install the following libraries :

1. ESP322. Blynk

How to Install the Libraries?

You can read this tutorial by Sparkfun to install the Arduino libraries.

Step 5: Configuring Blynk for Pet Feeder

1 / 3

Blynk is a complete set of software for prototyping, and remotely managing connected devices at any scale, from small IoT projects to millions of commercially available connected items.

In this project, we are going to use the Blynk mobile application for controlling the stepper motor that is connected to the pet feeder setup.

Step-1:Download the Blynk app

1. For Android

2. For iPhone

For that first, we have to create a new account for Blynk Cloud platform or you can use your old account if you already have one.

Step-2:

Get the Auth Token In order to connect the Blynk App and your hardware, you need an Auth Token.

Once you have logged in to your account you have to create a template where you can add multiple devices. For that click on the ‘+ New Template’ button on top right corner.

Step 6: Assembly

you have all the parts printed (it takes about 20 hours, so be patience🙂 ). It’s time to put them together. Apart from the printed elements themselves, you’re gonna need a few M2.5 and M3 screws, a screwdriver, and Superglue

Step 7: Parts Assembly

1 / 8

  • we gonna mount the flap frame on the top edge of the container. Just put some glue in the groove and slide it over
  • Do the same on the other side, but glue the funnel this time.
  • Place the gear into the main body parts, and then insert the funnel with the container into the 3 printed slot.
  • assemble the top and middle parts of the ESP32 box

Step 8: Install the Stepper Motor

1 / 8

Connect the plug to the socket.

Hide the excess cable in a hole on the back of the box.

Put the motor in the slot, and slide the motor cover down.

Which also serves as a PCB box lock.

This will keep the Pet Feeder in one piece. And it will allow for quick disassembly if needed.

Step 9: Mount Controller Board

1 / 5

Now we’re gonna make the controller box, which is also the base of the device.

The box consists of three parts: top, middle, and bottom. I designed it this way so it could be printed without supports.

Step 10: Final Testing

Now our device is ready for real field testing.

The last step is to test the Feeder, connect the feeder to the micro USB port through a good quality USB cable, you will notice the red LED will ON.

Just press the button to feed

Visit https://smartsolutions4home.com/ss4h-pf-pet-feeder... For More Info

Schematics, diagrams and documents

fkag1dpkok1pa9z_femXraBe5U.jpg

Code

Github

https://github.com/espressif/arduino-esp32

Github file

https://github.com/blynkkk/blynk-library/releases

Code snippet #1

Credits

Leave your feedback...