Tagesverlauf erkennen - Helligkeitsteuerung

Hallo!

Ich wollte mal fragen, ob jemand eine Möglichkeit kennt, mit einem Fotowiderstand zu erkennen, wann es Morgens ist und wann es Abend ist.
Dafür soll aber keine RTC verwendet werden (müssen).
Es soll eine Klappe Morgens auf uns Abends geschlossen werden.
Durch etwas ausprobieren habe ich diese Werte ermittelt:
Wenn Helligkeit unter 450 dann Abend
Helligkeit über 500 Morgens
Helligkeit über 700 Tag
Zusätzlich frage ich zwei Endschalter ab. Ist die Klappe zu und es wird heller >500 dann geht die Klappe auf.
Ist die Klappe auf und es wird dunkler <450 geht die Klappe zu.

Nun möchte ich aber mit zwei Tastern die Klappe von Hand auf und zu machen können und dafür müsste ich die “Tag Nacht” Erkennung in dem Fall überspringen.
Schließe ich die Klappe am Tag, und es wird dunkler, komme ich zwangsläufig zu dem Wert für Morgens, da die Klappe unten ist, geht diese natürlich wieder hoch.
Habe versucht da noch eine Variable einzubauen (wenn Taster gedrückt wurde) aber ich blicke grad selber nicht mehr durch. Diese muss ja auch wieder zurück gesetzt werden…aber erst morgens…ein Teufelskreis :wink:

Deshalb nun meine Frage, ob es eine Möglichkeit gibt, zu erkennen, ob es Morgen ist oder Abend. Man müsste den Helligkeitswert eine Zeit “beobachten” und sehen ob es dunkler oder heller wird, mit etwas Toleranz damit z.B. Wolken das ganze nicht durcheinander bringen.
Jemand eine Idee ?
Wenn das zu aufwendig ist, muss ich wohl doch ein RTC Modul einbauen.

Hi,

überleg Dir das mit der RTC nochmal… kosten nicht die Welt.

Ein sehr geschätzter User hat eine RTC mit sunset sunrise Funktion hier im Forum gepostet incl. MEZ/MESZ Umschaltung - da hast Du alles was Du brauchst…

Ja ja, der Jurs hats drauf.

C.U. Chris

wie oft erfasst du die Helligkeit. z.B. 1 mal je Minute, dann einen gleitenden Mittelwert über 10 Messungen bilden, bei steigender Helligkeit Morgen, bei fallend Helligkeit Abend.

Habs mal rausgekramt:

Post #11

Keine weiteren Libs benötigt, alles wird berechnet, kein LDR benötigt.

Ich wollte kein RTC weil ich nicht mehr viel Platz im Gehäuse habe.
Aber ich habe mir jetzt mal ins bestellt, kommt auch in einigen Tagen an.
Ist ja immer so ein Problem, meistens ist das ja aus China.

Die Helligkeit wird durchgehend erfasst, habe in der loop nur ein delay(100).

Aber wie gesagt, das wird mir jetzt schon etwas zu kompliziert (bin nicht so der Profiprogrammierer) und die ganzen "if" Abfragen nehmen langsam überhand.
Also dann doch RTC !
Danke trotzdem...das war dann mal ein schnell Posting mit schnell Lösung :slight_smile:

Loschder:
Habs mal rausgekramt:

http://forum.arduino.cc/index.php?topic=313942.0

Post #11

Keine weiteren Libs benötigt, alles wird berechnet, kein LDR benötigt.

Ok, danke. Schaue ich mir mal an. Die LDR ist aber schon eingebaut...mal sehen ob ich die noch nutzen werde. Wenn es richtig bewölkt ist, darf es nämlich auch was später sein.

Captain-DJ:
Ich wollte mal fragen, ob jemand eine Möglichkeit kennt, mit einem Fotowiderstand zu erkennen, wann es Morgens ist und wann es Abend ist.

Ist die Klappe zu und es wird heller >500 dann geht die Klappe auf.
Ist die Klappe auf und es wird dunkler <450 geht die Klappe zu.

Was bedeutet “Morgen” und “Abend”? Die Helligkeitswerte sind da wohl wenig zuverlässig, weil der “Morgen-Wert” Ende Juni bei klarem Himmel vielleicht schon kurz vor 4 Uhr erreicht wird. Im Dezember bei dicker Wolkendecke vielleicht erst um 10 Uhr (oder gar nicht). Ist das für die Hühner (?) OK? Ich habe keinerlei praktische Erfahrung mit Federvieh :slight_smile:

