1 / 9
Hühner Klappe ESP8266 — image 1
1 / 9

Hühner Klappe ESP8266

Order a print of this model

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

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 

https://amzn.eu/d/7QuIl0o

  • 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

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, "");

}