bei dem piepst es wohl nicht richtig !!!

Hallo zusammen,
darf ich euch mal was fragen?

Der Code soll folgendes machen:

Es soll immer am Abend bei gewünschtem Dämmerungswert ein Piepsen ertönen, damit mein Bruder nicht vergisst die Hühnerstalltüre zuzumachen. Es kam nämlich schon ein paar mal der böse Fuchs.
Also das ist mein Versuch. Mein Bruder stellt dann das Piepsen ab, indem er kurz das Netzteil aussteckt und wieder einsteckt. Dann soll aber bis zum nächsten Morgen gewartet werden, und das krieg ich nicht hin…

Ich denke es klappt nicht wegen delay(), oder was meint ihr?

Der Code hängt sich irgendwie auf, auf jeden Fall piepst es bei mir nicht richtig !?

int eingang= A0;
int pieps = 11;
int sensorWert = 0;

void setup()
{
Serial.begin(9600);
pinMode (pieps, OUTPUT);
}
void loop()
{
sensorWert =analogRead(eingang);
Serial.print("Sensorwert = " );
Serial.println(sensorWert);
delay(72000000);
while(true){
if (sensorWert < 600 )
{
digitalWrite(pieps, HIGH);
delay(7200000);
}
else
{
digitalWrite(pieps, LOW);
}
delay (50);
}
}

Viele Grüße und vielen Dank im Voraus

delay(72000000);

Vergiss es. Am besten nimmst du vielleicht eine Real Time Clock für die Zeit (DS3231). Die kannst du dann ständig abfragen um zu schauen wieviel Uhr es ist. Oder auch einfach nachschauen ob z.B. 5 Stunden vergangen sind, wenn man es nicht über die absolute Uhrzeit machen will.

Außerdem misst du da einmal und dann machst du gleich dein Delay. Dadurch geschieht erst mal für 72000000ms nichts.

Notfalls kann man schon die Millisekunden (vernünftig, nich mit delay()) zählen, aber dann ist es trotzdem clever so ab und zu mal das Ganze in Minuten oder Stunden umzurechnen, damit solche exorbitanten Zahlen gar nicht erst aufkommen...

Nja, das geht auch ohne Uhr, kommt ja nicht auf die Zeit sondern Helligkeit an.

Vorschlag: um Wolken etc. auszumerzen Messintervall deutlich erhöhen und mehrere Messwerte nehmen. Wenn Dunkelheit erkannt wird Tröte aktivieren. Taste derücken statt Stecker raus und dann erstmal auf Helligkeit warten. Wenn wieder hell dann wieder von vorne, denkel, Tröte, Taste ....

Moin,
kauf Dir eine Zeitschaltuhr mit astronomischer Korrektur und Du bist alle Sorgen los.

Gruss
Kurti

Würde den ganzen Delay-Mist rausnehmen und auch die while(true) Schleife, deren Sinn sich mir überhaupt nicht erschliesst und stattdessen wie geplant auf die einbrandende Dunkelheit triggern.

Dazu den Sensorwert in der Loop abfragen, wenn ein gewisser Wert unterschritten wird einen Countdown starten (blinkwithoutdelay), um kurz anhaltende Dunkelheit wie ein vorüberhuschender Schatten zu ignorieren, und bei Ablauf dieses Countdowns bei anhaltender Dunkelheit das Piepsen starten. Zeitgleich eine Variable ändern, die festhält, dass das Piepsen heute schon ausgelöst wurde und erst wieder zurückgesetzt wird, sobald es wieder über eine gewisse Zeit hell ist. Das Piepsen würde ich über einen Taster abschalten lassen.

JeanLucGunn:
Der Code soll folgendes machen:

Es soll immer am Abend bei gewünschtem Dämmerungswert ein Piepsen ertönen, damit mein Bruder nicht vergisst die Hühnerstalltüre zuzumachen. Es kam nämlich schon ein paar mal der böse Fuchs.
Also das ist mein Versuch. Mein Bruder stellt dann das Piepsen ab, indem er kurz das Netzteil aussteckt und wieder einsteckt. Dann soll aber bis zum nächsten Morgen gewartet werden, und das krieg ich nicht hin…

Ich denke es klappt nicht wegen delay(), oder was meint ihr?

