Hühner erkennung im Legenest

Hallo

Mein Name ist Joggl und bin 33 Jahre alt. Habe letztes Jahr im November ein Arduino Nano gekauft um einen Stepper Motor anzusteuern. Nachdem ich nach und nach rausgefunden habe was man mit dem Arduino noch alles machen kann, habe ich in meinen Hühnerstall eine Steuerung eingebaut, die mir den Stall überwacht und teilweise Rückmeldung gibt. Mein Problem ist jetzt das ich am Legenest eine Türe habe die Abends geschlossen werden soll. Voraussetzung ist das kein Huhn in dem Nest sitzt. Habe es mit IR Sensoren und Sender versucht und hat auch gut funktioniert. Jetzt ist es aber das Problem das draußen das Sonnenlicht die Sensoren auslösen und das ganze nicht funktioniert. Es muss also eine alternative her. Hat jemand eine Idee mit welchem Bauteil ich zuverlässig erkenne, ob ein Huhn im Nest sitzt? Ultraschall fällt leider weg, weil ich Bedenken habe das die Hühner das unangenehm finden.

Gruß Joggl

Sensor vor Sonnenlicht abschirmen, fällt mir da als erstes ein.

wägen, wie schwer das Nest ist.

Hi

Was passiert, wenn ein Huhn den Nacht-Aufruf 'verpennt'?
Selber keine Hühner - nur von Freunden 'erfahren', daß Diese wohl 'wenn Dunkel' den Stall aufsuchen - ein Lege-Nest wäre wohl nahezu identisch mit 'Stall' - wobei - wenn dort keine Beleuchtung vorhanden ist, sollten sich die Hühner 'von Alleine' da weg begehen - sofern 'Draußen' hell und/oder im Stall mehr Licht, als in dem lege-Bereich.

Blöd ist halt, wenn ein Huhn im Legebereich die Dämmerung 'erwischt' - dann ist's draußen auch nicht wirklich heller, als Da, wo das Huhn nun schon ist - wenn die Tür offen bleibt, kommt auch noch der Fuchs rein - auch blöd.

Wie gesagt: Nur 'Hörensagen' - aber dafür durchaus öfter von den 'HühnerHabern'.

MfG

Das ging ja schnell. Abschirmen habe ich versucht, ging leider nicht da das Dach von Stall durchsichtig ist. Der Stall hat überall das gleiche Licht. Gewicht wäre interessant müsste ich mal schauen wie sich das umsetzen lässt, da das Nest an der Wand aufgehängt wird. Meine Hühner haben bis 14 Uhr alle Eier gelegt. Den Aufwand mit dem schließenden Nest muss ich betreiben, weil sich ein Huhn das Nest als Schlafplatz ausgesucht hat und Hühner Nachts am meisten Dreck machen. Das hängt dann an den Eiern. Das Nest befindet sich im Stall der Nachts zu ist damit der Fuchs die Hühner nicht holt.

Hi

Dann brauchst Du doch 'nur' sehen, daß während der Dämmerung 'Draußen' mehr Licht ist, alsi m Legebereich - die Hühner gehen zum Abend 'Richtung Licht' - also raus.
DANN, daß im Stall mehr Licht sit, als 'Draußen' - die Hühner gehen in den Stall.
DANN Klappe Zu, Fuchs draußen, Alle glücklich.

Aber: Selber keine Hühner :slight_smile:

MfG

