Arduino Helligkeit und Dunkelheit erkennen lassen

iceman95:
ich soll für die Schule ein Projekt mit Arduino machen. Dafür soll bei Nacht eine Pumpe laufen und bei Tag soll ein Elektromotor einen Verschluss öffnen. Die Schaltung und Programmierung dafür, denke ich, kriege ich hin, aber wie kann ein Arduino kennen, das Tag und das Nacht ist?

Eine Idee wäre, einen Stromkreis über einen LDR laufen zu basteln und den Arduino messen lassen, wie groß die Spannung ist, die ankommt. (Je heller, desto geringer der Widerstand --> große Spannung). Die Frage ist daher, ist so etwas möglich, und wie progammiert man so etwas?

Bei Deinem Anwendungsfall kommt es nicht darauf an, dass die Messung schnell sein muss, daher reicht im Prinzip eine einzelne trickreich angesteuerte LED, um die Helligkeit zu messen. Siehe Playground:
http://playground.arduino.cc/Learning/LEDSensor

Ich habe das mal etwas umgeschrieben, so dass die Helligkeitsmessung als Funktion verfügbar wird:

/* Arduino-Lichtmessung mit LED von 'jurs' für das Deutsche Arduino Forum
   Benötigte Hardware: Eine LED beliebiger Farbe (vorzugsweise weiß)
   Die LED wird bei diesem Versuch NICHT leuchten, sondern in Sperrrichtung betrieben.
   Sie wird wie ein "Kondensator" aufgeladen, der sich je nach Lichtstärke schneller
   oder langsamer entlädt. 
*/
#define LED_ANODE 6    // Anode = LED lAnger Draht
#define LED_KATHODE 7  // Kathode = LED Kurzer Draht
#define MAXCOUNTER 100000 // je größer diese Zahl, desto "dunklere" Messwerte sind möglich

void setup()
{
  Serial.begin(9600);
}

long helligkeit()
{
  // Funktion zur Helligkeitsmessung mit LED
  // große Zahlen = kleine Helligkeit
  // kleine Zahlen = große Helligkeit
  // die tatsächlichen Zahlen sind von der verwendeten LED (und der Helligkeit) abhängig
  long counter;
  // LED in Sperrrichtung "aufladen"
  pinMode(LED_ANODE,OUTPUT);
  digitalWrite(LED_ANODE,LOW); // Die LED Anode LOW setzen
  pinMode(LED_KATHODE,OUTPUT);
  digitalWrite(LED_KATHODE,HIGH); // Die LED Kathode ganz kurz auf HIGH setzen zum "Aufladen"
  pinMode(LED_KATHODE,INPUT); // Kathode hochohmig von der Stromversorgung abtrennen
  digitalWrite(LED_KATHODE,LOW);  // den internen PullUp-Widerstand abschalten
  // nun in einer Zählschleife "entladen", bis an der Kathode ein LOW gemessen wird
  for ( counter=0; counter<100000L; counter++) {
    if ( digitalRead(LED_KATHODE)==LOW) break; // Bei erfüllter break-Bedingung ist die LED entladen
  }
  return counter;
}

void loop()
{
  long messwert=helligkeit();
  Serial.print("Helligkeit: ");
  Serial.println(messwert);
  delay(500);
}

Beim Erstellen Deiner Hell/Dunkel-Anwendung mußt Du aufpassen, dass Du nicht einfach nur eine Schaltschwelle bei einem festen Wert vorsiehst, das ist eine FALSCHE Schaltlogik:

 if (licht>grenzwert)
  schaltedies();
else
  schaltejenes();

Das Problem dabei ist, dass reale Messwerte immer etwas streuen, und genau beim Grenzwert würdest du ein ständiges Hin- und Herschalten bekommen, wenn der Messwert mal über und mal unter dem Grenzwert liegt. D.h. bei Anbruch des Tages bzw. der Nacht könnte es passieren, dass dabei hunderte Male ganz schnell hin und her geschaltet wird.

Deshalb mußt Du eine Schaltlogik mit einer "Hysterese" machen. Das bedeutet, es gibt einen kleinen Bereich Messwerte, bei dem immer der letzte Schaltzustand beibehalten und nicht geschaltet wird. Richtige Schaltlogik:

 if (licht>grenzwert+hysterese)
  schaltedies();
else if (licht<grenzwert-hysterese)
  schaltejenes();

In dem Fall würde immer dann, wenn der Messwert zwischen (grenzwert+hysterese) und (grenzwert-hysterese) schwankt, NICHT geschaltet werden, sondern es bleibt innerhalb dieses Bereiches der letzte Schaltzustand weiter bestehen. Erst bei Über- oder Unterschreiten der Grenzen erfolgt tatsächlich ein Umschalten. Wie groß die Hysterese sinnvollerweise gewählt werden sollte, richtet sich danach, wie stark die Messwerte streuen und wie reaktionsfreudig die Schaltung sein soll.

Natürlich kannst Du auch "richtige" Lichtsensoren zur Lichtmessung verwenden. Aber LEDs hat man ja meistens in der Bastelkiste, so dass man gar nichts extra kaufen muß, um Helligkeit/Dunkelheit zu messen. Außer der Langsamkeit dieser Messungen gibt es ggf. einen weiteren Nachteil, den der Richtungsabhängigkeit: Genau so wie eine LED Licht hauptsächlich "nach oben" abstrahlt, wird bei der Messung per LED hauptsächlich "Licht von oben" gemessen. Aber das ist bei Deinem Anwendungsfall ja vielleicht auch gar nicht so verkehrt.

Viel Spaß beim Lichtmessen und Schalten!

Edit/Nachtrag: Das mit dem Realtime Clock Modul (DS1307 oder für seltenes Nachstellen DS3231) ist natürlich auch eine interessante Option. Man könnte sich z.B. dann je nach Datum die Sonnenaufgangs- und -untergangszeiten (oder Dämmerungszeiten) ausrechnen und Tag und Nacht anhand des Sonnenstands ermitteln. Viele Möglichkeiten.