Wenn Du Code brauchst, der das macht, dann mußt Du auch solchen Code programmieren.

Vor allem mußt Du erkennen, dass der Code auf Helligkeitswechsel reagieren soll, und mit “Warten” hat das nur insofern etwas zu tun, als Du “Warten auf Helligkeitswechsel” programmieren mußt. Nicht “Warten auf Zeitänderung”.

Dazu brauchst Du zwei Grenzwerte für “hell” und für “dunkel”, die so weit auseinander liegen, dass nicht eine einzelne vorbeiziehende Wolke den Wert ändern kann. Sagen wir mal “unter 400” ist als dunkel anzusehen und “über 800” als hell.

Werte dazwischen werden als “Hysterese” betrachtet und jeweils dem Wert zugeordnet, der vorher gegolten hat. D.h. wenn es vorher “hell” war, werden 700, 600 und 500 auch noch als hell betrachtet. Und wenn es vorher “dunkel” war, sind 500, 600 und 700 auch noch dunkel.

Wie groß die “Hysterese” tatsächlich sein muß, hängt von Deiner Messwerterfassung ab, beste Werte ggf. durch Ausprobieren ermitteln.

Programmablauf dann ungefähr so:

#define EINGANGSPIN A0
#define DUNKELWERT 400
#define HELLWERT 800
#define PIEPSPIN 11

int sensorWert;
boolean tagHell=false;

void setup()
{
  Serial.begin(9600);
  pinMode (PIEPSPIN, OUTPUT);
  digitalWrite(PIEPSPIN,LOW); // Piepser ausschalten 
}

void loop()
{
  Serial.println("Start - Warten auf den Tag...");
  // Warte auf Helligkeit
  while (tagHell==false)
  {
    sensorWert =analogRead(EINGANGSPIN);
    if (sensorWert>=HELLWERT) tagHell=true;
  }
  Serial.println("Tag - Warten auf Dunkelheit...");
  // Warte auf Dunkelheit
  while (tagHell==true)
  {
    sensorWert =analogRead(EINGANGSPIN);
    if (sensorWert<=DUNKELWERT) tagHell=false;
  }
  Serial.println("Abend - Piepser einschalten!");
  // Jetzt ist es dunkel, nachdem es vorher hell war
  digitalWrite(PIEPSPIN,HIGH); // Piepser einschalten 
}

Mit Abschalten des Piepsers durch einen “Reset” des Programms (z.B. kurzfristiges Ziehen des Netzteils).

Zeit und Helligkeit kann man ja noch logisch miteinander verwursten.
Wenn Zeit noch nicht ran (Mittags Gewitter) - ignorieren.
Wenn es z.B. nach 17 Uhr ist und es wird dunkel, dann Signal geben.
Ich würde den Fotowiderstand oder Fototransistor als Spannungsteiler schalten und den Analogeingang noch mit einem 2,2µF Folienkondensator (MKT reicht) gegen Masse gegen Störspitzen puffern. Dazu noch eine Mittelwertbildung über 50 Werte und das Ganze ist hinreichend stabil.

Gruß Gerald

Hallo,
ihr habt mir richtig geholfen, vor allem der code von jurs !
Werde jetzt erst mal versuchen ohne Uhr und ohne astronomische Zeitschaltuhr mit Fotowiderstand zu arbeiten.
Zwei Fragen hätte ich noch:

  1. Gerald schreibt:

den Analogeingang noch mit einem 2,2µF Folienkondensator (MKT reicht) gegen Masse gegen Störspitzen puffern.

Also von A0 zum Kondensator, dann zwischen Widerstand und Fotodiode den Helligkeitswert abgreifen, in Reihe sozusagen. Ist das richtig?

  1. Hitsuji und Gerald schreiben, ich soll eine Mittelwertbildung oder countdown (blinkwithoutdelay) starten um sicher zu gehen, dass nicht ein Autoscheinwerfer oder so… die Helligkeit verursacht.
int [] sensorWerte =  new int[50];
for(int i=1,i<sensorWerte.length(),i++){
sensorWerte[i] =analogRead(EINGANGSPIN); 
delay(1000*60*2);
}

