Hühner Klappe ESP8266
We calculate the final price from your selected file. You review and accept it before payment.
Saved on this device.
Automatische Hühnerklappe Steuerung über einen ESP8266 D1 mini mit Telegramm Steuerung
- Rating
- 0 / 5
- Likes
- 6
- Downloads
- 33
- Makes
- 0
- Views
- 315
- Reviews
- 0
Updated at source:
Model information
- Source
- Printables
- Category
- Animals
- License
- Creative Commons — Attribution — Noncommercial
Automatische Hühnerklappe
Die Klappe habe ich aus 3mm Sperholz ausgelasert, kann aber auch gedruckt werden
Alle gedruckten Teile sind mit PTEG gedruckt, Schichthöhe 0.2mm, Wände 5 Schichten, Infill 20%
Die Steuerung ist über einen ESP8266 in meinem fall ein D1 mini, mit Telegramm Steuerung und Rückmeldungen
ich habe volgenden Servo verwendet
- High-performance digital servo with 22kg stall torque at 6V for 1/10 RC crawlers.
- 360° continuous rotation and core motor for precise control and smooth operation.
- Features reinforced metal gears for durability and reduced noise levels.
- Compatible with a wide voltage range of 4.8V-6.0V, offering speeds of 56rpm to 67rpm.
- Compact dimensions (40x20x28.8mm) and lightweight (50g) for easy installation.
Die Wlan Anbindung ist für Telegramm, aktuelle Zeit, Sonnen auf und untergangs Zeit.
Befehle via Telegram:
- /status → Zeigt "Klappe offen/geschlossen, lokale Zeit, Sonnen Auf Untergang UTC"
- Auf → Klappe manuell öffnen
- Zu → Klappe manuell schließen
Meldungen via Telegram:
- Klappe geschlossen
- Klappe geöffnet
- Unbekannter Befehl (wenn ein Befehl geschickt wird der nicht bekannt ist )
Im Cood müssen folgende Daten Eingetragen Werden
- Ersetze DEIN_SSID und DEIN_PASSWORT
- Setze DEIN_BOT_TOKEN (von @BotFather)
- Setze DEINE_CHAT_ID (z. B. über https://api.telegram.org/bot<BOT_TOKEN>/getUpdates)
- Ersetze Standortdaten
Im Cood können folgende Parameter geändert Werden
- Pin an dem der Servo angeschlossen wird
- Die verzögerung zum herunterfahren
- Servo Zeit hoch
- Servo Zeit runter
- Befehl um den Status abzurufen
- Befehl zum Öffnen
- Befehl zum schließen
Automatische Öffnungszeit mit Sonnenaufgang
Verschlusszeit 30 Minuten nach Sonnenuntergang
Viel Spaß beim nachbauen
Der Cod zum einfügen
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
#include <Servo.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
#include <TimeLib.h>
#include <Timezone.h>
// WLAN-Zugangsdaten
const char* ssid = "DEIN_SSID"; //Ersetzen
const char* password = "DEIN_PASSWORT"; //Ersetzen
// Telegram Bot-Zugangsdaten
const char* botToken = "DEIN_BOT_TOKEN"; //Ersetzen
const String chat_id = "DEINE_CHAT_ID"; //Ersetzen
// Standortdaten
const float latitude = 51.0459; // Ersetzen
const float longitude = 7.0192; // Ersetzen
// Servo
Servo myservo;
const int servoPin = D4; // Pin an dem der Servo angeschlossen wird
// Zeit & Telegram
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 0, 60000); // UTC-Zeit
WiFiClientSecure secured_client;
UniversalTelegramBot bot(botToken, secured_client);
// Zeitzone Deutschland (MEZ/MESZ)
TimeChangeRule MESZ = { "MESZ", Last, Sun, Mar, 2, 120 }; // UTC+2
TimeChangeRule MEZ = { "MEZ", Last, Sun, Oct, 3, 60 }; // UTC+1
Timezone germany(MESZ, MEZ);
int sunriseHour, sunriseMinute, sunsetHour, sunsetMinute;
bool flapClosed = true;
int lastUpdateDay = -1;
void sendTelegramMessage(String text);
String getFlapStatus();
void openFlap();
void closeFlap();
void checkTelegramMessages();
void getSunriseSunset();
void setup() {
Serial.begin(115200);
myservo.attach(servoPin);
myservo.write(90); // Neutralstellung
WiFi.begin(ssid, password);
secured_client.setInsecure();
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Verbindung wird hergestellt...");
}
Serial.println("WLAN verbunden.");
timeClient.begin();
getSunriseSunset();
sendTelegramMessage("ESP gestartet. Aktueller Status: " + getFlapStatus());
}
void loop() {
timeClient.update();
checkTelegramMessages();
time_t utc = timeClient.getEpochTime();
time_t localTime = germany.toLocal(utc);
int currentHour = hour(localTime);
int currentMinute = minute(localTime);
int currentDay = day(localTime);
// Täglicher Abruf um 3:00 Uhr morgens
if (currentHour == 3 && lastUpdateDay != currentDay) {
getSunriseSunset();
lastUpdateDay = currentDay;
Serial.println("Sonnenzeiten wurden um 3 Uhr neu abgerufen.");
}
// Vergleich mit Sonnenaufgang (UTC!)
time_t nowUTC = timeClient.getEpochTime();
int nowHourUTC = hour(nowUTC);
int nowMinuteUTC = minute(nowUTC);
// Öffnen bei Sonnenaufgang (UTC)
if (nowHourUTC == sunriseHour && nowMinuteUTC == sunriseMinute && flapClosed) {
openFlap();
}
// Schließen 45 Min nach Sonnenuntergang (UTC)
int targetCloseHour = sunsetHour;
int targetCloseMinute = sunsetMinute + 30; //+ 30 ist die verzögerung zum herunterfahren
if (targetCloseMinute >= 60) {
targetCloseHour += targetCloseMinute / 60;
targetCloseMinute %= 60;
}
if (nowHourUTC == targetCloseHour && nowMinuteUTC == targetCloseMinute && !flapClosed) {
closeFlap();
}
delay(10000);
}
void getSunriseSunset() {
if (WiFi.status() != WL_CONNECTED) return;
WiFiClient client;
HTTPClient http;
String url = "http://api.sunrise-sunset.org/json?lat=" + String(latitude, 6) + "&lng=" + String(longitude, 6) + "&formatted=0";
http.begin(client, url);
int httpCode = http.GET();
if (httpCode == 200) {
String payload = http.getString();
DynamicJsonDocument doc(2048);
deserializeJson(doc, payload);
String sunrise = doc["results"]["sunrise"];
String sunset = doc["results"]["sunset"];
sunriseHour = sunrise.substring(11, 13).toInt();
sunriseMinute = sunrise.substring(14, 16).toInt();
sunsetHour = sunset.substring(11, 13).toInt();
sunsetMinute = sunset.substring(14, 16).toInt();
Serial.printf("Sonnenaufgang (UTC): %02d:%02d, Sonnenuntergang (UTC): %02d:%02d\n", sunriseHour, sunriseMinute, sunsetHour, sunsetMinute);
} else {
Serial.println("Fehler beim Abruf der Sonnenzeiten");
}
http.end();
}
void openFlap() {
myservo.write(0);
delay(5000); //Einstellung Servo Zeit hoch
myservo.write(90);
flapClosed = false;
sendTelegramMessage("Klappe geöffnet");
}
void closeFlap() {
myservo.write(180);
delay(4000); //Einstellung Servo Zeit runter
myservo.write(90);
flapClosed = true;
sendTelegramMessage("Klappe geschlossen");
}
String getFlapStatus() {
time_t utc = timeClient.getEpochTime();
time_t localTime = germany.toLocal(utc);
String status = flapClosed ? "Klappe: geschlossen\n" : "Klappe: offen\n";
status += "Uhrzeit (lokal): " + String(hour(localTime)) + ":" + (minute(localTime) < 10 ? "0" : "") + String(minute(localTime)) + "\n";
status += "Sonnenaufgang (UTC): " + String(sunriseHour) + ":" + (sunriseMinute < 10 ? "0" : "") + String(sunriseMinute) + "\n";
status += "Sonnenuntergang (UTC): " + String(sunsetHour) + ":" + (sunsetMinute < 10 ? "0" : "") + String(sunsetMinute);
return status;
}
void checkTelegramMessages() {
int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
while (numNewMessages) {
for (int i = 0; i < numNewMessages; i++) {
String text = bot.messages[i].text;
String from = bot.messages[i].from_id;
if (from != chat_id) continue;
if (text == "/status") { //Befehl um den Status abzurufen
bot.sendMessage(chat_id, getFlapStatus(), "");
} else if (text == "Auf") { //Befehl zum Öffnen
openFlap();
} else if (text == "Zu") { // Befehl zum schließen
closeFlap();
} else {
bot.sendMessage(chat_id, "Unbekannter Befehl", "");
}
}
numNewMessages = bot.getUpdates(bot.last_message_received + 1);
}
}
void sendTelegramMessage(String text) {
bot.sendMessage(chat_id, text, "");
}