This is an old revision of the document!


Person Counter

Autor: Trufelea Alexandru-Mihai

Introducere

Scopul acestui proiect este de a crea o metodă prin care se poate determina numărul de persoane care intră și ies dintr-o încăpere. Pentru implementare voi folosi doi senzori de miscare ce vor monitoriza numarul de persoane ce intra si ies dintr-o incapere. De asemenea, voi folosi un servomotor pentru a simula o usa ce se deschide automat.

Descriere generala

Proiectul se va comporta precum o usa automata. In plus voi retine numarul persoanelor care trec pe usa.

Acesta functioneaza pe baza a doi PIR HC-SR501 care monitorizeaza miscarea din mediul ambiental, un servo motor ce reprezinta usa si un display lcd pe care se afiseaza numarul de persoane ce trec pe usa.

Hardware Design

Schema electrica

Componente

Placă de dezvoltare compatibilă cu Arduino UNO
Breadboard 
Modul Senzor PIR HC-SR501 x 2
Fire Colorate Tată-Tată
Servomotor
LED-uri RGB
LCD 1602
Fire Colorate Mamă-Tată

Software Design

#include<LiquidCrystal.h>
#include <Servo.h>
int pos = -180;
int pinPirINTRARE = 2;
int pinPirIESIRE = 12;
int pirStatIN = 0;
int pirStatOUT = 0;
int num_ppl = 0;
int motionIN = 0;
int motionOUT = 0;
Servo servo_3;
LiquidCrystal lcd(8,9,4,5,6,7);
void print_ppl(int ppl)
{
  if (ppl > 0) {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(num_ppl);
    lcd.setCursor(2,0);
    lcd.print(" Oameni");
  }

  if (ppl == 0) {
    lcd.clear();
    lcd.println("Gol");
  }
}
void setup()
{
    lcd.begin(16, 2);
    servo_3.attach(3, 500, 2500);
    pinMode(11, OUTPUT);
    pinMode(pinPirINTRARE, INPUT);     
    pinMode(pinPirIESIRE, INPUT);  
    digitalWrite(11, HIGH);
    delay(60000);  
    digitalWrite(11, LOW);
    print_ppl(num_ppl);
}

void loop()
{
  pirStatIN  = digitalRead(pinPirINTRARE); 
  pirStatOUT = digitalRead(pinPirIESIRE); 

  delay(500);
  
  if (pirStatOUT == HIGH && pirStatIN == LOW) {
     if (num_ppl > 0) {
         num_ppl--;

         for (pos = 0; pos <= 180; pos += 1) {
              servo_3.write(pos);
              delay(25);
         }
         print_ppl(num_ppl); 
         motionOUT = 1;
     } else if (num_ppl == 0) {
          print_ppl(num_ppl);
     }  
  }

  if (motionOUT == 1) {
      digitalWrite(11, HIGH);
      delay(6000);
      digitalWrite(11, LOW);  
  }
  
  if (pirStatIN == 1) {
     num_ppl++;
    
     for (pos = 0; pos <= 180; pos += 1) {
           servo_3.write(pos);
           delay(25);
    }
    print_ppl(num_ppl);
    motionIN = 1;
  } 

  if (motionIN == 1) {
      digitalWrite(11, HIGH);
      delay(6000);
      digitalWrite(11, LOW);  
    }

  Serial.println(num_ppl);
  delay(500);

}
Functii folosite

print_ppl(int ppl) - Aceasta functie afiseaza numarul persoanelor din incapere. Am implementat aceasta functie cu scopul de a face mai usoara afisarea si de a reduce numarul liniilor de cod din loop().

setup() - In aceasta functie setez pinii de input(pinul 2 pentru senzorul ce se afla “afara” si pinul 12 pentru senzorul din “interior”) si output(pinul 11 folosit de un led). De asemenea, pornesc display-ul si atasez comanda servo motorului pinului 3. Led-ul este folosit pentru a vedea cand sunt senzorii activi.

loop() - In loop() am implementat logica functionarii programului. Daca senzorii detecteaza miscare se trimite un semnal catre “usa” care se deschide, urmand ca dupa un delay scurt sa se inchida, in final, numarul persoanelor din incapere este afisat pe display.

Rezultate Obtinute

Concluzii

Download

Jurnal

Bibliografie/Resurse

pm/prj2021/avaduva/personcounter.1622546116.txt.gz · Last modified: 2021/06/01 14:15 by alexandru.trufelea
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0