Also ihr würdet mir wieder raten auf delay() zu verzichten, um die zwei Minuten zu warten, habe ich das richtig verstanden? Das muss ich also ähnlich wie blinkwithoutdelay implementieren?

Danach noch irgendwie den Mittelwert bilden und in die Variable sensorWert (von jurs Code) speichern … siehe oben.

Grüße
Uli

Hallo JeanLuc

Deinen geposteten Code verstehe ich nicht ganz. Insbesondere die erste Zeile sieht für mich nicht richtig aus.
Gerald möchte glaube ich den Mittelwert bilden, um ein „Zittern“ des Sensowerts zu verringern. Da du aber mit Jurs’ Beispiel eine deutliche Hysterese (verschobene Ein- und Ausschaltwerte) einbauen kannst, sollte dies weniger ein Problem sein. Bei meinem Beitrag gings darum, einen Autoscheinwerfer vom Sonnenaufgang zu unterscheiden oder jemanden, der am Sensor vorbeiläuft von der Abenddämmerung, was sich wohl am besten über die Lichteinfallsdauer feststellen lässt, die beim Auto in der Regel kürzer ist als bei der Sonne (Autokolonnen können Probleme verursachen).
Dazu müsstest du bei Über- und Unterschreiten eines gewissen Lichtwerts (wie Beispiel Jurs) nicht sofort triggern, sondern ab dann über eine gewisse Zeit mehrere Messungen vornehmen und darüber einen Mittelwert bilden, um festzustellen ob während der Messdauer nur kurze Lichtereignisse stattfanden oder nicht.
Wenn du aber den Mittelwert in einer for-Schleife bildest, passiert dies wahrscheinlich zu schnell, um ein vorbeifahrendes Auto (Lichteinfall während vielleicht 10 Sekunden) von einer Morgendämmerung zu unterscheiden. Und wenn du das Zeitintervall per delay erzeugst, fehlen dir die Messungen, die beweisen, dass über längere Zeit Licht/Dunkelheit da war und nicht nur der Augenblick vor dem delaybefehl.

Mit dem Blinkwithoutdelay Beispiel lassen sich sowas realisieren. Der uC kann mit dieser Methode nach wie vor den Loop durchlaufen und macht eine Aktion nur, wenn eine gewisse Zeit verstrichen ist. In diesem Fall halt einfach eine Messung anstatt eine LED anzuzünden :wink:

Halbpseudocode als Ergänzung zu jurs’ am Beispiel des Eindunkelns:

...
sensorWert =analogRead(EINGANGSPIN);
    if (sensorWert<=DUNKELWERT && tagHell == true && testStart == false) // wenns dunkel ist und vorher noch hell war und noch kein Test am laufen ist
		testStart = true; // Testmessungen starten
		intervall = millis(); // Zeit merken
  }
	if (testStart = true && millis() - intervall > messIntervall) { // wenn die Differenz zwischen Startzeit und aktueller Zeit grösser als das Intervall ist
		messwert[index++] = analogRead(EINGANGSPIN); // Messung vornehmen und in Messwertarray speichern
		intervall = millis(); // Zeit zurücksetzen für nächstes Intervall
		if (index > anzahlMessungen) {	// wenn die gewünschte Anzahl Messungen erreicht ist
			// for schleife starten, um Mittelwert zu berechnen
			// index zurücksetzen
			// entscheiden ob nun Tag oder Nacht tatsächlich angebrochen ist
			tagHell = true oder false;
			testStart = false;
		}
}

Messintervall * Anzahl Messungen bestimmen dabei die Zeitspanne, über die gemessen wird.
Hoffe ich hab nicht tausend Denkfehler eingebaut oder unnötig verkompliziert, aber da korrigieren mich meine Kollegen glaube ich gerne :wink:
Lustigerweise hab ich als mein erstes Bastelprojekt was ganz ähnliches als Analogschaltung gebaut, um meine Weihnachtslichterkette zu schalten.

Hitsuji: Deinen geposteten Code verstehe ich nicht ganz. Insbesondere die erste Zeile sieht für mich nicht richtig aus.

Das new? Vollkommen falsch ist das nicht, aber dynamischen Speicher sollte man hier nicht verwenden. Ist auch schlichtweg unnötig.

Serenifly: Das new? Vollkommen falsch ist das nicht, aber dynamischen Speicher sollte man hier nicht verwenden. Ist auch schlichtweg unnötig.

