Table of Contents

Dispensor de Mancare Multipurpose

Racolta Andrei-Vlad, 334CD

Introducere

Acest dispenser de mâncare detectează când un animal/o persoană se află la distanța potrivită și da mâncare într-o cantitate controlată prin deschiderea repetată a unei trape acționate de un servo-motor.

Scopul acestui dispozitiv este de a da mâncare la cerere, fiind util pentru persoane ce au animale de companie sau persoane ce vor să aibă un “snack machine” în casă.

Ideea dispensorului a venit de la faptul că am animale de companie în casă, în cazul meu o pisică și un câine, și am gândit acest proiect pentru a nu mai trebui să mă ridic de fiecare dată de la birou, că să îi dau pisicii mele de mâncare. De asemenea, acesta poate fi folosit că și un dispozitiv ce dă mâncare (arahide, bomboane, covrigei etc.) pentru cine are nevoie sau la evenimente ca petreceri.

Utilitatea acestui proiect vine din două perspective:

Descriere generala

Hardware Design

Proiectul dispune de următoarele componente:

Software Design

Mediu de dezvoltare

Biblioteci și surse 3rd-party folosite

Implementare proprie (fără dependințe externe)

Algoritmi și structuri implementate

1. Structuri de date
typedef enum {
    MODE_HUMAN = 0,    // Mod pentru hrănirea umană (cu opțiune fără cooldown)
    MODE_ANIMAL        // Mod pentru hrănirea animale (cooldown obligatoriu)
} DispenseMode;

typedef enum {
    FOOD_LOW = 0,      // 5 cicluri de dispensare
    FOOD_MEDIUM,       // 10 cicluri de dispensare  
    FOOD_HIGH          // 15 cicluri de dispensare
} FoodAmount;

// Setări cooldown pentru umani (în minute) - cu opțiunea NONE
const uint16_t humanCooldowns[] = {0, 5, 10, 15, 30, 45, 60};
#define HUMAN_COOLDOWN_COUNT 7

// Setări cooldown pentru animale (în minute) - fără opțiunea NONE
const uint16_t animalCooldowns[] = {30, 60, 120, 240, 480, 720};
#define ANIMAL_COOLDOWN_COUNT 6

// Configurare cicluri de dispensare
const uint8_t foodCycles[] = {5, 10, 15};    // Numărul de cicluri pentru LOW, MEDIUM, HIGH
const uint16_t dispenseTimes[] = {1000, 1000, 1000}; // Timp per ciclu în ms (1 secundă)
#define CYCLE_TIME 1000      // Timp per ciclu în ms

// Variabile globale de sistem
DispenseMode currentMode = MODE_HUMAN;
FoodAmount currentAmount = FOOD_LOW;
uint8_t cooldownIndex = 0;
uint8_t servoActive = 0;
uint8_t cooldownActive = 0;
uint8_t currentCycle = 0;
uint8_t totalCycles = 1;
uint8_t cyclePhase = 0; // 0 = dispensing (open), 1 = closing
2. Algoritmi de control

Sistem de dispensare multi-ciclu:

Control servo pentru SG90 cu Timer1:

Sistem de cooldown dual:

3. Arhitectura sistemului

Mașină de stări:

Interfață utilizator:

Funcții și module implementate

Comunicație I2C:

Driver LCD cu I2C expander (HD44780):

Control servomotor SG90 cu Timer1:

Sistem multi-ciclu de dispensare:

Gestionare cooldown:

Interfață utilizator:

Detectare proximitate:

Algoritm principal:

// Configurare Timer1 pentru control servo hardware
void servo_init_hardware(void) {
    // Timer1 Fast PWM Mode cu ICR1 ca TOP
    TCCR1A = (1 << WGM11);           // Fast PWM Mode 14
    TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11); // Prescaler=8
    ICR1 = 39999;                   // TOP pentru 50Hz (20ms perioada)
    
    if (servoActive) {
        // Cicluri de dispensare cu Timer1
        OCR1A = calculate_servo_position(angle);
        TCCR1A |= (1 << COM1A1);    // Enable PWM output
    } else {
        // Servo în repaus - PWM dezactivat
        TCCR1A &= ~(1 << COM1A1);   // Disable PWM pentru economie
    }
}

Caracteristici ale sistemului

Flexibilitate operațională:

Performanță:

Siguranță și robustețe:

Interfață completă:

Sistemul oferă un dispenser automat de hrană complet funcțional, cu control granular al cantității prin sistemul de cicluri multiple și flexibilitate maximă pentru utilizare atât umană cât și pentru animale, prin sistemul dual de cooldown configurable.

Cod sursă

Link Github: https://github.com/Dratopia18/Dispensor-de-Mancare-Multipurpose

Jurnal

28.04.2025

29.04.2025

30.04.2025

05.05.2025

07.05.2025

08.05.2025

11.05.2025

12.05.2025

14.05.2025

17.05.2025

21.05.2025

23.05.2025

25.05.2025

26.05.2025

27.05.2025

Rezultate

Dispensorul este capabil sa dea mancare pentru pisica mea. Nu e perfect (se mai intampla ca trapa sa nu se miste la capacitate maxima daca e blocata o bobita pe sub ea), dar in principal:

Timpul petrecut: