This shows you the differences between two versions of the page.
pm:prj2021:avaduva:personcounter [2021/06/01 13:51] alexandru.trufelea |
pm:prj2021:avaduva:personcounter [2021/06/01 18:42] (current) alexandru.trufelea [Download] |
||
---|---|---|---|
Line 2: | Line 2: | ||
- | Autor: Trufelea Alexandru-Mihai | + | Autor: Trufelea Alexandru-Mihai 333CA |
===== Introducere ===== | ===== Introducere ===== | ||
Line 36: | Line 36: | ||
==== Software Design ==== | ==== Software Design ==== | ||
- | Informatii generale | + | #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 == HIGH && pirStatOUT == LOW) { | ||
+ | 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 ==== | ==== Rezultate Obtinute ==== | ||
+ | == Poze dispozitiv == | ||
+ | | ||
+ | {{:pm:prj2021:avaduva:ansamblu.jpg?200|}} | ||
+ | Placuta arduino este legata la pc printr-un cablu usb (poate fi folosita si o baterie de 9V ca sursa electrica). | ||
+ | Servo motorul este alimentata cu o baterie de 9V. | ||
+ | Cei doi senzori si display-ul LCD sunt conectati la port-ul de 5V ai placutei. | ||
+ | |||
+ | {{:pm:prj2021:avaduva:stare_in_per_count.jpeg?200|}} | ||
+ | |||
+ | Aceasta este starea initiala a proiectului. LED-ul este aprins pentru 6 secunde, timp in care, placuta este in standby. Acest timp este folosit pentru a face calibrarea senzorilor cu infrarosu. | ||
+ | Dupa 6 secunde senzorii sunt pregatiti de utilizare. | ||
+ | |||
+ | {{:pm:prj2021:avaduva:gol.jpg?200|}} | ||
+ | |||
+ | Dupa cele 6 secunde de standby display-ul afiseaza mesajul "Gol" (deoarece nu a trecut niciun stimul in raza de acoperire a senzorilor). | ||
+ | |||
+ | {{:pm:prj2021:avaduva:oameni.jpg?200|}} | ||
+ | |||
+ | In momentul in care o persoana intra in raza de actiune a senzorului acesta trimite un semnal catre servo motor, incrementeaza variabila folosita pentru contorizarea persoanelor (num_ppl) si afiseaza numarul curent al persoanelor. | ||
+ | |||
+ | |||
+ | Mod de functionare: [[https://www.youtube.com/watch?v=WPYJmkdEpPE]] | ||
==== Concluzii ==== | ==== Concluzii ==== | ||
+ | A fost o experienta placuta si un mod bun de a-mi insusi cunostinte noi. | ||
==== Download ==== | ==== Download ==== | ||
+ | Arhiva proiect: {{:pm:prj2021:avaduva:proiect_pm.zip|}} | ||
+ | |||
+ | Documentatia in format pdf: {{:pm:prj2021:avaduva:person_counter.pdf|}} | ||
==== Jurnal ==== | ==== Jurnal ==== | ||
+ | **Etapa 1** - alegerea temei si realizarea unei simulari pe platforma tinkercad ( https://www.tinkercad.com/things/ldqgiTpitnz ) | ||
+ | **Etapa 2** - asamblarea componenteleor | ||
+ | |||
+ | **Etapa 3** - implementare cod + schema electrica + finalizare documentatie | ||
==== Bibliografie/Resurse ==== | ==== Bibliografie/Resurse ==== | ||
+ | [[https://www.youtube.com/c/Dronebotworkshop1]] | ||
+ | |||
+ | |||
+ | [[https://create.arduino.cc/projecthub/electropeak/pir-motion-sensor-how-to-use-pirs-w-arduino-raspberry-pi-18d7fa]] | ||
+ | |||
+ | [[https://www.optimusdigital.ro/en/]] |