Ich würde ganz klar für eine RTC plädieren (DS3231) und für die Sonnenauf-/Untergangsberechnung die Loschder in #3 vorgeschlagen hat (oder etwas Ähnliches).

Falls dir der Code zu kompliziert ist, kann man auch einfach eine Tabelle mit den Sonnenauf- und Untergangswerten anlegen (ein Wert pro Woche sollte reichen) und mit dem jeweiligen Datum der RTC vergleich.

Eine Liste mit Sonnenauf- und Untergangswerten für deinen Ort gibt es beim nächstgelegenen Flugplatz oder im Netz, z.B.:
https://www.sonnenaufgang-sonnenuntergang.de/
http://www.sunearthtools.com/dp/tools/pos_sun.php?lang=de

Hi

Was passiert mit den Viechern (ich gehe von Hühnern und einer anzusteuernden Hühnerklappe aus) bei einer Sonnenfinsternis?
Gehen Die dann auch Schlafen?

Dem Fuchs wird diese Dunkelheit ähnlich ‘spanisch’ vorkommen, weshalb Dieser wohl noch nicht auf Hühner-Suche, sondern erst später zu erwarten ist.

Je nachdem, wie bescheiden das Wetter ist - sind die Hühner dann auch vor Sonnenuntergang drin?
Also wirklich Helligkeitsabhängig?!?

Ist es dann nötig, die Klappe ‘vor der Zeit’ zu schließen?

Was passiert, wenn die Klappe offen bleibt (dieses Mal ohne Fuchs) - bleiben die Hühner im Stall?

Dann kannst Du Alles stur von der Uhrzeit abhängig machen - netter Nebeneffekt: der Sonne ist MEZ oder MESZ vollkommen wurscht, dadurch kommt Die weder früher noch später - könntest Dir also diesen Ballast schenken.
Den Hühner ebenso … noch kein Huhn mit Rolex gesehen :wink:

MfG

Captain-DJ:
Ich wollte kein RTC weil ich nicht mehr viel Platz im Gehäuse habe.

Es gibt auch sehr kleine RTC's schau mal nach RTC-for-Pi

Es geht um Laufenten, aber egal ob Enten oder Hühner, die gehen nun mal nicht nach der Uhr.
Hühner gehen selber in den Stall, wenn es dunkel wird.
Ob die das auch bei einer Sonnenfinsternis machen weiß ich nicht :wink:

Hühner sind da sehr selbständig. Sitzen im Stall und man braucht nur noch die Türe zu machen...unsere Enten sind da (noch) nicht so weit.
Mal sehen wie das wird.

Dicke Wolken machen jetzt nicht so viel aus. Also das die Hühner mal Tagsüber im Stall waren habe ich so noch nicht gesehen. Aber ich habe auch nicht die Langzeiterfahrung.

LDR und Helligkeit ist ja ok. Nur wollte ich die Klappe auch von Hand auf und zu machen können.
Wenn ich nun die Klappe etwas früher zu mache, kommt meine "Erkennung" zum tragen (nach einer gewissen Pause um z.B. kurze Fremdbeleuchtung zu überspringen) und die Klappe geht wieder auf, weil es vielleicht noch nicht dunkel genug war für die Automatik. Das wurde mir aber alles etwas zu kompliziert, sagte ja, das ich nicht so der Programmierer bin.

Ich hatte noch ein RTC hier rum liegen, sollte eigentlich wo anders eingebaut werden, das muss nun warten (erst mal die Ladeelektronik lahm legen, weil die KIK CR2032 es nicht mag geladen zu werden...wisst ihr das wohl fast alle DS3231 falsch beschaltet sind?).
Damit arbeite ich nun nach Helligkeit und nach Uhrzeit. Alles was nach 8 und vor 12 ist, ist Morgen (mit dem entsprechenden Helligkeitswert) und ab 17 Uhr ist Abend mit entsprechendem Helligkeitswert.

Sieht schon mal gut aus, muss den RTC noch installieren und dann testen.
Bei Hühnern hätte ich gesagt, ja das funktioniert so, die Enten sind da etwas eigen.
Zur Not lasse ich die Klappe nur morgens auf gehen. Das ist schon mal eine gute Sache, wenn niemand zu Hause ist.
Bei Enten muss nur ein Brett oder irgend was liegen, dann sind die schon am meckern und wollen nicht in ihr Häuschen :smiley:

Du solltest den Enten sagen, sie sind Hühner :wink:

