AntiRattenBox

Grüße euch,
ich hoffe ihr könnt mir helfen.

Folgendes Problem:

Ich habe einen Hühnerstall mit ungebetenen Gästen die mir immer die gelegten Eier wegfressen,
da hab ich mir gedacht es würde doch bestimmt funktionieren mit einer Metallbox, einer Wage, einem IR Sensor und einem Servo das so zu steuern das in dieser Box am Ende nur Eier landen.

Also alles gebaut und mit einem Nano verkabelt.

Dann noch paar Zeilen Code schreiben und fertig. (dachte ich)

Da das mein erstes Arduino Projekt ist bin ich mit dem denken ziemlich auf die Nase gefallen.

ich verstehe einfach nicht warum es nicht richtig funktioniert.

Der Arduino macht auch teils sehr seltsame Dinge (Zähler zählt nicht hoch, Servo fährt nicht in einem Stück...)

vlt könnt ihr mir helfen.

Danke :slight_smile:

#include <Servo.h> //Servo Bibliothek
#include "HX711.h" //Wage Bibliothek

const int LOADCELL_DOUT_PIN = A2;//Pin DOUT Wage.
const int LOADCELL_SCK_PIN = A1; //Pin SCK Wage.
HX711 scale;
float reading=0; //Werte der Wage.



Servo MOTOR1; //Servo



int RUCK=2;//Eingang um Zähler EIER zurückzusetzen.
int IRANALOG=A0; // Eingang für IR Sensor.

int WAGEZ=0; //=1 Wenn Wert der Wage i.O.
int IRANALOGZ=0; //=1 Wenn Wert des IR Sensor i.O.
int SUMMEIRWAGE=0; //=2 Wenn Werte der Wage und des IR i.O.
int EIER=0;//Zähler wie viele Eier.


int LED2=8;//PIN für LED 2 EIER.
int LED4=9;//PIN für LED 4 EIER.
int LED6=10;//PIN für LED 6 EIER.
int LED8=11;//PIN für LED 8 EIER.
int LED10=12;//PIN für LED 10 EIER.
int LED12=13;//PIN für LED 12 EIER.


void setup() {
  
  Serial.begin(9600);//Start der Seriellen Verbindung an PC.
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);//Start der Wage.

  
  MOTOR1.attach(5); //PIN für Servo
  
  
  pinMode(2,INPUT);// Eingang für Eier reset
  pinMode(A0,INPUT);//Eingang für IR Sensor.

  

  pinMode(8,OUTPUT);//LED
  pinMode(9,OUTPUT);//LED
  pinMode(10,OUTPUT);//LED
  pinMode(11,OUTPUT);//LED
  pinMode(12,OUTPUT);//LED
  pinMode(13,OUTPUT);//LED


}

void loop() {
  
  
  RUCK=digitalRead(2);
  Serial.println(IRANALOG);
  Serial.println(reading);
  IRANALOG=analogRead(A0);
  SUMMEIRWAGE=IRANALOGZ+WAGEZ;
 
  
 if (scale.is_ready()) {
    reading = scale.read();    //Lesen der Wage
    } 




  if(reading <= -580000 && reading >= -550000)   //erste Auswertung der Wage (Ratte auf der Wage?)
  {WAGEZ=0;}

  delay(1000); // Wartezeit bis Ratte von der Wage runter.
 
  
  if(reading >= -580000 && reading <= -550000) //Ei auf der Wage
  {WAGEZ=1;}
  else { WAGEZ=0;}


 

  if(IRANALOG<=100) //Ei vor dem IR Sensor.
  {
    IRANALOGZ=1;}
    else{IRANALOGZ=0;}

    

    if(SUMMEIRWAGE==2)   //Werte der Wage und des IR i.O.
    {
      MOTOR1.write(50); //öffnen der Klappe
       delay(3000); //Warten bis Ei in der Kiste
      EIER=EIER+1; //Zähler EIER +1
      
      
    
     
      }
      
      else{MOTOR1.write(104);} //Klappe zu

      if(RUCK==HIGH) //Zurücksetzen des EIER Zählers.
      {EIER=0;}

    if (EIER>=2)      //Anzeige 2 Eier
    {digitalWrite(LED2,HIGH);}
    else{digitalWrite(LED2,LOW);}
    
    if (EIER>=4)      //Anzeige 4 Eier
    {digitalWrite(LED4,HIGH);}
    else{digitalWrite(LED4,LOW);}
    
    if (EIER>=6)      //Anzeige 6 Eier
    {digitalWrite(LED6,HIGH);}
    else{digitalWrite(LED6,LOW);}
    
    if (EIER>=8)      //Anzeige 8 Eier
    {digitalWrite(LED8,HIGH);}
    else{digitalWrite(LED8,LOW);}
    
    if (EIER>=10)      //Anzeige 10 Eier
    {digitalWrite(LED10,HIGH);}
    else{digitalWrite(LED10,LOW);}
    
    if (EIER>=12)      //Anzeige 12 Eier
    {digitalWrite(LED12,HIGH);}
    else{digitalWrite(LED12,LOW);}
     
      
   

  

}

EIER_final.ino (2.93 KB)

Etwas Beschreibung welche Sensoren genau Du hast (link zum Produkt auf Verkäufer)
Wie hast Du die Sensoren angeschlossen ( Schaltplan auch mit Hand gezeichnet und abfotografiert)
Gib den Sketch mittels CODe TAGs (Schaltfläche </> links oben) in den Beitrag einbinden.
Grüße Uwe

RUCK=digitalRead(2);
  Serial.println(IRANALOG);
  Serial.println(reading);
  IRANALOG=analogRead(A0);
  SUMMEIRWAGE=IRANALOGZ+WAGEZ;

Man sollte schon die Variablen zuvor bearbeiten bevor man sie ausgibt bzw benutzt.

EVA Prinzip. (Eingabe - Verarbeitung - Ausgabe.)

Grüße Uwe

hahniii:
vlt könnt ihr mir helfen.

  if (reading <= -580000 && reading >= -550000)  //erste Auswertung der Wage (Ratte auf der Wage?)

  if (reading >= -580000 && reading <= -550000) //Ei auf der Wage

Da passt was nicht.

Die Sensoren:
einmal der IR:

TCRT5000-Infrared-Reflective-Photoelectric

einmal die Wage:

Wage

Habs nicht hinbekommen die Werte der Sensoren in ein anderes Format zu bringen, deshalb hab ich einfach mit den Werten gearbeitet die ich auslesen konnte.

hahniii:
Habs nicht hinbekommen die Werte der Sensoren in ein anderes Format zu bringen, deshalb hab ich einfach mit den Werten gearbeitet die ich auslesen konnte.

Nein, das Format ist nicht das Problem.
Während in der ersten Zeile der Bereich zwischen -550000 und -580000 abgedeckt wird, versuchst Du im zweiten Teil zu vergleichen auf >-580000 und <-550000 - Beides zusammen geht aber nicht.

my_xy_projekt:
Nein, das Format ist nicht das Problem.
Während in der ersten Zeile der Bereich zwischen -550000 und -580000 abgedeckt wird, versuchst Du im zweiten Teil zu vergleichen auf >-580000 und <-550000 - Beides zusammen geht aber nicht.

Ich muss aber die Werte der Wage zweimal auslesen.
Das Problem ist das wenn die Ratte auf die Wage geht und zufällig genau den richtigen Wert abdeckt geht die Klappe auf.

Ich wollte mit der ersten Zeile erreichen das alles was nicht in dem Bereich liegt den "WAGEZ" auf 0 setzt

Und dann mit einer Sekunde Abstand erneut gemessen wird.

Wenn nach der Sekunde die Werte in Ordnung sind soll der "WAGEZ" auf 1.

