Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2024:vstoica:bogdan.dumitru2304 [2024/05/17 19:18]
bogdan.dumitru2304 [Hardware Design]
pm:prj2024:vstoica:bogdan.dumitru2304 [2024/05/31 13:54] (current)
bogdan.dumitru2304 [Bibliografie/Resurse]
Line 8: Line 8:
  
 Acest proiect fiind un POC, poate fi expandat prin folosirea unor componente mult mai avansate, care pot fi folosite si pe distante mai mari si avand o precizie mult mai bune decat cele din kit-ul pe care il voi folosi eu pentru acest mini proiect. Astfel, poate deservi si ca un punct de inspiratie si pentru alte persoane care doresc sa implementeze mici proiecte / sisteme. Acest proiect fiind un POC, poate fi expandat prin folosirea unor componente mult mai avansate, care pot fi folosite si pe distante mai mari si avand o precizie mult mai bune decat cele din kit-ul pe care il voi folosi eu pentru acest mini proiect. Astfel, poate deservi si ca un punct de inspiratie si pentru alte persoane care doresc sa implementeze mici proiecte / sisteme.
-<note tip> +
-Prezentarea pe scurt a proiectului vostru: +
-  * ce face +
-  * care este scopul lui +
-  * care a fost ideea de la care aţi pornit +
-  * de ce credeţi că este util pentru alţii şi pentru voi +
-</​note>​+
 ===== Descriere generală ===== ===== Descriere generală =====
  
Line 27: Line 21:
 ==Descriere intereactiune hardware si a componentelor== ==Descriere intereactiune hardware si a componentelor==
  
-1. Dupa pornirea sistemului, senzorul de miscare este inactiv pentru o perioada de timp, pentru a se putea calibra. Acest lucru este indicat de mesajul de pe ecranul LCD. +  * Dupa pornirea sistemului, senzorul de miscare este inactiv pentru o perioada de timp, pentru a se putea calibra. Acest lucru este indicat de mesajul de pe ecranul LCD. 
-2. Sistemul este armat de la inceput, indicat de LED-ul RGB rosu care este aprins continuu, precum si de mesajul "​System On". +  ​* ​Sistemul este armat de la inceput, indicat de LED-ul RGB rosu care este aprins continuu, precum si de mesajul "​System On". 
-3. Prin apasarea unui buton, sistemul se poate dezactiva / activa. +  ​* ​Prin apasarea unui buton, sistemul se poate dezactiva / activa. 
-4. Daca sistemul este activat, iar senzorul PIR detecteaza miscare, se trimite un semnal catre microprocesor,​ iar un buzzer si un LED rosu se vor activa, precum si afisarea unui mesaj sugestiv pe ecran. Dupa ce miscarea nu mai este detectata, buzzerul si LED-ul se vor opri.+  ​* ​Daca sistemul este activat, iar senzorul PIR detecteaza miscare, se trimite un semnal catre microprocesor,​ iar un buzzer si un LED rosu se vor activa, precum si afisarea unui mesaj sugestiv pe ecran. Dupa ce miscarea nu mai este detectata, buzzerul si LED-ul se vor opri.
  
-<note tip> 
-O schemă bloc cu toate modulele proiectului vostru, atât software cât şi hardware însoţită de o descriere a acestora precum şi a modului în care interacţionează. 
- 
-Exemplu de schemă bloc: http://​www.robs-projects.com/​mp3proj/​newplayer.html 
-</​note>​ 
  
 ===== Hardware Design ===== ===== Hardware Design =====
 +==Componentele pe care le voi folosi sunt urmatoarele==
 +  * Placuta Arduino Uno R3 (ATMega 328P)
 +  * Breadboard
 +  * LED rosu, care se va aprinde in momentul in care este detectata miscare.
 +  * LED RGB. Culorile rosu si verde sunt folosite pentru a indica daca sistemul este pornit sau oprit.
 +  * Buzzer pasiv care va emite sunet cand se va detecta miscare.
 +  * Modul senzor cu infrarosu (PIR HC-SR501), folosit pentru detectarea miscarii
 +  * 1602 LCD, interfata I2C, folosit pentru a afisa starea sistemului si daca s-a detectat miscare
 +  * Buton
  
-<note tip> 
-Aici puneţi tot ce ţine de hardware design: 
-  * listă de piese 
-  * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri,​ e.g. http://​www.captain.at/​electronic-atmega16-mmc-schematic.png) 
-  * diagrame de semnal ​ 
-  * rezultatele simulării 
-</​note>​ 
-<note tip> 
-Componentele pe care le voi folosi sunt urmatoarele:​ 
-  - Placuta Arduino Uno R3 (ATMega 328P) 
-  - Breadboard 
-  - LED rosu 
-  - LED RGB 
-  - Buzzer pasiv 
-  - Modul senzor cu infrarosu (PIR HC-SR501) 
-  - 1602 LCD, interfata I2C 
-  - Buton 
-</​note>​ 
  
 ==Ansamblu placuta + componente== ==Ansamblu placuta + componente==
 {{:​pm:​prj2024:​vstoica:​bogdan.dumitru2304:​photo_circuit.png?​nolink&​800|}} {{:​pm:​prj2024:​vstoica:​bogdan.dumitru2304:​photo_circuit.png?​nolink&​800|}}
 +
 +{{:​pm:​prj2024:​vstoica:​bogdan.dumitru2304:​poza_ansamblu.jpeg?​800|}}
 +
 +Fata de schema de pe tinkercad, aici se poate vedea si LED-ul RGB pe care il folosesc. Prin apasarea butonului sau dupa ce trec 15 secunde fara sa fie detectata vreo miscare, sistemul se dezactiveaza,​ si se aprinde LED-ul verde si se afiseaza pe ecran mesajul corespunzator.
 +
 +{{:​pm:​prj2024:​vstoica:​bogdan.dumitru2304:​whatsapp_image_2024-05-22_at_4.17.26_pm.jpeg?​800|}}
 +
 +==Pini folositi==
 +  * Pinul 13 este folosit pentru a aprinde LED-ul rosu in caz ca este detectata miscare
 +  * Pinul 10 este folosit pentru a citit input-ul de la senzor, iar daca se detecteaza miscare, starea acestuia va fi "​High"​
 +  * Pinul 5 est dedicat buzzer-ului pentru a-l porni / opri
 +  * Pinul 2 este pentru butonul care imi opreste / porneste sistemul
 +  * Pinii 6 si 7 sunt folositi pentru LED-ul RGB, pentru culorile rosu si verde, respectiv.
  
 ===== Software Design ===== ===== Software Design =====
 +==Mediu de Dezvoltare==
 +Arduino IDE, apoi mai tarziu am folosit VSC cu PlatformIO, importand proiectul de Arduino scris anterior.
  
 +==Librarii 3rd-party==
 +Am folosit pentru display-ul LCD biblioteca arduino LiquidCrystal_I2C.
  
-<note tip+==Detalii despre cod== 
-Descrierea codului aplicaţiei ​(firmware): +  * Functia setup(): am setat toti pinii ca INPUT sau OUTPUT, am initializat LCD-ul, senzorul de miscare si am configurat intreruperile pe buton, folosint functii Arduino, si pe timer, folosind registrii. 
-  ​* mediu de dezvoltare ​(if any) (e.g. AVR StudioCodeVisionAVR+<code c++
-  ​* librării şi surse 3rd-party ​(e.g. Procyon AVRlib+void setup() 
-  ​* algoritmi şi structuri pe care plănuiţi să le implementaţi +{ 
-  ​(etapa 3surse şi funcţii implementate +  ​Serial.begin(9600)
-</note>+  pinMode(pirPinINPUT); 
 +  ​pinMode(ledPin, OUTPUT); 
 +  ​pinMode(buzzerPin,​ OUTPUT); 
 +  ​pinMode(RGB_RED_PIN,​ OUTPUT); 
 +  ​pinMode(RGB_GREEN_PIN,​ OUTPUT); 
 +  pinMode(buttonPin,​ INPUT_PULLUP); ​// Set button pin as input with pull-up resistor
  
-===== Rezultate Obţinute =====+  digitalWrite(pirPin,​ LOW); 
 +  lcd_1.init();​ 
 +  lcd_1.backlight();​ 
 +  Serial.println("​Hello World!"​);​ 
 +  lcd_1.print("​Starting..."​);​ 
 +  pinMode(9, OUTPUT);
  
-<note tip> +  ​// Attach interrupt to button pin 
-Care au fost rezultatele obţinute în urma realizării proiectului vostru. +  attachInterrupt(digitalPinToInterrupt(buttonPin),​ toggleSystem,​ FALLING);
-</note>+
  
-===== Concluzii =====+  // Timer1 configuration:​ 1Hz (1 second interval) 
 +  cli(); ​                    // Disable all interrupts 
 +  TCCR1A ​0;                          // Set entire TCCR1A register to 0 
 +  TCCR1B ​0;                          // Same for TCCR1B 
 +  TCNT1 0;                           // Initialize counter value to 0 
 +  OCR1A 15624; ​                      // Compare match register (16MHz/​1024/​1Hz - 1) 
 +  TCCR1B |(1 << WGM12); ​             // CTC mode 
 +  TCCR1B |(1 << CS12) | (1 << CS10); // 1024 prescaler 
 +  TIMSK1 |(1 << OCIE1A); ​            // Enable timer compare interrupt 
 +  sei(); ​                       // Enable all interrupts
  
 +  // Give the sensor some time to calibrate
 +  Serial.print("​Calibrating sensor ");
 +  for (int i = 0; i < calibrationTime;​ i++)
 +  {
 +    Serial.print("​."​);​
 +    delay(1000);​
 +  }
 +  Serial.println("​\nDone"​);​
 +  Serial.println("​SENSOR ACTIVE"​);​
 +  delay(50);
 +}
 +</​code>​
 + 
 +  * Functia loop(): Aici se intampla toata "​magia"​ din cod. Se verifica la fiecare iteratie daca sistemul este pornit sau oprit si daca este miscare detectata. ​
 +<code c++> void loop()
 +{
 +  // Set RGB LED state
 +  if (isOn)
 +  {
 +    digitalWrite(RGB_RED_PIN,​ HIGH);
 +    digitalWrite(RGB_GREEN_PIN,​ LOW);
 +  }
 +  else
 +  {
 +    digitalWrite(RGB_RED_PIN,​ LOW);
 +    digitalWrite(RGB_GREEN_PIN,​ HIGH);
 +  }
 +
 +  // Update LCD if state changed
 +  if (isOn != lastState)
 +  {
 +    lastState = isOn;
 +    lcd_1.clear();​
 +    lcd_1.setCursor(0,​ 0);
 +    if (isOn)
 +    {
 +      lcd_1.print("​System ON");
 +    }
 +    else
 +    {
 +      lcd_1.print("​System OFF");
 +    }
 +  }
 +
 +  // Handle PIR sensor
 +  if (isOn)
 +  {
 +    if (digitalRead(pirPin) == HIGH)
 +    {
 +      digitalWrite(buzzerPin,​ HIGH); // Turn on the buzzer
 +      if (lockLow)
 +      {
 +        lockLow = false;
 +        Serial.println("​---"​);​
 +        Serial.print("​Motion detected at ");
 +        lcd_1.clear();​
 +        lcd_1.print("​Detected Movement"​);​
 +        Serial.print(millis() / 1000);
 +        Serial.println("​ sec");
 +        delay(50);
 +      }
 +      takeLowTime = true;
 +      lastActivityTime = millis(); // Reset the activity timer
 +    }
 +
 +    digitalWrite(ledPin,​ digitalRead(pirPin));​
 +    digitalWrite(buzzerPin,​ digitalRead(pirPin));​ // Turn on the buzzer
 +
 +    if (digitalRead(pirPin) == LOW)
 +    {
 +      digitalWrite(ledPin,​ LOW);    // Visualize sensor output state with LED
 +      digitalWrite(buzzerPin,​ LOW); // Turn off the buzzer
 +      if (takeLowTime)
 +      {
 +        lowIn = millis();
 +        takeLowTime = false;
 +      }
 +      if (!lockLow && millis() - lowIn > pause)
 +      {
 +        lockLow = true;
 +        Serial.print("​Motion ended at ");
 +        Serial.print((millis() - pause) / 1000);
 +        Serial.println("​ sec");
 +        lcd_1.clear();​
 +        lcd_1.print("​Movement Stopped"​);​
 +        delay(50);
 +      }
 +    }
 +  }
 +} </​code>​
 +  * Variabile si tratarea intreruperilor: ​
 +  * Pentru intreruperile de timer si buton, am o rutina speciala in care opresc / pornesc sistemul si actualizez mesajul de pe LCD si culoarea LED-ului RGB corespunzator.
 +<code c++>
 +LiquidCrystal_I2C lcd_1(0x27, 16, 2);
 +int calibrationTime = 5; // Calibration time for the PIR sensor
 +
 +volatile bool isOn = true; // Make isOn volatile since it will be accessed from an interrupt
 +bool lastState = false;
 +long unsigned int lowIn;
 +long unsigned int pause = 200; // Pause duration before assuming motion has stopped
 +boolean lockLow = true;
 +boolean takeLowTime = false;
 +int ledPin = 13;   // LED pin for visualization
 +int pirPin = 10;   // PIR sensor pin
 +int buzzerPin = 5; // Buzzer pin
 +int buttonPin = 2; // Button pin for interrupt
 +
 +int RGB_RED_PIN = 6;
 +int RGB_GREEN_PIN = 7;
 +
 +boolean systemActive = true;
 +
 +// Debounce variables
 +volatile unsigned long lastDebounceTime = 0;
 +const unsigned long debounceDelay = 50; // 50 milliseconds debounce time
 +
 +// Timer variables
 +volatile unsigned long lastActivityTime = 0; // Last time activity was detected
 +const unsigned long shutdownDelay = 15000; ​  // 10 seconds delay before shutdown
 +
 +void toggleSystem()
 +{
 +  // Check if enough time has passed since the last press to debounce
 +  if ((millis() - lastDebounceTime) > debounceDelay)
 +  {
 +    isOn = !isOn;
 +    lastDebounceTime = millis(); // Update the last debounce time
 +    lastActivityTime = millis(); // Reset the activity timer
 +  }
 +}
 +ISR(TIMER1_COMPA_vect)
 +{
 +  // Timer1 ISR: Increment seconds counter
 +  if (isOn && millis() - lastActivityTime >= shutdownDelay)
 +  {
 +    isOn = false;
 +  }
 +}
 +</​code>​
 +==Explicatii cod==
 +Dupa ce am asignat fiecarei componente un pin, am setat corespunzator acel pin ca fiind de input sau output. Apoi am oferit senzorului PIR un timp de 5 secunde pentru calibrare, altfel ar avea un comportament imprevizibil.
 +
 +Intreruperile pe timer si pe buton sunt folosite doar pentru a opri sau a porni sistemul. ​
 +
 +In momentul in care senzorul de PIR detecteaza miscare, trimite un semnal catre microcontroller,​ iar in cod se verifica daca sistemul este pornit sau oprit. In cazul in care sistemul este oprit, nu se va intampla nimic. In caz contrar, cat timp este miscare detectata se va aprinde un LED rosu si buzzerul va emite un sunet, indicand prezenta unui intrus.
 +
 +Daca timp de 15 secunde nu este detectata nicio miscare, sistemul se va opri.
 +
 +===== Rezultate Obţinute =====
 +Am invatat cum sa conectez, folosind un bradboard, componentele,​ urmarind data-sheet-ul pentru fiecare componenta in parte. Apoi am invatat cat de usor este sa scriu cod Arduino pentru a face un mic proiect, chiar daca pe alocuri am facut niste greseli stupide, fie in cod, fie cand incercam sa conectez componentele.
 +
 +Am reusit, totusi, sa implementez cu succes un mic sistem de alarma care foloseste un senzor cu infrarosu, chiar daca acum imi dau seama ca nu era chiar atat de greu pe cat ma asteptam initial. Cautand explicatii pe internet sau prin trial and error, in decursul a cateva zile am ajuns de la o multime de piese intr-o cutie de plastic la ceva practic si functional.
 +===== Concluzii =====
 +A fost un proiect interesant si amuzant, desi mi-as fi dorit sa am mai mult timp la dispozitie sa fac ceva mai complex si mai interesant, dar am crezut la inceput ca va fi foarte greu si de aceea am ales o tema mai usor de implementat. Daca as putea sa aleg din nou tema proiectului,​ as alege tot un sistem de alarma, dar l-as face mai complex si la scara poate mai mare.
 ===== Download ===== ===== Download =====
  
Line 90: Line 259:
  
 ===== Jurnal ===== ===== Jurnal =====
- +  * Dupa ce am ales tema, am comandat kit-ul cu toate (sau aproape toate :P) componentele de pe Emag. 
-<note tip> +  * Am inceput sa caut pe net toate datasheet-urile componetelor care mi-au venit si mi-am dat seama ca imi lipseste senzorul de miscare, fix componenta principala din proiect, deci am comandat-separat. 
-Puteți avea și secțiune ​de jurnal în care să poată urmări asistentul ​de proiect progresul proiectului+  * Am facut mai multe simulari pe TinkerCad, din frica de a nu arde componente si de a ma asigura ca problemele ​care apar in cod pot fi reparate inainte ​de produsul final
-</note>+  * Am inceput asamblarea fizica a sistemului. 
 +  * M-am chinuit sa imi dau seama ca senzorul de miscare este mult prea sensibil, deci a trebuit sa rezolv asta. A fost un fix usor de facut, doar am umblat la potentiometre pana cand am obtinut un senzor destul de sensibil incat sa detecteze miscare, dar care sa nu fie 24/7 pornit. 
 +  * Am scris codul initial, am testat si totul mergea ok, apoi am inceput sa folosesc intreruperi si sa schimb niste cod sa fie folositi si registrii, nu doar functii arduino.
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
Line 100: Line 271:
 Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**.
 </​note>​ </​note>​
 +
 +{{:​pm:​prj2024:​vstoica:​bogdan.dumitru2304:​proiect_pm.zip|}}
  
 <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​ <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​
  
pm/prj2024/vstoica/bogdan.dumitru2304.1715962736.txt.gz · Last modified: 2024/05/17 19:18 by bogdan.dumitru2304
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