Das übersteigt wohl meine Kenntnisse. Sollte wohl endlich mal in meinem C-Buch weiterlesen :)

int[] sensorWerte = new int[50];

... ist kein c, sondern Java.

In c heisst das einfach

int sensorWerte[50];

Das geht auch in C++, aber leicht anders:

int* sensorWerte = new int[50]

new gibt wie malloc() einen Zeiger zurück

Aber wie gesagt, nicht so machen, sondern den Speicher statisch anlegen

Hallo an alle und vielen Dank für die vielen Antworten…
ich befinde mich jetzt im nächsten Schritt: es soll statt dem Piepser am Abend auch am Morgen ein Piepser losgehen, bzw. später die Hühnertalltür am Morgen geöffnet und am Abend geschlossen werden.

Mit eurer Hilfe bringe ich jetzt folgenden Code zusammen:
Wenn ich bei Dunkelheit starte (arbeite mit Poti, drehe den ganz nach links) wartet er auf den Tag, dann drehe ich den Poti ganz nach rechts, es erscheint folgende Ausgabe:

Nacht - Warten auf den Tag...
Test starten
Testmessung 
estmessung 
stmessung 
tmessung 
messung 
1023
Tag   - Tuer wird geoeffnet...
Tag   - Warten auf Dunkelheit...

Das ist eigentlich super, aber jetzt drehe ich den Poti ganz nach links, dann spielt er verrückt und wartet nicht mal 2sec bis zur nächsten Messung… Messwerte von -6000 bis +6000 …
Kommt da einer dahinter? Ist da noch was falsch mit dem Array. (ich komme von Java, bin da auch kein so Profi)

Gruß
JeanLuc

//Huehnerstall Version 3
//
//JeanLucGunn
//
//Huehnerstall-Tuer soll am Abend schließen, am Morgen öffnen
//
//deutsches Arduino-Formum: "bei dem piepst es wohl nicht richtig!" vom 12.12.2014
//besonderer Dank gilt: jurs, Hitsuji, nix_mehr_frei ...
//
//mit Fotowiderstand als Spannungsteiler an A0 (mit einem 2,2µF Folienkondensator (MKT reicht) gegen Masse gegen Störspitzen gepuffert)
//Pololu Schrittmotor: Unipolar/Bipolar, 200 Steps, 4.0V, 1.2A (NEMA 17) 
//Pololu A4988 Schrittmotortreiber 
//

#define EINGANGSPIN A0
#define DUNKELWERT 500
#define HELLWERT 600
#define ZUPIN 11
#define AUFPIN 12

int sensorWert;
int sensorWerte[50];  //fuer den Test
int index=0;
int summe=0;
int mittelWert=0;
int intervall;
int anzahlMessungen=5;  // besser: #define ANZAHLMESSUNGEN 5 ?
int messIntervall=3000; // im Test alle 3 sec eine Messung vornehmen
boolean tagHell=false;
boolean testStart=false;

void setup()
{
  Serial.begin(9600);
  pinMode (AUFPIN, OUTPUT);
  digitalWrite(AUFPIN,LOW); // Tuer auf angehalten
  pinMode (ZUPIN, OUTPUT);
  digitalWrite(ZUPIN,LOW); // Tuer zu angehalten 
}

