Steuerung mit Uhrzeiten von Sonnenaufgang und Sonnenuntergang

Hallo, ich habe folgendes vor:
ich habe eine Automatische Hühnerklappe gebaut und möchte sie nicht mit festen Zeiten steuern sondern mit den Zeiten für Sonnenauf- und Untergang, die man im Internet abfragen könnte.

Zur Steuerung benutze ich ein Wemos D1 Mini (ESP8266) und ich möchte ihn mit seinem eingebauten WiFi Chip mit meinem Netzwerk verbinden und ich habe Ideen gefunden zum schalten über Zeit aber noch nicht so das richtige.

Ich möchte kein RTC Modul verwenden sondern nur Daten aus dem Netz.

Wie würdet ihr das anstellen oder gibt es eine einfachere Lösung für mein Projekt? Die Lösung mit einem Lichtsensor hab ich bisher im Test aber mit Uhrzeiten ist das ganze definitiv sicherer.

Ich bin dankbar für alle Vorschläge und Anregungen.

Gruß Marc

msd:
Die Lösung mit einem Lichtsensor hab ich bisher im Test aber mit Uhrzeiten ist das ganze definitiv sicherer.

Warum soll es mit Uhrzeit sicherer sein ?

Wenn du die Helligkeit auswertest ist das doch ein sicherer Faktor. Was ist daran unsicher ?

Warum kompliziert (aktuelle Werte aus dem Internet), wenn es auch einfach geht... :slight_smile:

Ich habe für ein Projekt, wo der Sonnaufgang eine wesentliche Rolle gespielt hat, einfach eine Tabelle gemacht mit 52 Einrägen (einer für jede Woche - das hat für dieses Projekt gereicht, es könnte eventuell auch für dein Projekt genügen) und einer RTC.
Vorteil: du brauchst keine Internetverbindung, weil die Sonnenauf- und Untergangszeiten sind (abhängig vom jeweiligen Breiten- und Längengrad) ja hinreichend bekannt. :slight_smile:

Übrigens Sommerzeit/Winterzeit spielen keine Rolle, wenn die Uhr auf UTC läuft.
Übrigens: bei jedem Flughafen in deiner Nähe bekommst du eine Tabelle mit UTC-Zeiten von Sonnenauf- und Untergang über den Jahreslauf - weil das für den Sichtflug eine bedeutende Rolle spielt. (Und natürlich auch im Internet). :wink:

Dankeschön, ja das ist eine gute Idee. Ich habe momentan die Steuerung mit einem Lichtsensor im Betrieb und es klappt gut. Da mir weiteres Knowhow im Moment noch fehlt um es anders zu betreiben, lasse ich es erstmal so laufen.

Hallo,

in diesem Thread findest du Routinen zur Berechnung der Sonnenauf-/-untergangszeiten: Sonnen Auf- und Untergang mit dem Arduino berechnen - Deutsch - Arduino Forum

Vielleicht kannst du das in dein Programm integrieren.

Hallo,

wenn die Hühner erst mit dem ersten Sonnenstrahl raus dürfen > Lichtsensor.
Wenn die Hühner zum amtlichen Sonnenaufgang raus dürfen > Zeiten berechnen oder wo abholen.
Warum sollte man sich das überlegen? Weil es auch bedeckten Himmel gibt. :slight_smile:

Bei der Lösung mit dem reinen Lichtsensor ist wäre auch etwas Intelligenz im Programm nötig. Die Hühnerklappe soll ja auch nicht aufgehen nur weil z.b. jemand mal mit ner Taschenlampe rumfuchtelt.

Hallo Marc

ich habe mal vor längerer Zeit mit Hilfe dieses Forums ,ein Programm zur Sonnen Auf- und Untergangsberechnung für den Arduino portiert.
Es errechnet die Auf- und Untergangszeiten auf ca 5Minuten genau.
Wenn Du möchtest kann ich es mal hier reinstellen.

Genau zu diesem Thema habe ich mal einen Blogbeitrag erstellt.

Aber ich bin ehrlich: Ich habe gar keine Hühner ....

Gruß
Reinhard

Hallo

hier die Programmschnipsel die relevant sind fehlt noch was bitte melden es ist schon länger her drum weiß ich nicht mehr so genau wie ich es gelöst habe. bis auf die letzte Anweisung if (Sommerzeit = true) kommt alles noch vor der setup Routine.

Viel Erfolg Rudi

//Sommerzeiterkennung
boolean Sommerzeit;//True wenn Sommerzeit herscht
int Korrektur_Sommerzeit = 1;//dies ist die Stunde die bei Sommerzeit dazugerechnet wird
int hour_Sommerzeit_berichtigt;//Die um die Sommerzeit korigierte Uhrzeit im Winter ist "hour_Sommerzeit_berichtigt" gleich "hour"
int day_Sommerzeit_berichtigt;//ist noetig da bei 23Uhr + Sommerzeit 0Uhr und naechster Tag ausgegeben werden muss

int tzHours = 1;



//Variablen für den Sonnen-auf , -untergang und die Daemmerung
int SonnenaufgangStunde;
int SonnenaufgangMinute;
int SonnenuntergangStunde;
int SonnenuntergangMinute;
boolean Daemmerung;






/dieser Teil diehnt zur Berechnung der Sonnen Auf- und Untergangszeiten
char buf;
int a_stunde, a_minute, u_stunde, u_minute;
double JulianischesDatum ( int Jahr, int Monat, int Tag, int Stunde, int Minuten, double Sekunden )
{
  int   Gregor; // Gregorianischer Kalender
  if (Monat <= 2)
  {
    Monat = Monat + 12;
    Jahr = Jahr - 1;
  }
  Gregor = (Jahr / 400) - (Jahr / 100) + (Jahr / 4); // Gregorianischer Kalender
  return 2400000.5 + 365.0 * Jahr - 679004.0 + Gregor + int(30.6001 * (Monat + 1)) + Tag + Stunde / 24.0 + Minuten / 1440.0 + Sekunden / 86400.0;
}


double InPI(double x)
{
  int n = (int)(x / TWO_PI);
  x = x - n * TWO_PI;
  if (x < 0) x += TWO_PI;
  return x;
}


double BerechneZeitgleichung(double &DK, double T)
{
  double RA_Mittel = 18.71506921 + 2400.0513369 * T + (2.5862e-5 - 1.72e-9 * T) * T * T;

  double M  = InPI(TWO_PI * (0.993133 + 99.997361 * T));
  double L  = InPI(TWO_PI * (  0.7859453 + M / TWO_PI + (6893.0 * sin(M) + 72.0 * sin(2.0 * M) + 6191.2 * T) / 1296.0e3));

  double e = DEG_TO_RAD * (23.43929111 + (-46.8150 * T - 0.00059 * T * T + 0.001813 * T * T * T) / 3600.0);

  double RA = atan(tan(L) * cos(e));
  if (RA < 0.0) RA += PI;
  if (L > PI) RA += PI;

  RA = 24.0 * RA / TWO_PI;

  DK = asin(sin(e) * sin(L));

  // Damit 0<=RA_Mittel<24
  RA_Mittel = 24.0 * InPI(TWO_PI * RA_Mittel / 24.0) / TWO_PI;

  double dRA = RA_Mittel - RA;
  if (dRA < -12.0) dRA += 24.0;
  if (dRA > 12.0) dRA -= 24.0;

  dRA = dRA * 1.0027379;
  return dRA ;
}


void sunCalculation(int year, int month, int day, float longitude, float latitude, byte UTCoffset, int &aStunde, int &aMinute, int &uStunde, int &uMinute)
{
  double JD2000 = 2451545.0;
  double JD = JulianischesDatum(year, month, day, 12, 0, 0);

  double T = (JD - JD2000) / 36525.0;
  double DK;
  double h = -50.0 / 60.0 * DEG_TO_RAD;
  latitude *= DEG_TO_RAD; // geographische Breite

  double Zeitgleichung = BerechneZeitgleichung(DK, T);
  double Minuten = Zeitgleichung * 60.0;
  double Zeitdifferenz = 12.0 * acos((sin(h) - sin(latitude) * sin(DK)) / (cos(latitude) * cos(DK))) / PI;
  double AufgangOrtszeit = 12.0 - Zeitdifferenz - Zeitgleichung;
  double UntergangOrtszeit = 12.0 + Zeitdifferenz - Zeitgleichung;
  double AufgangWeltzeit = AufgangOrtszeit - longitude / 15.0;
  double UntergangWeltzeit = UntergangOrtszeit - longitude / 15.0;

  double Aufgang = AufgangWeltzeit + UTCoffset;         // In Stunden
  if (Aufgang < 0.0) Aufgang += 24.0;
  else if (Aufgang >= 24.0) Aufgang -= 24.0;

  double Untergang = UntergangWeltzeit + UTCoffset;
  if (Untergang < 0.0) Untergang += 24.0;
  else if (Untergang >= 24.0) Untergang -= 24.0;

  aMinute = int(60.0 * (Aufgang - (int)Aufgang) + 0.5);
  aStunde = (int)Aufgang;
  if (aMinute >= 60.0) {
    aMinute -= 60.0;
    aStunde++;
  }
  else if (aMinute < 0.0)
  {
    aMinute += 60.0; aStunde--;
    if (aStunde < 0.0) aStunde += 24.0;
  }

  uMinute = int(60.0 * (Untergang - (int)Untergang) + 0.5);
  uStunde = (int)Untergang;
  if (uMinute >= 60.0) {
    uMinute -= 60.0;
    uStunde++;
  }
  else if (uMinute < 0)
  {
    uMinute += 60.0; uStunde--;
    if (uStunde < 0.0) uStunde += 24.0;
  }

}


//die Abfrage ob Sommerzeit
if (Sommerzeit = true)