Hühner Klappe ESP8266
Obliczymy ostateczną cenę na podstawie wybranego pliku. Sprawdzisz ją i zaakceptujesz przed płatnością.
Zapisane na tym urządzeniu.
Automatische Hühnerklappe Steuerung über einen ESP8266 D1 mini mit Telegramm Steuerung
- Ocena
- 0 / 5
- Polubienia
- 6
- Pobrania
- 33
- Wydruki
- 0
- Wyświetlenia
- 315
- Oceny
- 0
Aktualizacja u źródła:
Informacje o modelu
- Źródło
- Printables
- Kategoria
- Animals
- Licencja
- 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, "");
}