1 / 9
Hühner Klappe ESP8266 — zdjęcie 1
1 / 9

Hühner Klappe ESP8266

Zamów wydruk tego modelu

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 

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

}