Und nein, die RTCs sind nicht falsch beschaltet, die meisten haben nur eine Batterie statt eines Akkus.

Und deine Wahl mit der RTC ist schon ok, evtl. kannst du ja eine Verknüpfung mit der Helligkeit programmieren.

und ich bin immer noch pro LDR:

"Deaktiviere" einfach nach einer manuellen Klappenöffnung für ein paar Stunden den LDR-DUNKEL-AUTOMATIK-MACHT-AUF bzw.
umgekehrt beim manuellen schließen deaktivierst du für ein paar Stunden das LDR-HELL-AUTOMATIK-MACHT-AUF

@HotSystems
Ok, falsch beschaltet war falsch ausgedrückt. Da gehört ein Akku rein, aber der wird auch nicht richtig geladen, denn da liegen 5V an, was zu viel ist.
Und ein Akku soll wohl nicht lange laufen, eine CR2032 soll wohl dagegen Jahr(e) funktionieren...keine Ahnung. Hab die Leiterbahn durchtrennt, damit wird nichts mehr geladen und gut ist.

@noiasca
Ja, theoretisch hast du natürlich recht.
Das hatte ich auch so vor, habs aber leider nicht hin bekommen. Mein Programm ist dafür etwas zu verschachtelt sage ich mal.
Aber egal, habe nun eine Kombination aus Uhrzeit und Helligkeit was eigentlich optimal ist.

Hi

In wie fern verschachtelt?
Du hast doch 'nur' vier Zustände:

  • Klappe AUF, durch Automatik
  • Klappe AUF, durch Hand
  • Klappe ZU, durch Automatik
  • Klappe ZU, durch Hand

Bei den Automatik-Bereichen bewirkt der LDR und/oder die Uhr, wann umgeschaltet wird.
Zusätzlich ist es möglich, auf HAND umzuschalten (ggf. auch von Auto-AUF nach Hand-AUF).

Für die Umschaltung musst Du quasi aus der Helligkeit/der Uhrzeit Flanken ableiten - dann kann Dir eine bestehende Dunkelheit das Tor nicht erneut zu fahren.
Gleiches bei der Uhr, damit Du je nur einen Programmdurchlauf hast, in Dem es 'jetzt gerade spät genug ist'.
Wenn Da keine Automatik aktiv war, greift Diese heute auch nicht mehr.

Verständlich?

MfG

Verschachtelt deshalb, weil ich für Dinge wie:
Motor hoch, Motor runter, Motor Stop unten, Motor Stop oben… eigene Funktionen erstellt habe, sozusagen sind das ja Unterprogramme.
Nur komm ich dann so langsam an meine Grenzen und irgend was beeinflusst sich dann.
So entstehen dann solche langen IF abfragen:

if (abend == 1 && pos != 2 && Taster_Hoch != HIGH && Taster_Runter != HIGH)

Ich denke ich zeige mal mein verwurschteltes Programm:

/*
 * 2 Tastern für manuell Hoch/Runter 
 * Beide Tasten = Notaus
 * 
 * Jetzt mit RTC 
 * 
  VCC -> Arduino 5V
  GND -> Arduino GND
  SCL -> SCL or A5
  SDA -> SDA or A4
 */

#include <Wire.h>
#include "Sodaq_DS3231.h"

// Pins

int led_oben = 2;  // LED Position oben
int led_unten = 3;  // LED Position unten
int sensor = A0;  // LDR
int pin_schalter_oben = 5;  //Endschalter oben
int pin_schalter_unten = 6;  // Endschalter unten
int motorLED = 13;  // Nur eine LED zur Kontrolle
int up = 8; // Taster für hoch
int down = 9; // Taster für runter
int LED_Licht = 11; // LED Innenlicht

//Pins für L298N
int inA = 7;  // Richtung mit LOW und HIGH
int inB = 12; // Richtung mit LOW und HIGH
int pin_m_speed = 10;  //PWM 


int schalter_oben = 0; // Endschalter oben
int schalter_unten = 0; // Endschalter unten
int helligkeit = 0;
int motor_an = 0;  // wird nicht verwendet
int abend = 2;  // 1=Abend / 0=Morgen / 2=Tag
int anlauf = 0;
int motorzaehler = 0;  
int Taster_Hoch = 0;
int Taster_Runter = 0;
//int Taster_druck = 0; // irgend ein Taster gedrückt
int Richtung = 0; // Zur Kontrolle per serieller Ausgabe

