Alimentador automático de animais de estimação usando Arduino

Tempo de leitura: 7 minutes

Hoje estamos construindo um Alimentador Automático para Animais de Estimação baseado em Arduino, que pode servir comida para seu animal de estimação automaticamente. Possui um Módulo DS3231 RTC (Real Time Clock), que permite acertar a hora e a data em que o animal deve receber comida. Então, ao configurar o tempo de acordo com o horário de alimentação do seu animal de estimação, o dispositivo cai ou enche a tigela de comida automaticamente

Neste circuito, estamos usando um LCD 16*2 para exibir a hora usando o Módulo RTC DS3231 com Arduino UNO. Além disso, um servo motor é usado para girar os recipientes para fornecer a comida e o teclado de matriz 4 * 4 para configurar manualmente o tempo para alimentar o animal de estimação. Você pode definir o ângulo de rotação e a duração da abertura do recipiente de acordo com a quantidade de alimento que deseja servir ao seu animal de estimação. A quantidade de comida também pode depender do seu animal de estimação, seja ele um cão, gato ou pássaro.

Material Necessário

  • Arduino UNO
  • Teclado Matrix 4×4
  • 16*2 LCD
  • Push Button
  • Servo Motor (SG92) ou equivalente.
  • Resistor
  • Fios de Conecção
  • ProtoBoard

 

Diagrama de circuito

Neste alimentador de gatos baseado em Arduino, para obter hora e data, usamos o módulo RTC (Real Time Clock). Usamos o teclado de matriz 4 * 4 para definir o tempo de alimentação do animal de estimação manualmente com a ajuda do LCD 16×2. O servo motor gira o recipiente e solta os alimentos no tempo definido pelo usuário. O LCD é usado para exibir a data e a hora. O trabalho completo pode ser encontrado no Vídeo fornecido no final.

 

Modelo de comedouro para animais de estimação impresso em 3D

Projetamos este contêiner Arduino Pet Feeder usando a impressora 3D. Você também pode imprimir o mesmo desenho baixando os arquivos aqui. O material usado para imprimir este modelo é PLA. Possui quatro partes, conforme mostrado na imagem abaixo:

Monte as quatro peças e conecte o Servo Motor conforme mostrado na imagem abaixo:

Se você é novo na impressão 3D, aqui está o guia inicial. Você pode baixar os arquivos STL para este alimentador de animais de estimação aqui.

 

Módulo DS3231 RTC

DS3231 é um módulo RTC (Real Time Clock). É usado para manter a data e a hora da maioria dos projetos eletrônicos. Este módulo tem sua própria fonte de alimentação de célula tipo moeda, usando a qual mantém a data e a hora mesmo quando a alimentação principal é removida ou o MCU passou por um hard reset. Assim, uma vez que definimos a data e a hora neste módulo, ele manterá um registro disso sempre. Em nosso circuito, estamos utilizando o DS3231 para alimentar o pet de acordo com o horário, configurado pelo dono do Pet, como um alarme. À medida que o relógio atinge a hora definida, ele opera o servo motor para abrir o portão do recipiente e a comida cai na tigela de comida do animal de estimação.

Nota: Ao usar este módulo pela primeira vez, você deve definir a data e a hora. Você também pode usar o RTC IC DS1307 para ler a hora com o Arduino.

Código e Explicação

O código Arduino completo do Automatics Pet Feeder é fornecido no final.

O Arduino tem bibliotecas padrão para usar o servo motor e LCD 16*2 com ele. Mas para usar o Módulo DS3231 RTC e o teclado de matriz 4*4 com o Arduino, você deve baixar e instalar as bibliotecas. O link de download para ambas as bibliotecas é fornecido abaixo:

No código a seguir, estamos definindo bibliotecas, “#include <DS3231.h>” para o módulo RTC, “#include <Servo.h>” para Servo Motor, “#include <LiquidCrystal_I2C.h>” para 16*2 LCD e “#include <Keypad.h>” para teclado de matriz 4*4.

#include <DS3231.h>
#include <Servo.h>
#include <LiquidCrystal.h>
#include <Keypad.h>

No código a seguir, estamos definindo o mapa de teclado para o teclado de matriz 4*4 e atribuindo os pinos do Arduino para as linhas e colunas do teclado.