(deleted)

hahniii:
Ich muss aber die Werte der Wage zweimal auslesen.

Eigentlich noch viel öfter.
Das ist nicht das Problem.
Code zum ausprobieren:

// *INDENT-OFF*
void setup()
{
  Serial.begin (115200);
  if (-590000 <= -580000) {Serial.println("-590000 ist kleiner -580000");}
  if (-590000 >= -580000) {Serial.println("-590000 ist grösser -580000");}
  if (-590000 <= -550000) {Serial.println("-590000 ist kleiner -550000");}
  if (-590000 >= -550000) {Serial.println("-590000 ist grösser -550000");}
  if (-530000 <= -580000) {Serial.println("-530000 ist kleiner -580000");}
  if (-530000 >= -580000) {Serial.println("-530000 ist grösser -580000");}
  if (-530000 <= -550000) {Serial.println("-530000 ist kleiner -550000");}
  if (-530000 >= -550000) {Serial.println("-530000 ist grösser -550000");}
  if (-560000 <= -580000) {Serial.println("-560000 ist kleiner -580000");}
  if (-560000 >= -580000) {Serial.println("-560000 ist grösser -580000");}
  if (-560000 <= -550000) {Serial.println("-560000 ist kleiner -550000");}
  if (-560000 >= -550000) {Serial.println("-560000 ist grösser -550000");}
}
void loop() {}

Sage mir, wie Dein Code reagieren soll, wenn reading 590000, 560000 oder 530000 ist.

 if(reading <= -580000 && reading >= -550000)

Wenn eine Zahl kleiner als -3 und größer als -1 sein soll dann kenne ich keine Zahl die dem entspricht.

if(reading >= -580000 && reading <= -550000)

Das ist möglich.

Davon sprechen wir genau.

Der HX711 liest eine 24 bit Zahl. Da hat es keinen Sinn diese in Float umzuwandeln. Da verlierst Du Auflösung.

Außerdem wählst Du bei der Waage weder eine Auflösung/Eingänge noch eine Tara.

Grüße Uwe

uwefed:
Wenn eine Zahl kleiner als -3 und größer als -1 sein soll dann kenne ich keine Zahl die dem entspricht.

Das stimmt allerdings.

Lol bin ich dumm :slight_smile:

uwefed:
Außerdem wählst Du bei der Waage weder eine Auflösung/Eingänge noch eine Tara.

Brauche ich das denn wenn ich nur einen Bereich von bis auswerten will?

Dachte nicht das der HX711 so kompliziert ist

Der HX711 hat 2 Eingangskanäle und 3 Verstärkungen.
Eingangskanal A Verstärkung 64 oder 128
Eingangskanal B Verstärkung 32

Die Auswahl welcher Kanal mit welcher Verstärkung gemessen wird wird bei der vorgehenden Messung definiert. Praktisch geschid das mit der Anzahl der Taktimpulse während dem Auslesen der Messung. Es braucht 24 Impulse um die 24 Bit auszulesen. Daran anschließend werden noch 1 bis 3 Impulse angehängt.
1 Impuls (25 total) A 128
2 Impuls (26 total) B 32
3 Impuls (27 total) A 64

Die Verstärkung ist abhängig von der Meßzelle und dem Maximalwert den Du messen willst.

Grüße Uwe

(deleted)

Hab neu Programmiert.
Jetzt läufts .
Danke für die Hilfe.
Schönes Wochenende :slight_smile:

Dann wäre es im Sinne des Forums, wenn Du uns das funktionierende Endergebnis präsentierst.

Gruß Tommy

Was dann doch bisschen seltsam war:

einfach Motor.write (94)
oder Motor.write(35)
hat nicht funktioniert.
Da hat der Nano ziemlich Quatsch gemacht.(Servo ist nicht im ganzen gefahren, Nano ist teils eingefroren, LED´s gingen einfach an...)

Ist mit aufgefallen als ich den Servo mal vom Board genommen hab und auf einmal der Sketch reibungslos lief.

hier der Code:

#include <HX711.h>

#include <Servo.h>
//WAAGE PINS
const int WAAGE_1_DOUT_PIN = 10; // DT Pin des Hx711
const int WAAGE_1_SCK_PIN = 11;  // SCK Pin des Hx711

HX711 waage1;

Servo Motor;

int pos=0;


//LED PINS
const int LED1=2;
const int LED2=3;
const int LED3=4;
const int LED4=5;
const int LED5=6;
const int LED6=7;

//resetpin
int rest=8;

int restz=0;

//irpin
int ir=A0;

//Zähler für EIER
int EIER=0;

//Zähler für IR
int IR=0;

//Zähler für WAAGE
int WAAGE=0;

//Zähler gesammt
int Z=0;

float messwert1=0;








void setup() {
  //pin für Servo
Motor.attach(9);

pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);

pinMode(8,INPUT);

pinMode(A0,INPUT);





  waage1.begin(WAAGE_1_DOUT_PIN, WAAGE_1_SCK_PIN);
}

void loop() {

Z=IR+WAAGE;
  
  if (waage1.is_ready()) 
    {messwert1 = ((waage1.read() * (-0.0001)) - 36) * 0.409;}



  if (messwert1>=6,7 && messwert1<=9)
  {WAAGE=1;}
else {WAAGE=0;}
    
 
    

  if(analogRead (ir) <=100)
  {IR=1;}

  else(IR=0);

delay(500);
  
  if(Z==2)
  {
    
for (pos = 94; pos >= 35; pos -= 1) { // goes from 180 degrees to 0 degrees
    Motor.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }

    
  delay(3000);

  for (pos = 35; pos <= 94; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    Motor.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15); }
  


  
  EIER=EIER+1;}

 
  


  if(digitalRead(8)==HIGH)
  {restz=1;}

  if(digitalRead(8)==LOW)
  {restz=0;}
  

  if (restz==1)
  {EIER=0;}

  

  if(EIER>=2)
  {digitalWrite(2,HIGH);}
  else{digitalWrite(2,LOW);}

 

  if(EIER>=4)
  {digitalWrite(3,HIGH);}
  else{digitalWrite(3,LOW);}

  

  if(EIER>=6)
  {digitalWrite(4,HIGH);}
  else{digitalWrite(4,LOW);}

  
  

  if(EIER>=8)
  {digitalWrite(5,HIGH);}
  else{digitalWrite(5,LOW);}



  if(EIER>=10)
  {digitalWrite(6,HIGH);}
  else{digitalWrite(6,LOW);}



  if(EIER>=12)
  {digitalWrite(7,HIGH);}
  else{digitalWrite(7,LOW);}




 
   if(analogRead (ir) >=100)
  {IR=0;}


  delay(2000);

}

(deleted)

Peter-CAD-HST:
Moin hahniii
die Zustandsvariable Z zum Steuern des Servos wird nicht zurückgesetzt
PseudoCode:
If (Z==2)
{
SchrankeAuf;
3 Sekunden warten, Eier rollen lassen
SchrankeZu;
Eier++;
Z=0;
}
Gruss Peter
und gesund bleiben

Stimmt danke.

Eier++; hatte bei mir nicht funktioniert.
Es werden dann pro Durchlauf seltsamerweise 2 Eier gezählt.

Und ein Problem gibt es dann doch noch.
Die Klappe geht auch auf wenn zu viel Gewicht auf der Waage ist.

Ich hatte mal versucht nach dem ersten if der überprüft ob das Gewicht in Ordnung ist einen zweiten zu machen der die Variable WAAGE wieder auf 0 setzt wenn das Gewicht zu hoch ist.

Bekomme dann aber keine Zustandsänderung der Variable mehr, selbst wenn das Gewicht in Ordnung ist. WAAGE ist dann immer 0.

Jemand eine Idee?