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

April 10, 2025
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:
- Schraube Teil 1 an die Wand oder an ein Brett.
- Stecke Teil 4 auf Teil 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.
- Setze den Servo in Teil 1.
- 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.