Wenn Du mit IR sensor und Sender eine Art Lichtschranke gebaut hast, musst du den Sender mit ner Frequenz
(jedoch was anderes als 50Hz oder 100Hz, pulsen und im empfänger dann auch nur auf pulsierend reagieren.
So kannst Du Fremdlicht Einfluss auskoppeln. Sowas kannst du gut mit nem Arduino machen.

LG Stefan

Das mit dem Licht versteh ich nicht. Hab kein Licht im Stall oder Nest das ich heller oder dunkler machen kann. Lichtschranke mit einer Frequenz hab ich heute mal im Internet gesucht wie man das macht aber nichts gefunden und selber bring ich das als Anfänger nicht hin. Denke ich werde es mal mit dem Gewicht versuchen.

joggl:
Mein Problem ist jetzt das ich am Legenest eine Türe habe die Abends geschlossen werden soll. Voraussetzung ist das kein Huhn in dem Nest sitzt. Habe es mit IR Sensoren und Sender versucht und hat auch gut funktioniert. Jetzt ist es aber das Problem das draußen das Sonnenlicht die Sensoren auslösen und das ganze nicht funktioniert. Es muss also eine alternative her.

Ich werd' da nicht gerade schlau draus.
Wenn es abends ist, sollte die Sonne doch schon auf dem abnehmenden Ast sein.

Mein Raten ins Blaue: Du schaust nach der Zeit und willst zumachen, wenn der IR-Empfänger kein Signal empfängt.
Das geht nicht, weil die Zeit erreicht ist und der IR-Sensor das Sonnenlicht noch aufnimmt.

Ein Abgleich Sonnenenstrahlung <-> IR-Strahlung fällt vermutlich aus. (Ich bin kein Hühnerhalter)

Dann ist ein Radarsensor evtl. die bessere Variante. Nachzulesen u.a. dort:

Vögel haben eine deutlich höhere Körpertemperatur als Säuger, das schreit förmlich nach einer Wärmemessung. Es gibt Sensoren, sog. "Thermophile", das ist quasi eine 1-Pixel-Wärmebildkamera. Damit kannst du auch in tiefster Dunkelheit aus 30 ... 50cm Entfernung feststellen, ob da ein Huhn sitzt oder nicht. Einziges Problem: Auch das Gelege hat nach dem Weggang des Huhnes noch eine Weile die gleiche Temperatur ... aber das bekommst du heraus, wenn den Gradienten über ein paar Sekunden prüfts ...

https://www.ebay.de/i/323903345608

Hallo

Nach vielen Arbeitsstunden bin ich mit meinem Nest weiter gekommen. Habe es jetzt mit Gewicht gemacht und funktioniert besser als gedacht. Da sich jetzt die Möglichkeit ergab eine Eiererkennung mit einzubauen bin ich am code schreiben. Ziel ist es über eine Segmentanzeige außen am Hühnerstall anzeigen zu lassen wie viele Eier gelegt wurden. Nun habe ich das Problem, das ich die Anzeige erst nach 10 Sekunden umschalten will, wenn ein Ei dazu kommt. Möchte es gern ohne Delay lösen aber komme zu keinem Ergebnis. Gibt es eine eine art 10 Sekunden Timer den ich nach der if abfrage einsetzen kann? Im jetzigen Code schaltet die Anzeige immer zwischen 0-10 Sekunden weil die Zeit erst alle 10 Sekunden zurück gesetzt wird. Hier mal der Code

#include "HX711.h"

unsigned long umschaltZeit;
unsigned long taraZeit;
const int WAAGE_1_DOUT_PIN = 5; // DT Pin des Hx711
const int WAAGE_1_SCK_PIN = 6;  // SCK Pin des Hx711
int eiImNest = 4;
int tara = 3;
int huhnImNest = 2;
float messwert1status;
float gewichtnest;
int segment1 = 7;
int segment2= 8;
int segment3 = 9;
int segment4 = 10;
int segment5 = 11;
int segment6 = 12;
int segment7 = 13;
int segment8 = A0;

HX711 waage1;


void setup() {
  Serial.begin(9600);
  waage1.begin(WAAGE_1_DOUT_PIN, WAAGE_1_SCK_PIN);
  pinMode(eiImNest, OUTPUT);
  pinMode(huhnImNest, OUTPUT);
  pinMode(tara, INPUT_PULLUP);
  pinMode(segment1, OUTPUT);
  pinMode(segment2, OUTPUT);
  pinMode(segment3, OUTPUT);
  pinMode(segment4, OUTPUT);
  pinMode(segment5, OUTPUT);
  pinMode(segment6, OUTPUT);
  pinMode(segment7, OUTPUT);
  pinMode(segment8, OUTPUT);
  gewichtnest = messwert1status;
  taraZeit = millis();

}

void loop() {




if (digitalRead(tara) == LOW)  {                                                       // Wenn das Nest geöffnent wird, wird das Gewicht wieder auf Null gestellt wenn kein Huhn im Nest
 gewichtnest = messwert1status;                                                
}
 
  
  if (waage1.is_ready()) {
    float messwert1 = ((waage1.read() * (-0.0001)) - 36) * 0.409;                                            // Gewicht vom Nest wird gemessen
    Serial.print("Gewicht Legenest: ");                                                                      
    Serial.println(messwert1, 2);
    messwert1status = ((waage1.read() * (-0.0001)) - 36) * 0.409;                                            //Gewicht wird gespeichert
    Serial.print("Gewichtnest: ");
    Serial.println(messwert1status - gewichtnest, 2);
    
  }
  else {
    Serial.println("HX711 Messstelle 1 nicht verbunden.");
  }


if ((messwert1status - gewichtnest > 10.00) && (millis() - taraZeit > 1000)){                                                                  // tara nicht betätigt Null blinkt
  digitalWrite(segment1, LOW);
  digitalWrite(segment2, LOW);
  digitalWrite(segment3, LOW);
  digitalWrite(segment4, LOW);
  digitalWrite(segment5, LOW);
  digitalWrite(segment6, LOW);
  digitalWrite(segment7, LOW);
  digitalWrite(segment8, HIGH);
   taraZeit = millis();
}

if ((messwert1status - gewichtnest > 10.00) && (millis() - taraZeit > 500)){                                                                  //tara nicht betätigt Null blinkt
  digitalWrite(segment1, HIGH);
  digitalWrite(segment2, HIGH);
  digitalWrite(segment3, HIGH);
  digitalWrite(segment4, HIGH);
  digitalWrite(segment5, HIGH);
  digitalWrite(segment6, HIGH);
  digitalWrite(segment7, LOW);
  digitalWrite(segment8, LOW);

}

// null Eier im Nest

if ((messwert1status - gewichtnest <= 0.04)&& (millis() - umschaltZeit > 10000)){                                                                  
  
digitalWrite(segment1, LOW);
  digitalWrite(segment2, LOW);
  digitalWrite(segment3, LOW);
  digitalWrite(segment4, LOW);
  digitalWrite(segment5, LOW);
  digitalWrite(segment6, LOW);
  digitalWrite(segment7, LOW);
  digitalWrite(segment8, LOW);
  umschaltZeit = millis();
}

// ein Ei im Nest

if ((messwert1status - gewichtnest > 0.05) && (messwert1status - gewichtnest <= 0.10) && (millis() - umschaltZeit > 10000)){                       
   digitalWrite(segment1, LOW);
  digitalWrite(segment2, HIGH);
  digitalWrite(segment3, HIGH);
  digitalWrite(segment4, LOW);
  digitalWrite(segment5, LOW);
  digitalWrite(segment6, LOW);
  digitalWrite(segment7, LOW);
  digitalWrite(segment8, LOW);
  umschaltZeit = millis();
}

// zwei Eier im Nest

if ((messwert1status - gewichtnest > 0.10) && (messwert1status - gewichtnest <= 0.15) && (millis() - umschaltZeit > 10000)){                       
 digitalWrite(segment1, HIGH);
  digitalWrite(segment2, HIGH);
  digitalWrite(segment3, LOW);
  digitalWrite(segment4, HIGH);
  digitalWrite(segment5, HIGH);
  digitalWrite(segment6, LOW);
  digitalWrite(segment7, HIGH);
  digitalWrite(segment8, LOW);
  umschaltZeit = millis();
}

// drei Eier im Nest

if ((messwert1status - gewichtnest > 0.15) && (messwert1status - gewichtnest <= 0.20) && (millis() - umschaltZeit > 10000)){                         
  digitalWrite(segment1, HIGH);
  digitalWrite(segment2, HIGH);
  digitalWrite(segment3, HIGH);
  digitalWrite(segment4, HIGH);
  digitalWrite(segment5, LOW);
  digitalWrite(segment6, LOW);
  digitalWrite(segment7, HIGH);
  digitalWrite(segment8, LOW);
  umschaltZeit = millis();
}

    // vier Eier im Nest

if ((messwert1status - gewichtnest > 0.20) && (messwert1status - gewichtnest <= 0.26) && (millis() - umschaltZeit > 10000)){                    
   digitalWrite(segment1, LOW);
  digitalWrite(segment2, HIGH);
  digitalWrite(segment3, HIGH);
  digitalWrite(segment4, LOW);
  digitalWrite(segment5, LOW);
  digitalWrite(segment6, HIGH);
  digitalWrite(segment7, HIGH);
  digitalWrite(segment8, LOW);
  umschaltZeit = millis();
}

// fünf Eier im Nest

if ((messwert1status - gewichtnest > 0.26) && (messwert1status - gewichtnest <= 0.33) && (millis() - umschaltZeit > 10000)){                       
   digitalWrite(segment1, HIGH);
  digitalWrite(segment2, LOW);
  digitalWrite(segment3, HIGH);
  digitalWrite(segment4, HIGH);
  digitalWrite(segment5, LOW);
  digitalWrite(segment6, HIGH);
  digitalWrite(segment7, HIGH);
  digitalWrite(segment8, LOW);
  umschaltZeit = millis();
}

  
if (messwert1status - gewichtnest > 0.5){                                                                     //Huhn im Nest
  digitalWrite(huhnImNest, LOW);
}

if (messwert1status - gewichtnest <= 0.5){
  digitalWrite(huhnImNest, HIGH);
}



 

}

Hat jemand einen Tipp für mich?

Du musst Dich entweder in millis() (Beispiel BlinkWithoutDelay in der IDE) oder in die MoBaTools einarbeiten.

Gruß Tommy

(deleted)

joggl:
Gibt es eine eine art 10 Sekunden Timer den ich nach der if abfrage einsetzen kann?

Tommy56:
oder in die MoBaTools einarbeiten.

Wobei Du dich natürlich nicht in die ganzen MobaTools einarbeiten musst ;). Du interressierst die ja nur für die Zeitfunktionen, und um die zu nutzen, muss man vom Rest der MobaTools eigentlich nichts wissen. Ja, im Prinzip reicht dir dafür sogar eine einzige Datei aus den MobaTools, die MoToTimer.h
Und mit der MoTo Timebase kannst Du dir genau so einen Timer aufbauen. Das ist dann z.B: eine if-abfrage, die automatisch alle 10 Sekunden 'wahr' wird.

