Haustierfütterautomat für Wellensittiche, Hamster, Meerschweinchen usw. mit Zeitsteuerung und Arduino oder ESP mit PET-Flasche als Behälter 3D Printer File Image 1
Haustierfütterautomat für Wellensittiche, Hamster, Meerschweinchen usw. mit Zeitsteuerung und Arduino oder ESP mit PET-Flasche als Behälter 3D Printer File Image 2
Haustierfütterautomat für Wellensittiche, Hamster, Meerschweinchen usw. mit Zeitsteuerung und Arduino oder ESP mit PET-Flasche als Behälter 3D Printer File Image 3
Haustierfütterautomat für Wellensittiche, Hamster, Meerschweinchen usw. mit Zeitsteuerung und Arduino oder ESP mit PET-Flasche als Behälter 3D Printer File Image 4
Haustierfütterautomat für Wellensittiche, Hamster, Meerschweinchen usw. mit Zeitsteuerung und Arduino oder ESP mit PET-Flasche als Behälter 3D Printer File Thumbnail 1
Haustierfütterautomat für Wellensittiche, Hamster, Meerschweinchen usw. mit Zeitsteuerung und Arduino oder ESP mit PET-Flasche als Behälter 3D Printer File Thumbnail 2
Haustierfütterautomat für Wellensittiche, Hamster, Meerschweinchen usw. mit Zeitsteuerung und Arduino oder ESP mit PET-Flasche als Behälter 3D Printer File Thumbnail 3
Haustierfütterautomat für Wellensittiche, Hamster, Meerschweinchen usw. mit Zeitsteuerung und Arduino oder ESP mit PET-Flasche als Behälter 3D Printer File Thumbnail 4

Haustierfütterautomat für Wellensittiche, Hamster, Meerschweinchen usw. mit Zeitsteuerung und Arduino oder ESP mit PET-Flasche als Behälter

joshi3D avatarjoshi3D

April 10, 2025

printables-icon

Description

Der Fütterungsautomat kann kleines Futter zeitgesteuert, z.B. jeden Tag um 18:00 Uhr, ausgeben. Dazu wird ein Servo, ein auf dem DS1307-Chip-basierendes RTC-Modul und ein Microcontroller (egal welcher, hauptsache I2C-fähig) benötigt. 

Teileliste:

-Servo 9g                                                                                                                                                   -RTC-Modul mit I2C auf DS1307 basierend                                                                                         -Arduino (z.B. Uno) oder ESP (z.B. ESP32)

 

3D-Druck: 

Alle Teile werden ohne Stützstruktur gedruckt, bei Teil 3 und 4 empfehle ich einen Brim. Als Material ist hier PLA völlig ausreichend. Für Teil 3 und 4 gibt es eine dünne und eine dicke Version. Wähle nach der Größe deines Futters.

Montage:

  1. Schraube Teil 1 an die Wand oder an ein Brett.
  2. Stecke Teil 4 auf Teil 3. 
  3. Setze Teil 3-4 mit der Nase in die Aussparung an Teil 1 und fixiere es mit einer Schraube (Loch durch Teil 1 vorhanden) oder Leim, z.B. Heiß- oder Kunststoffkleber.
  4. Setze den Servo in Teil 1.
  5. Stecke Teil 2 auf den Servo.

 

Hardware: 

Die Hardware wird wie folgt verkabelt: 

Als Microcaontroller kannst du einen beliebigen mit I2C verwenden. Ich habe einen Arduino Uno benutzt.

Code: 

Im Code ist folgendes enthalten: 

  • Die Zeit wird abgefragt.
  • Bei 18:00 Uhr (oder einer anderen vorprogrammierten Zeit) gibt es eine serielle Meldung.
  • Der Servo reagiert und öffnet und schließt sich kurz.

Du kannst meinen Code auf deine Vorstellungen und auf deinen Microcontroller anpassen. 

// CONNECTIONS:
// DS1307 SDA --> SDA
// DS1307 SCL --> SCL
// DS1307 VCC --> 5v
// DS1307 GND --> GND
#include <Servo.h>

#include <Wire.h>
#include <RtcDS1307.h>
Servo myservo;
int val;

RtcDS1307<TwoWire> Rtc(Wire);

bool wasError(const char* errorTopic = "")
{
    uint8_t error = Rtc.LastError();
    if (error != 0)
    {
        Serial.print("[");
        Serial.print(errorTopic);
        Serial.print("] WIRE communications error (");
        Serial.print(error);
        Serial.print(") : ");

        switch (error)
        {
        case Rtc_Wire_Error_None:
            Serial.println("(none?!)");
            break;
        case Rtc_Wire_Error_TxBufferOverflow:
            Serial.println("transmit buffer overflow");
            break;
        case Rtc_Wire_Error_NoAddressableDevice:
            Serial.println("no device responded");
            break;
        case Rtc_Wire_Error_UnsupportedRequest:
            Serial.println("device doesn't support request");
            break;
        case Rtc_Wire_Error_Unspecific:
            Serial.println("unspecified error");
            break;
        case Rtc_Wire_Error_CommunicationTimeout:
            Serial.println("communications timed out");
            break;
        }
        return true;
    }
    return false;
}

void setup () 
{
    Serial.begin(115200);

    myservo.attach(9);
    myservo.write(20);

    Serial.print("Kompiliert am: ");
    Serial.print(__DATE__);
    Serial.print(" ");
    Serial.println(__TIME__);

    Rtc.Begin();
#if defined(WIRE_HAS_TIMEOUT)
    Wire.setWireTimeout(3000 /* us */, true /* reset_on_timeout */);
#endif

    RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
    printDateTime(compiled);
    Serial.println();

    if (!Rtc.IsDateTimeValid()) 
    {
        if (!wasError("setup IsDateTimeValid"))
        {
            Serial.println("RTC-Zeit ungültig, setze Zeit auf Kompilierzeit.");
            Rtc.SetDateTime(compiled);
        }
    }

    if (!Rtc.GetIsRunning())
    {
        if (!wasError("setup GetIsRunning"))
        {
            Serial.println("RTC war nicht aktiv, starte jetzt.");
            Rtc.SetIsRunning(true);
        }
    }

    RtcDateTime now = Rtc.GetDateTime();
    if (!wasError("setup GetDateTime"))
    {
        if (now < compiled)
        {
            Serial.println("RTC-Zeit ist älter als Kompilierzeit, aktualisiere...");
            Rtc.SetDateTime(compiled);
        }
        else if (now > compiled)
        {
            Serial.println("RTC-Zeit ist aktueller als Kompilierzeit – alles OK.");
        }
        else
        {
            Serial.println("RTC-Zeit entspricht exakt der Kompilierzeit – OK.");
        }
    }

    Rtc.SetSquareWavePin(DS1307SquareWaveOut_Low); 
    wasError("setup SetSquareWavePin");
}

void loop () 
{
    if (!Rtc.IsDateTimeValid()) 
    {
        if (!wasError("loop IsDateTimeValid"))
        {
            Serial.println("RTC hat Vertrauen in die Zeit verloren!");
        }
    }

    RtcDateTime now = Rtc.GetDateTime();
    if (!wasError("loop GetDateTime"))
    {
        printDateTime(now);

        // Prüfen ob es 18:00 ist
        if (now.Hour() == 18 && now.Minute() == 0)
        {
            Serial.println(">>> Es ist genau 18:00!");
            myservo.write(15);
            delay(500);
            myservo.write(90);
            delay(450);
            myservo.write(15);
            delay(59000);
        }
        else
        {
            Serial.println("Es ist NICHT 18:00.");
        }

        Serial.println(); // Leerzeile zur besseren Lesbarkeit
    }
    myservo.write(15);
    delay(1000); // alle 10 Sekunden
   
}

#define countof(a) (sizeof(a) / sizeof(a[0]))

void printDateTime(const RtcDateTime& dt)
{
    char datestring[26];

    snprintf_P(datestring, 
            countof(datestring),
            PSTR("%02u.%02u.%04u %02u:%02u:%02u"),
            dt.Day(),
            dt.Month(),
            dt.Year(),
            dt.Hour(),
            dt.Minute(),
            dt.Second());

    Serial.print("Aktuelle Zeit: ");
    Serial.println(datestring);
}

 

Das Bild mit dem Hamster ist anhand von meinem Foto KI-generiert.