char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = { 2, 3, 4, 5 };
byte colPins[COLS] = { 6, 7, 8, 9 };

Aqui, estamos criando o teclado usando o comando abaixo no código.

Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

Atribuição de pinos A4 e A5 Arduino para conexão com os pinos SCL e SDA do DS3231. Além disso, atribuindo pinos ao LCD e inicializando o servo motor.

DS3231 rtc (A4, A5);
Servo servo_test; // inicializa um objeto servo para o servo conectado
LiquidCrystal lcd (A0, A1, A2, 11, 12, 13); // Cria um objeto LC. Parâmetros:(rs, ativar, d4, d5, d6, d7)

No código a seguir, estamos declarando t1 a t6, chave e array r[6] e o feed.

int t1, t2, t3, t4, t5, t6;
boolean feed = true;
 char key;
 int r[6];

No código abaixo, estamos configurando todos os componentes para o início. Como neste código “servo_test.attach (10);” O servo é conectado ao 10º pino do Arduino. Definindo A0, A1 e A2 como o pino de saída e inicializando o módulo LCD e RTC.

void setup()
{
  servo_test.attach(10);   // conecte o pino de sinal do servo ao pino 9 do Arduino
  rtc.begin();
  lcd.begin(16,2);
  servo_test.write(55);
  Serial.begin(9600);
  pinMode(A0, OUTPUT);
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
}

Agora, como o loop está funcionando é a parte importante de entender. Sempre que o botão é pressionado, ele vai alto significa 1, que pode ser lido por “buttonPress = digitalRead(A3)”. Agora ele vai para a instrução ‘if’ e chama a função ‘setFeedingTime’. Em seguida, ele compara o tempo real e o tempo inserido pelo usuário. Se a condição for verdadeira, o que significa que o tempo real e o tempo inserido são iguais, o servo motor gira em um ângulo de 100 graus e após 0,4 segundos de atraso ele volta à sua posição inicial.

void loop() {
  lcd.setCursor(0,0);
  int buttonPress;
  buttonPress = digitalRead(A3);

  if (buttonPress==1)
     setFeedingTime();
     lcd.print("Time:  ");
     String t = "";

     t = rtc.getTimeStr();
     t1 = t.charAt(0)-48;
     t2 = t.charAt(1)-48;
     t3 = t.charAt(3)-48;
     t4 = t.charAt(4)-48;
     t5 = t.charAt(6)-48;
     t6 = t.charAt(7)-48;

     lcd.print(rtc.getTimeStr());
     lcd.setCursor(0,1);
     lcd.print("Date: ");
     lcd.print(rtc.getDateStr());
   
     if (t1==r[0] && t2==r[1] && t3==r[2] && t4==r[3] && t5<1 && t6<3 && feed==true)
     {
       servo_test.write(100);   // comando para girar o servo para o ângulo especificado
       delay(400);  
       servo_test.write(55);
       feed=false;
     }
  }      
}

No código de função void setFeedingTime(), depois de pressionar o botão, somos capazes de inserir o tempo de alimentação do animal de estimação, então temos que pressionar ‘D’ para economizar esse tempo. Quando o tempo economizado coincide com o tempo real, o servo começa a girar.

void setFeedingTime()
{
  feed = true;
   int i=0;

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Definir o tempo de alimentação");
  lcd.clear();
  lcd.print("HH:MM");
  lcd.setCursor(0,1);
  while(1){
    key = kpd.getKey();
    char j;

  if(key!=NO_KEY){
    lcd.setCursor(j,1);
    lcd.print(key);
    r[i] = key-48;
    i++;
    j++;

    if (j==2)
    {
      lcd.print(":"); j++;
    }
    delay(500);
  }

  if (key == 'D')
  {key=0; break; }
  }
}

 

Funcionamento do comedouro automático para animais de estimação

Após fazer o upload do código para o Arduino Uno, a hora e a data serão exibidas no LCD 16*2. Quando você pressiona o botão, ele pergunta o tempo de alimentação do animal de estimação e você deve inserir o tempo usando o teclado de matriz 4*4. O display mostrará a hora inserida e quando você pressiona ‘D’ economiza a hora. Quando o tempo real e o tempo inserido coincidem, ele gira o servo motor de sua posição inicial 55⁰ a 100⁰ e, após um atraso, retorna novamente à sua posição inicial. Portanto, o servo motor é conectado ao portão do Recipiente de Alimentos e, à medida que ele se move, o portão se abre e alguma quantidade de comida cai na tigela ou prato. Após um atraso de 0,4 segundos, o servo motor gira novamente e fecha o portão. Todo o processo é concluído em alguns segundos. É assim que seu animal de estimação obtém a comida automaticamente no momento que você inseriu.

Altere o tempo e o grau de acordo com a comida

Código

#include <DS3231.h>
#include <Servo.h>
#include <LiquidCrystal.h>
#include <Keypad.h>

const byte ROWS = 4; // Four rows
const byte COLS = 4; // Three columns

// Define the Keymap

char keys[ROWS][COLS] = {

  {'1','2','3','A'},

  {'4','5','6','B'},

  {'7','8','9','C'},

  {'*','0','#','D'}

};

// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.

byte rowPins[ROWS] = { 2, 3, 4, 5 };

// Connect keypad COL0, COL1 and COL2 to these Arduino pins.

byte colPins[COLS] = { 6, 7, 8, 9 };

//  Create the Keypad
  Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

DS3231  rtc(A4, A5);
Servo servo_test;      //initialize a servo object for the connected servo  
LiquidCrystal lcd(A0, A1, A2, 11, 12, 13); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)

 //int angle = 0;    
// int potentio = A0;      // initialize the A0analog pin for potentiometer
 int t1, t2, t3, t4, t5, t6;

 
boolean feed = true; // condição para alarme

 char key;
 int r[6];
 
 void setup() 
 { 
  servo_test.attach(10);   // conecte o pino de sinal do servo ao pino 9 do Arduino
  rtc.begin();
  lcd.begin(16,2);
  servo_test.write(55); 
  Serial.begin(9600);
  pinMode(A0, OUTPUT);
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  
 } 
 
void loop() 
{ 

  lcd.setCursor(0,0);
  int buttonPress;
  buttonPress = digitalRead(A3);

  if (buttonPress==1) setFeedingTime();
 
  //Serial.println(buttonPress);

  lcd.print("Time:  ");
  String t = "";
  t = rtc.getTimeStr(); 
  t1 = t.charAt(0)-48;
  t2 = t.charAt(1)-48;
  t3 = t.charAt(3)-48;
  t4 = t.charAt(4)-48;
  t5 = t.charAt(6)-48;
  t6 = t.charAt(7)-48;
 
  lcd.print(rtc.getTimeStr());
  lcd.setCursor(0,1);
  lcd.print("Date: ");
  lcd.print(rtc.getDateStr());
 
  if (t1==r[0] && t2==r[1] && t3==r[2] && t4==r[3]&& t5<1 && t6<3 && feed==true)
  { 
    servo_test.write(100);                   // comando para girar o servo para o ângulo especificado
    delay(400);   
    servo_test.write(55); 
    feed=false;
  } 
}       

void setFeedingTime()
{
  feed = true;
   int i=0;

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Definir o tempo de alimentação");
  lcd.clear();
  lcd.print("HH:MM");
  lcd.setCursor(0,1);

  
  while(1) {
    key = kpd.getKey();
    char j;
    
    if(key!=NO_KEY){
    
      lcd.setCursor(j,1);
      lcd.print(key);
      r[i] = key-48;
      i++;
      j++;

      if (j==2)
      {
        lcd.print(":"); j++;
      }
      delay(500);
    }

    if (key == 'D')
       {key=0; break; }
  }
}

Para facilitar segue o link para download do Sketch completo para você. (Aqui)

Conclusão

Neste artigo, mostrei como usar um LCD alfanumérico com o Arduino para controlar um Alimentador para Animais. Espero que você tenha achado útil e informativo. Se sim, compartilhe com um amigo que também gosta de eletrônica e de fazer coisas!

Eu adoraria saber quais projetos você planeja construir (ou já construiu) este projeto. Se você tiver alguma dúvida, sugestão, ou se achar que falta alguma coisa neste tutorial, por favor, deixe um comentário abaixo.