void loop()
{
  Serial.println("Nacht - Warten auf den Tag...");
  // Warte auf Helligkeit
   while (tagHell==false)
  {
    sensorWert =analogRead(EINGANGSPIN); //kostet das viel Strom wenn er dauernd messen muss?? 
      if (sensorWert>=DUNKELWERT && testStart == false){
        //Test anstossen: Mittelwert aus anzahlMessungen Messungen
        Serial.println("Test starten");
        testStart = true; // Testmessung starten
        intervall = millis(); // Zeit merken
         }
         
     if (testStart == true && millis() - intervall > messIntervall) { // wenn die Differenz zwischen Startzeit und aktueller Zeit grösser als das Intervall ist
		sensorWerte[index]= analogRead(EINGANGSPIN); // Messung vornehmen und in Messwertarray speichern
                Serial.println("Testmessung "+index); //wie verknuepfe ich String mit Variablenwert??
                index++;
    		intervall = millis();           // Zeit zurücksetzen für nächstes Intervall
		if (index >= anzahlMessungen) {	// wenn die gewünschte Anzahl Messungen erreicht ist
		    for(int i=0;i<anzahlMessungen;i++){      // for schleife starten, um Mittelwert zu berechnen
                        summe=summe+sensorWerte[i];
                        }
                mittelWert=summe/anzahlMessungen;  
                Serial.println(mittelWert);
                testStart = false;
      	        index = 0;// index zurücksetzen
		if(mittelWert>=DUNKELWERT)tagHell=true;   //entscheiden ob nun Tag oder Nacht tatsächlich angebrochen ist
     }
    }
  }
  
  
  // Es ist Tag - Tueroeffnungsmechanismus startet
  stallAuf();
  Serial.println("Tag   - Tuer wird geoeffnet...");
  delay(2000);
  Serial.println("Tag   - Warten auf Dunkelheit...");
  // Warte auf Dunkelheit
  while (tagHell==true)
  {
    sensorWert =analogRead(EINGANGSPIN); //kostet das viel Strom wenn er dauernd messen muss?? 
      if (sensorWert<=DUNKELWERT && testStart == false){
        //Test anstossen: Mittelwert aus anzahlMessungen Messungen
        Serial.println("Test starten");
        testStart = true; // Testmessung starten
        intervall = millis(); // Zeit merken
         }
         
     if (testStart == true && millis() - intervall > messIntervall) { // wenn die Differenz zwischen Startzeit und aktueller Zeit grösser als das Intervall ist
		sensorWerte[index]= analogRead(EINGANGSPIN); // Messung vornehmen und in Messwertarray speichern
                Serial.println("Testmessung "+index); //wie verknuepfe ich String mit Variablenwert??
                index++;
    		intervall = millis();           // Zeit zurücksetzen für nächstes Intervall
		if (index >= anzahlMessungen) {	// wenn die gewünschte Anzahl Messungen erreicht ist
		    for(int i=0;i<anzahlMessungen;i++){      // for schleife starten, um Mittelwert zu berechnen
                        summe=summe+sensorWerte[i];
                        }
                mittelWert=summe/anzahlMessungen;  
                Serial.println(mittelWert);
                testStart = false;
      	        index = 0;// index zurücksetzen
		if(mittelWert<=DUNKELWERT)tagHell=false;   //entscheiden ob nun Tag oder Nacht tatsächlich angebrochen ist
     }
    }
  }
    
  // Es ist Abend - Tuer wird geschlossen
  stallZu();
  Serial.println("Abend - Tuer wird geschlossen...");
  delay(2000);
   
}
//Schrittmotor soll Stalltuer aufmachen, jetzt erst mal LED leuchten lassen
void stallAuf(){
  digitalWrite(AUFPIN,HIGH);
  delay(2000);
  digitalWrite(AUFPIN,LOW);
}
//Schrittmotor soll Stalltuer zumachen, jetzt erst mal LED leuchten lassen
void stallZu(){
    digitalWrite(ZUPIN,HIGH);
    delay(2000);
    digitalWrite(ZUPIN,LOW);
}
  • Serial.println("Testmessung "+index); //wie verknuepfe ich String mit Variablenwert??
  • int anzahlMessungen=5; // besser: #define ANZAHLMESSUNGEN 5 ?

Grüße
JeanLuc

Serial.println("Testmessung "+index); //wie verknuepfe ich String mit Variablenwert??

Mach einfach zwei Aufrufe von print() und println(). Das muss nicht in einem Funktionsaufruf stehen:

Serial.print("Testmessung "); Serial.println(index);

Alternativ gibt es das:
http://arduiniana.org/libraries/streaming/
Damit hat man die Output Stream Syntax mit << wie in Standard C++

int anzahlMessungen=5;  // besser: #define ANZAHLMESSUNGEN 5 ?

Besser als #define hier ist const:

const int anzahlMessungen = 5;

Genauso bei anderen Werten die sich nie ändern wie messIntervall. Das ist wie eine final Variable in Java

Hallo,
hier ist die nächste Version, die jetzt soweit funktioniert. Ausgabe:

Nacht - Warten auf den Tag...
Test auf Helligkeit starten
0. Testmessung: 795
1. Testmessung: 795
2. Testmessung: 875
3. Testmessung: 620
4. Testmessung: 1023
Mittelwert: 821
Tag   - Tuer wird geoeffnet...
Tag   - Warten auf Dunkelheit...

Die Fehler waren:

  • millis() gibt unsigned long zurück, also kein int
  • summe muss zurückgesetzt werden, wenn die gewünschte Anzahl Messungen erreicht ist
  • (millis() - startZeit) > messIntervall) Die Klammern waren wichtig, der hatte wohl erst verglichen

Haben wir jetzt eigentlich c oder c++ programmiert, oder beides?
Hier auf jeden Fall der code:

//Huehnerstall Version 4
//
//JeanLucGunn
//
//Huehnerstall-Tuer soll am Abend schließen, am Morgen öffnen
//
//deutsches Arduino-Formum: "bei dem piepst es wohl nicht richtig!" vom 12.12.2014
//besonderer Dank gilt: jurs, Hitsuji, nix_mehr_frei, Serenifly ...
//
//mit Fotowiderstand als Spannungsteiler an A0 (mit einem 2,2µF Folienkondensator (MKT reicht) gegen Masse gegen Störspitzen gepuffert)
//Pololu Schrittmotor: Unipolar/Bipolar, 200 Steps, 4.0V, 1.2A (NEMA 17) 
//Pololu A4988 Schrittmotortreiber 
//

#define EINGANGSPIN A0                    //Fotowiderstand an A0
#define ZUPIN 11                          //Schrittmotor zum Schliessen der Tuer
#define AUFPIN 12                         //Schrittmotor zum Oeffnen der Tuer

const int DUNKELWERT=500;                  //unter diesem sensorWert sind alle Huehner im Stall, hoffentlich !
const int HELLWERT=600;                    //ab diesem sensorWert wollen die Huehner dringend raus...
int sensorWert;                           //Fotowiderstand an A0
unsigned long startZeit;                  //Startzeit fuer das messIntervall, mit millis()
const unsigned long messIntervall=1000*2; //Intervall zwischen zwei Testmessungen in Millisekunden
const int anzahlMessungen = 5;            //Anzahl der Testmessungen
int sensorWerte[50];                      //Array fuer die Testmessungen
int index=0;                              //Array Index
int summe=0;                              //Zwischenergebnis fuer das arithmetische Mittel
int mittelWert=0;                         //der Mittelwert der Testmessungen

boolean tagHell=false;                    //wir starten bei Dunkelheit
boolean testStart=false;                  //es laeuft noch kein Test

void setup()
{
  Serial.begin(9600);
  pinMode (AUFPIN, OUTPUT);
  digitalWrite(AUFPIN,LOW);    // Tuer auf angehalten
  pinMode (ZUPIN, OUTPUT);
  digitalWrite(ZUPIN,LOW);     // Tuer zu angehalten 
}

void loop()
{
  Serial.println("Nacht - Warten auf den Tag...");
  // Warte auf Helligkeit
   while (tagHell==false)
  {
    sensorWert =analogRead(EINGANGSPIN); 
      if (sensorWert>=HELLWERT && testStart == false){
        //Test anstossen: Mittelwertbildung
        Serial.println("Test auf Helligkeit starten");
        testStart = true;               // Testmessung starten
        startZeit = millis();           // Startzeit: aktuelle Zeit seit Programmausfuehrung merken, laueft nach etwa 50 Tagen ueber !!
         }
         
     if (testStart == true && (millis() - startZeit) > messIntervall) { 
                // wenn die Differenz zwischen Startzeit und aktueller Zeit groesser als das Intervall ist
		sensorWerte[index]= analogRead(EINGANGSPIN);// Messung vornehmen und in Messwertarray speichern
                Serial.print(index); Serial.print(". Testmessung: ");Serial.println(sensorWerte[index]);
                index++;
                startZeit = millis();           // Zeit zurücksetzen für nächstes Intervall
		if (index >= anzahlMessungen) {	// wenn die gewünschte Anzahl Messungen erreicht ist
		    for(int i=0;i<anzahlMessungen;i++){// for schleife starten, um Mittelwert zu berechnen
                        summe=summe+sensorWerte[i];
                        }
                    mittelWert=summe/anzahlMessungen;  
                    Serial.print("Mittelwert: ");Serial.println(mittelWert);
                    summe = 0;
                    testStart = false;
      	            index = 0;// index zurücksetzen
		    if(mittelWert>=HELLWERT)tagHell=true;//entscheiden ob nun Tag oder Nacht tatsächlich angebrochen ist
                    }
    }
  }
  
  
  // Es ist Tag - Tueroeffnungsmechanismus startet
  stallAuf();
  Serial.println("Tag   - Tuer wird geoeffnet...");
  delay(2000);
  Serial.println("Tag   - Warten auf Dunkelheit...");
  // Warte auf Dunkelheit
     while (tagHell==true)
  {
    sensorWert =analogRead(EINGANGSPIN); 
      if (sensorWert<=HELLWERT && testStart == false){
        //Test anstossen: Mittelwertbildung
        Serial.println("Test auf Dunkelheit starten");
        testStart = true;               // Testmessung starten
        startZeit = millis();           // Startzeit: aktuelle Zeit seit Programmausfuehrung merken, laueft nach etwa 50 Tagen ueber !!
         }
         
     if (testStart == true && (millis() - startZeit) > messIntervall) { 
                // wenn die Differenz zwischen Startzeit und aktueller Zeit groesser als das Intervall ist
		sensorWerte[index]= analogRead(EINGANGSPIN);// Messung vornehmen und in Messwertarray speichern
                Serial.print(index); Serial.print(". Testmessung: ");Serial.println(sensorWerte[index]);
                index++;
                startZeit = millis();           // Zeit zurücksetzen für nächstes Intervall
		if (index >= anzahlMessungen) {	// wenn die gewünschte Anzahl Messungen erreicht ist
		    for(int i=0;i<anzahlMessungen;i++){// for schleife starten, um Mittelwert zu berechnen
                        summe=summe+sensorWerte[i];
                        }
                    mittelWert=summe/anzahlMessungen;  
                    Serial.print("Mittelwert: ");Serial.println(mittelWert);
                    summe = 0;
                    testStart = false;
      	            index = 0;// index zurücksetzen
		    if(mittelWert<=DUNKELWERT)tagHell=false;//entscheiden ob nun Tag oder Nacht tatsächlich angebrochen ist
                    }
    }
  }
    
  // Es ist Abend - Tuer wird geschlossen
  stallZu();
  Serial.println("Abend - Tuer wird geschlossen...");
  delay(2000);
   
}
//Schrittmotor soll Stalltuer aufmachen, jetzt erst mal LED leuchten lassen
void stallAuf(){
  digitalWrite(AUFPIN,HIGH);
  delay(2000);
  digitalWrite(AUFPIN,LOW);
}
//Schrittmotor soll Stalltuer zumachen, jetzt erst mal LED leuchten lassen
void stallZu(){
    digitalWrite(ZUPIN,HIGH);
    delay(2000);
    digitalWrite(ZUPIN,LOW);
}

Kann man seinen Thread auch umbenennen? Müsste heißen: Automatische Hühnerstalltüre
Jetzt schaue ich mir mal die Schrittmotoren an.

Gruß und danke noch mal an alle… :wink:
JeanLuc

JeanLucGunn:
millis() gibt unsigned long zurück, also kein int

Ja, int läuft schon nach 16535ms über

(millis() - startZeit) > messIntervall) Die Klammern waren wichtig, der hatte wohl erst verglichen

Etwas komisch rein nach der Theorie. Eigentlich hat - Vorrang vor < und beides hat Vorrang gegenüber &&. Und == geht vor &&:
http://en.cppreference.com/w/cpp/language/operator_precedence

Das geht auch ist ein wenig deutlicher:

 if (testStart == true && (millis() - startZeit > messIntervall))

Haben wir jetzt eigentlich c oder c++ programmiert, oder beides?

C++

Wobei du hier noch keinen großen Unterschied siehst, da das meiste davon im Hintergrund abläuft. Aber Klassen z.B. gibt es in C nicht.

C ist aber mehr oder weniger ein Subset von C++ und man verwendet oft auch Sachen die eigentlich aus C stammen und in reinem C++ nicht so gerne gesehen werden.