Infrarotpersonenzähler

Ich habe ein Problem:
Ich hatte vor mit zwei Arduinos einen Personenzähler zu machen (offensichtlich) und das auf einem LC Display anzuzeigen wie viele personen schon durch sind. Damit die Arduino weiß wann eine Person reingeht und Raus, wollen ich zwei infrarotschranken bauen und einstellen das die person beim reingehen die erste und dann die zweite auslösen muss damit die Arduino zählt, mein richtiges Problem ist das ich nicht mal gebacken bekomme das die Arduino bei einer Infrarotschranke zählt, wenn das Signal unterbrochen wird.

Der Code der Arduino die das Signal empfängt:

#include <LiquidCrystal.h>
#define IRpin_PIN PIND
#define IRpin 2
#define MAXPULSE 65000
#define RESOLUTION 20

int led = 3;
uint8_t currentpulse = 0;
int person = 0; 
 uint16_t highpulse, lowpulse; 
  
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);


void setup(void) {
  lcd.begin(16, 2);
  lcd.print("Personenanzahl:");
  
  Serial.begin(9600);
  Serial.println("Ready to decode IR!");

  highpulse = lowpulse = 0; 
}

void loop(void) {
 

  lcd.setCursor(0, 1);
  lcd.print(highpulse);
  
  lcd.setCursor(10, 1);
  lcd.print(person);
  //delay(500);
  
if (digitalRead(IRpin) == 1){
  Serial.println("Debug 1");
  digitalWrite(led, LOW);
  } 
  if (digitalRead(IRpin) != 1){
    Serial.println("Debug 2");
    digitalWrite(led, HIGH);
    }
  
}

Code der Arduino die sendet:

// This sketch will send out a Nikon D50 trigger signal (probably works with most Nikons)
// See the full tutorial at http://www.ladyada.net/learn/sensors/ir.html
// this code is public domain, please enjoy!
 
int IRledPin =  2;    // LED connected to digital pin 13
 
// The setup() method runs once, when the sketch starts
 
void setup()   {                
  // initialize the IR digital pin as an output:
  pinMode(IRledPin, OUTPUT);      
 
  Serial.begin(9600);
}
 
void loop()                     
{
  Serial.println("Sending IR signal");
 
 SendNikonCode();
 
  delay(60*1000);  // wait one minute (60 seconds * 1000 milliseconds)
}
 
// This procedure sends a 38KHz pulse to the IRledPin 
// for a certain # of microseconds. We'll use this whenever we need to send codes
void pulseIR(long microsecs) {
  // we'll count down from the number of microseconds we are told to wait
 
  cli();  // this turns off any background interrupts
 
  while (microsecs > 0) {
    // 38 kHz is about 13 microseconds high and 13 microseconds low
   digitalWrite(IRledPin, HIGH);  // this takes about 3 microseconds to happen
   delayMicroseconds(10);         // hang out for 10 microseconds, you can also change this to 9 if its not working
   digitalWrite(IRledPin, LOW);   // this also takes about 3 microseconds
   delayMicroseconds(10);         // hang out for 10 microseconds, you can also change this to 9 if its not working
 
   // so 26 microseconds altogether
   microsecs -= 26;
  }
 
  sei();  // this turns them back on
}
 
void SendNikonCode() {
  // This is the code for my particular Nikon, for others use the tutorial
  // to 'grab' the proper code from the remote
 
  pulseIR(2080);
  delay(27);
  pulseIR(440);
  delayMicroseconds(1500);
  pulseIR(460);
  delayMicroseconds(3440);
  pulseIR(480);
 
 
  delay(65); // wait 65 milliseconds before sending it again
 
  pulseIR(2000);
  delay(27);
  pulseIR(440);
  delayMicroseconds(1500);
  pulseIR(460);
  delayMicroseconds(3440);
  pulseIR(480);
}

Ich hoffe mir kann jemand helfen.

Der Sende-Arduino schickt ein "wildes" IR - Bitmuster (wie lange dauert das ?) und macht dann eine Minute lang gar nichts.

Was hat das mit einer Lichtschranke zum Zählen zu tun?

Erstmal musst du es schaffen, 38 kHz Pulse von Dauer- oder anderen Störungen zu unterscheiden.
Wenn du sicher bist, dass kein Dauer-IR sonstwoher deinen Empfänger "blendet" kannst du bei Lücken im regelmäßigen 38 kHz IR-Signal annehmen, dass gerade eben was in deiner Lichtschranke ist.

Das reicht dann als Basis für einen Carrerabahn-Rundenzähler, wenn nur 1 Auto unterwegs ist und immer in der gleichen Spur in die gleiche Richtung fährt.

Vom Personenzähler bist du dann aber noch weit entfernt, leider.

Warum das ganze mit 2 Arduinos? Warum nicht 2 Lichtschranken an einem Arduino? Ich habe hier 2 Anleitungen für dich vielleicht helfen die dir?

Ich habe solch ein Projekt auch noch in Planung, bin nur noch nicht zur umsetztung gekommen. Hatte mir die Links aber für später gespeichert. Vielleicht helfen sie dir ja weiter :slight_smile:

Übrigens: Nur eher wenige Infrarot-Empfänger können gut mit "Dauersignal" umgehen und sind deshalb auch für Lichtschranken gut geeignet.

Für Lichtschrankenanwendungen besser TSOP Module verwenden, die auch "continous mode" zusätzlich zum "burst mode" unterstützen. Sonst bekommst Du möglicherweise alle paar Sekunden eine Phantom-Unterbrechung, wo in Wirklichkeit keine da ist.

Dieser Empfänger (Beispiel) unterstützt zum Beispiel auch "continous mode" - siehe Datenblatt: http://www.vishay.com/docs/81926/tsop4038.pdf

hier ist mal mein beispiel. anwendung war bei mir so gedacht das die Sensoren hintereinander sind und erkennen in welche richtung eine person läuft jedoch konnte ich das problem noch nicht lösen das er erst hochzählt und direkt wieder runter wenn einer den Raum betritt. aber neben einander mit separatem ein und ausgang sollte das perfekt funktionieren.

#include <LiquidCrystal.h>


LiquidCrystal lcd(9, 8, 7, 6, 5, 4);


#include <stdint.h>





int LED = 10;


const int Sensortrigger_1 = 2;                  


const int Sensortrigger_2 = 3;





int count = 0;





volatile boolean Sensor_1 = false;              //die Variable als volatile angeben damit die ISR die Variale erkennt


volatile boolean Sensor_2 = false;              //die Variable als volatile angeben damit die ISR die Variale erkennt


void setup()


{


pinMode(LED, OUTPUT);


pinMode(Sensortrigger_1, INPUT);


pinMode(Sensortrigger_2,INPUT);





attachInterrupt(0, SensorState_1, RISING);   //die Angabe welcher Interruptpin hier auschlaggebend ist (Digitalpin "2"), was die ISR dann ist und bei welchen MODE 


attachInterrupt(1, SensorState_2, RISING);   //die Angabe welcher Interruptpin hier auschlaggebend ist (Digitalpin "3"), was die ISR dann ist und bei welchen MODE 








lcd.begin(16, 2);





lcd.setCursor(0, 0);


lcd.print("Soll Zahl:");





lcd.setCursor(0, 1);


lcd.print("Ist Zahl:");








}








void loop()


{





}


void SensorState_1()        //reinlaufen


{


if(Sensor_1)


 {


  Sensor_1 = false;         //Wenn Sensor LOW soll er nicht machen. 


  digitalWrite(LED,LOW);


 }


 else


 {


  Sensor_1 = true;          //hier wird geprüft ob der Sensor von LOW auf HIGH wechselt


  


  


  count++;                  //erkennt der Arduino das HIGH signal zählt er um 1 hoch und gibt dies auf dem LCD wieder


   digitalWrite(LED, HIGH);


   lcd.clear();


   lcd.setCursor(0, 0);


   lcd.print("Soll Zahl:");


   lcd.setCursor(0, 1);


   lcd.print("Ist Zahl:");





   if (count>=10)


  {


    lcd.setCursor(10,1);


  }


   if(count<=9)


  {


    lcd.setCursor(11,1);


  }


  else


  {


  lcd.setCursor(10, 1);     


  }


  lcd.print(count);


 }


 if(Sensor_1)


 {


  Sensor_1 = false;               //geht der Sensor wieder auf LOW soll er den Ausgang der LED auf LOW schreiben.


  digitalWrite(LED,LOW);


 


 }


}





void SensorState_2()                  //rauslaufen


{


if(Sensor_2)


 {


  Sensor_2 = false;                 //Wenn Sensor LOW soll er nicht machen. 


  digitalWrite(LED,LOW);


 }


 else


 {


  Sensor_2 = true;                  //hier wird geprüft ob der Sensor von LOW auf HIGH wechselt


   count--;                         //erkennt der Arduino das HIGH signal zählt er um 1 runter und gibt dies auf dem LCD wieder


   digitalWrite(LED, HIGH); 


   lcd.clear();


   lcd.setCursor(0, 0);


   lcd.print("Soll Zahl:");


   lcd.setCursor(0, 1);


   lcd.print("Ist Zahl:");


   


    if (count>=10)


  {


    lcd.setCursor(10,1);


  }


   if(count<=9)


  {


    lcd.setCursor(11,1); 


  }


  else


  {


  lcd.setCursor(10, 1); 


  }


  lcd.print(count);


 }


 


 if(Sensor_2)


 {


  Sensor_2 = false;               //geht der Sensor wieder auf LOW soll er den Ausgang der LED auf LOW schreiben.


  digitalWrite(LED,LOW);


 }








}

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

misttergamer:
hier ist mal mein beispiel.

Moment mal!
Du gräbst einen 4Jahre alten Thread aus nachdem Du in

mit einem "Lernobjekt" um die Ecke kommst?

Vielleicht löschst Du Deinen Beitrag, da er nichts beiträgt - der Rest wird dann schon so erledigt.

hier ist mal mein beispiel

Sorry, das Beispiel ist für mich nicht lesbar!

Da solltest du mal alle überflüssigen Leerzeichen rauslöschen, dann wird es auch lesbar.