P.S. Abgesehen davon wäre es aber auch extrem sinnvoll, wenn Du dich mal mit Arrays und Funktionen beschäftigen würdest. Damit könntest Du deinen Sketch sehr effizient 'aufräumen'. Z.B. Die Ansteuerung der Anzeige gehört in eien Funktion, der Du nur immer die anzuzeigende Zahl übergibst. Und die schaltet dann alle 10 Sekunden auf den zuletzt übergebenen Wert um.

Ok vielen Dank für die Antworten. Ich werde mich mal in diese Richtung einlesen und schauen was ich verbessern kann und ob ich auf eine Lösung komme.

joggl:

  if (waage1.is_ready())

{
   float messwert1 = ((waage1.read() * (-0.0001)) - 36) * 0.409;  // Gewicht vom Nest wird gemessen
   Serial.print ("Gewicht Legenest: ");
   Serial.println (messwert1, 2);
   messwert1status = ((waage1.read() * (-0.0001)) - 36) * 0.409;  //Gewicht wird gespeichert
   Serial.print ("Gewichtnest: ");
   Serial.println (messwert1status - gewichtnest, 2);
 }

Da ich da wo Status drin steckt eigentlich mit falsch/wahr - true/false - high/low oder was auch immer auf bit-Basis assoziiere, musste ich erstmal überlegen, was Du tatsächlich willst.
Was ich nicht versteh:
float messwert1 = ((waage1.read() * (-0.0001)) - 36) * 0.409; // Gewicht vom Nest wird gemessen
messwert1status = ((waage1.read() * (-0.0001)) - 36) * 0.409; //Gewicht wird gespeichert

ist jeweils das Selbe. Warum machst Du das?