// Einstellungen
int m_speed = 250; // Geschwindigkeit
int anp_runter = 80;  // Anpassung runter = Geschwindigkeit minus dies Zahl für runter
int motordauer = 60;  // Zeit zum öffnen und schließen
int anlauf_versuche = 10;  // Motor zieht kurz an (Programmbedingt) und Stoppt wieder. Anzahl der Versuche
long verzoegZaehler = 0;
int pos = 0;  // 2 = unten  1 = oben
int verzoeg = 1200;  // 1200 = ca. 2 Minuten - Verzögerung bei Helligkeitsänderung 50 = 5 Sekunden 
int hellMorgen = 500;  //  Werte für Helligkeit
int hellTag = 700;
int hellAbend = 470;
int hellLED = 500; // LED leuchten erst < diesem Wert


//  Seriell aus oder an ------------------------

int seriell = 1;

//-----------------------------------------------------------------


void setup() {
  if (seriell == 1){
  Serial.begin(115200);
  }
    Wire.begin();
    rtc.begin();  
    
  pinMode(motorLED, OUTPUT);
  pinMode(led_oben, OUTPUT);
  pinMode(led_unten, OUTPUT);
  //pinMode(led_stoerung, OUTPUT);  // Über die zwei LED gelöst
  pinMode(pin_schalter_oben, INPUT);
  pinMode(pin_schalter_unten, INPUT);
  pinMode(inA, OUTPUT);
  pinMode(inB, OUTPUT);
  pinMode(pin_m_speed, OUTPUT);
  pinMode(up, INPUT);
  pinMode(down, INPUT);
  pinMode(LED_Licht, OUTPUT);
}


void motor_runter(){
  digitalWrite (motorLED, HIGH);
  digitalWrite(inA, HIGH);
  digitalWrite(inB, LOW);
  analogWrite(pin_m_speed, m_speed- anp_runter);
  Richtung = 1;
  delay(40);  // kurze Pause zum wegfahren vom Endschalter
  motor_an = 1;
  motorzaehler++;
  verzoegZaehler = 0;
  if (schalter_oben == HIGH) {   //wenn Motoar anläuft aber Endschalter an bleibt, irgend was blockiert z.B.
    anlauf++;
  }
  
  if (schalter_unten == LOW && schalter_oben == LOW) {
    anlauf = 0;
  }
}

void motor_hoch(){
  digitalWrite (motorLED, HIGH);
  digitalWrite(inA, LOW);
  digitalWrite(inB, HIGH);
  analogWrite(pin_m_speed, m_speed);
  Richtung = 2;
  delay(40);  // kurze Pause zum wegfahren vom Endschalter
  motor_an = 1;
  motorzaehler++;
  verzoegZaehler = 0;
  if (schalter_unten == HIGH) {  //wenn Motoar anläuft aber Endschalter an bleibt, irgend was blockiert z.B.
    anlauf++;
  }
  if (schalter_unten == LOW && schalter_oben == LOW) {
    anlauf = 0;
  }
}


void motor_stop_oben(){
  digitalWrite (motorLED, LOW);
  
   if (helligkeit < hellLED) {  // LED nur an wenn es dunkel genug ist 
      digitalWrite (led_oben, HIGH);
      digitalWrite (led_unten, LOW);
      digitalWrite (LED_Licht, HIGH);
    }
  digitalWrite(inA, LOW);
  digitalWrite(inB, LOW);
  motor_an = 0;
  Richtung = 22;
  motorzaehler = 0;
  pos = 1;
}

void motor_stop_unten(){
  digitalWrite (motorLED, LOW);
  digitalWrite (LED_Licht, LOW);
    if (helligkeit < hellLED) {  // LED nur an wenn es dunkel genug ist 
  digitalWrite (led_unten, HIGH);
  digitalWrite (led_oben, LOW);
    }
  digitalWrite(inA, LOW);
  digitalWrite(inB, LOW);
  motor_an = 0;
  Richtung = 11;
  motorzaehler = 0;
  pos = 2;
}

void motor_stoerung(){
  digitalWrite (motorLED, LOW);
  digitalWrite (LED_Licht,LOW);
  digitalWrite(inA, LOW);
  digitalWrite(inB, LOW);
  Richtung = 99;
  delay(1000);
  
  for (int x=0; x<=10; x++){  // Bleibt in der Schleife, es sei denn Taster werden noch mal gedrückt
    Taster_Hoch = digitalRead(up);
    Taster_Runter = digitalRead(down);
    
    digitalWrite (led_oben, HIGH);
    digitalWrite (led_unten, HIGH);
    delay(200);
    digitalWrite (led_oben, LOW);
    digitalWrite (led_unten, LOW);
    delay(200);
    x=1;
    
    if (Taster_Runter == HIGH && Taster_Hoch == HIGH) {  // Notaus beenden
    x=10;
    anlauf=0;
    motorzaehler = 0;
    delay(1000);
    }
  }
}



void loop() {
  
  DateTime now = rtc.now(); //get the current date-time
  
  helligkeit = analogRead(sensor);
  schalter_unten = digitalRead(pin_schalter_unten);
  schalter_oben = digitalRead(pin_schalter_oben);

  Taster_Hoch = digitalRead(up);
  Taster_Runter = digitalRead(down);

  if (seriell == 1){
  Serial.print ("H: ");
  Serial.print (helligkeit);
  Serial.print (" Schalter oben: ");
  Serial.print (schalter_oben);
  Serial.print (" Schalter unten: ");
  Serial.print (schalter_unten);
  Serial.print (" Abend 0/1/2: ");
  Serial.print (abend);
  Serial.print (" Verz.: ");
  Serial.print (verzoegZaehler);
  Serial.print (" MOTOR: ");
  Serial.print (Richtung);
  Serial.print (" Motorzaehler: ");
  Serial.print (motorzaehler);
  Serial.print (" Pos:");
  Serial.print (pos);
  Serial.print (" Anlauf: ");
  Serial.print (anlauf);
  Serial.print (" / ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.println(now.second(), DEC);
  }

    
  //Abends
  if (helligkeit < hellAbend && now.hour() >= 18){
   verzoegZaehler++; 
   if (verzoegZaehler >= verzoeg) {
   abend = 1;
   verzoegZaehler = 0;
   }
  }
   
   //Morgens
   else if (helligkeit > hellMorgen && now.hour() >= 8 && now.hour() <= 12){
    verzoegZaehler++; 
    if (verzoegZaehler >= verzoeg) {
    abend = 0;
    verzoegZaehler = 0;
    }
   }

    //Tag
   else if (helligkeit > hellTag){
    digitalWrite (LED_Licht, LOW);
    abend = 2;
    verzoegZaehler = 0;
   }


  if (Taster_Runter == HIGH && pos != 2) {     // 2 = unten  1 = oben
  digitalWrite (motorLED, HIGH);
  digitalWrite (LED_Licht,HIGH);
  digitalWrite(inA, HIGH);
  digitalWrite(inB, LOW);
  analogWrite(pin_m_speed, m_speed - anp_runter);
   Richtung = 1;
   anlauf=0;
   verzoegZaehler = 0;
  }

  
  else if (Taster_Hoch == HIGH && pos != 1) {
  digitalWrite (motorLED, HIGH);
  digitalWrite (LED_Licht,HIGH);
  digitalWrite(inA, LOW);
  digitalWrite(inB, HIGH);
  analogWrite(pin_m_speed, m_speed);
  Richtung = 2;
  anlauf=0;
  verzoegZaehler = 0;
  }


 if (abend == 1 && pos != 2 && Taster_Hoch != HIGH && Taster_Runter != HIGH) {
    motor_runter();
    //pos = 0;
  }
 
    
 if (abend == 0 && pos != 1 && Taster_Hoch != HIGH && Taster_Runter != HIGH) {
    motor_hoch();
    //pos = 0;
   }


if (schalter_oben == HIGH && Taster_Runter != HIGH) {
      motor_stop_oben();
    } 

  else if (schalter_unten == HIGH && Taster_Hoch != HIGH) {
      motor_stop_unten();
    }
    
    else   {
    pos = 0;
    digitalWrite (led_unten, LOW);  // LED aus wenn Klappe in Bewegung
    digitalWrite (led_oben, LOW);
    }

 
  if (motorzaehler > motordauer) {
      motor_stoerung();
    }

  if (anlauf > anlauf_versuche) {
      motor_stoerung();
    }

 
  
// Notaus mit beiden Tastern
  if (Taster_Runter == HIGH && Taster_Hoch == HIGH) {
    motor_stoerung();
  }
    
  delay(100);
}

Zur Zeit funktioniert die manuelle Steuerung nur noch, wenn die Klappe auf keinem Endschalter steht. Ansonsten tut sich gar nichts. Kann sein das ich eben beim Einbau der RTC und der LED für Innenbeleuchtung irgend was falsch oder kaputt gemacht habe.
Auf meinem Uno funktioniert es soweit ich das sehen kann. Muss ich morgen noch mal alles abbauen und prüfen :frowning: