This shows you the differences between two versions of the page.
pm:prj2025:iotelea:emilian.horduna [2025/05/26 19:53] emilian.horduna [Bibliografie/Resurse] |
pm:prj2025:iotelea:emilian.horduna [2025/05/27 19:22] (current) emilian.horduna [Bibliografie/Resurse] |
||
---|---|---|---|
Line 35: | Line 35: | ||
- blocarea automată a ușii. | - blocarea automată a ușii. | ||
- | {{:pm:prj2025:iotelea:emi-schema-bloc_1_.png?700}} | + | {{:pm:prj2025:iotelea:emi-schema-bloc2.drawio.png?700|}} |
Actor → Keypad 4x4 → Arduino UNO R3: | Actor → Keypad 4x4 → Arduino UNO R3: | ||
Line 89: | Line 89: | ||
{{:pm:prj2025:iotelea:unfinished-safe-rear.jpg?700|}} | {{:pm:prj2025:iotelea:unfinished-safe-rear.jpg?700|}} | ||
+ | |||
+ | {{:pm:prj2025:iotelea:whatsapp_image_2025-05-27_at_16.26.55_4555e98c.jpg?700|}} | ||
===== Software Design ===== | ===== Software Design ===== | ||
+ | Mediul de dezvoltare utilizat pentru implementarea firmware-ului a fost Arduino IDE, cu suport pentru platforma AVR-GCC, țintind microcontrolerul ATmega328P de pe placa Arduino UNO R3. În cadrul proiectului, s-a optat pentru o implementare low-level a protocoalelor, pentru o înțelegere mai profundă a funcționării hardware-ului. | ||
- | <note tip> | + | | **Platformă** | **Detalii** | |
- | Descrierea codului aplicaţiei (firmware): | + | | IDE | Arduino IDE | |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | | Microcontroler | ATmega328P (pe placa Arduino UNO R3) | |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | | Compilator | AVR-GCC (implicit prin Arduino Toolchain) | |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | | Programare | În limbaj C/C++ cu acces direct la registre | |
- | * (etapa 3) surse şi funcţii implementate | + | | Biblioteci | Fără librării externe (implementare manuală a I2C, PWM, GPIO, Timere) | |
- | </note> | + | |
- | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | ====Elemente software implementate până în acest moment==== |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | • Control tastatură matricială 4x4 (scanare + debouncing software) |
+ | |||
+ | • Verificare PIN + contor de greșeli | ||
+ | |||
+ | • Blocare automată a seifului după 10 secunde de la deschidere (millis() – non-blocking) | ||
+ | |||
+ | • Servomotor acționat manual pentru deschiderea/zăvorârea ușii | ||
+ | |||
+ | • LED-uri pentru semnalizare vizuală (GPIO) | ||
+ | |||
+ | • Buzzer cu secvențe sonore diferite pentru stări (corect, greșit, autodistrugere) | ||
+ | |||
+ | • Afișare mesaje pe LCD I2C controlat prin TWI | ||
+ | |||
+ | ====Corelare cu laboratoare==== | ||
+ | |||
+ | ^ Laborator ^ Concept ^ Aplicație în proiect ^ | ||
+ | | Lab 0 | GPIO | Tastatură matricială, LED-uri de stare | | ||
+ | | Lab 3 | PWM & Timere | Servomotor (PWM manual), buzzer (tonuri) | | ||
+ | | Lab 6 | I2C (fără librării) | Comunicare low-level cu LCD 1602 prin TWI | | ||
+ | |||
+ | |||
+ | ==== Implementarea logicii ==== | ||
+ | |||
+ | |||
+ | Programul începe prin apelarea funcțiilor de inițializare: | ||
+ | |||
+ | |||
+ | - `initializePins()` configurează LED-urile (roșu și verde), buzzer-ul, pinul de control pentru servomotor și pinii pentru tastatura matricială (ca output pentru rânduri și input cu pull-up pentru coloane). | ||
+ | |||
+ | |||
+ | - `lcd_init()` și `twi_init()` pregătesc interfața LCD 1602 și inițializează comunicația I2C la nivel de registre TWI. | ||
+ | |||
+ | |||
+ | - `setServoPosition(1500)` setează servomotorul în poziția de blocare (90°), la pornirea sistemului. | ||
+ | |||
+ | |||
+ | - Variabilele globale precum `isUnlocked`, `enteredCode`, `unlockTime` sunt resetate la valori inițiale. | ||
+ | |||
+ | |||
+ | După inițializare, programul intră în bucla principală: | ||
+ | |||
+ | |||
+ | 1. Se apelează `scanKeypad()` pentru a detecta apăsări pe tastatura 4×4. | ||
+ | |||
+ | |||
+ | 2. Dacă utilizatorul apasă `*`, codul introdus este resetat și se afișează mesajul “Enter PIN”. | ||
+ | |||
+ | |||
+ | 3. Dacă se apasă o cifră/caracter, acesta este adăugat la `enteredCode`, care este afișat pe LCD. | ||
+ | |||
+ | |||
+ | 4. Când lungimea `enteredCode` este egală cu `correctCode`, se compară valorile: | ||
+ | |||
+ | A) Dacă codul este corect: | ||
+ | |||
+ | • Se apelează `unlockSystem()` – servomotorul deschide zăvorul, se aprinde LED-ul verde și buzzerul emite un ton pozitiv. | ||
+ | |||
+ | • Se salvează `unlockTime` și se setează `isUnlocked = true`. | ||
+ | |||
+ | |||
+ | B) Dacă codul este greșit: | ||
+ | |||
+ | • Se crește contorul `failedAttempts`. | ||
+ | |||
+ | • Se afișează mesaj de eroare, se apelează `playToneSequence()` cu tonuri triste. | ||
+ | |||
+ | • Dacă `failedAttempts >= 3`, se apelează `handleSelfDestructSequence()` – o secvență cu mesaj animat, countdown, sunet de "alarmă" și flashuri LED. | ||
+ | |||
+ | |||
+ | În timpul în care sistemul este deblocat: | ||
+ | |||
+ | |||
+ | - Se afișează un countdown pe LCD ("Auto-lock in: X"). | ||
+ | |||
+ | |||
+ | - Dacă au trecut 10 secunde (`millis() - unlockTime > autoLockDelay`), se apelează `lockSystem()` și sistemul revine în starea de așteptare. | ||
+ | |||
+ | |||
+ | ====Funcții auxiliare==== | ||
+ | |||
+ | |||
+ | - `scanKeypad()` | ||
+ | |||
+ | Scanează rândurile tastaturii 4x4, setează LOW câte un rând pe rând și citește coloanele. Debouncing software este realizat cu millis(). | ||
+ | |||
+ | |||
+ | - `setServoPosition(uint16_t position)` | ||
+ | |||
+ | Trimite un număr de impulsuri (până la 100) pentru a comanda un servomotor standard SG90, fără folosirea bibliotecii `Servo.h`. | ||
+ | |||
+ | |||
+ | - `playTone(uint16_t freq, uint16_t duration)` | ||
+ | |||
+ | Generează semnale sonore de frecvență variabilă prin toggling manual al pinului pentru buzzer (fără PWM hardware). | ||
+ | |||
+ | |||
+ | - `lcd_init()` | ||
+ | |||
+ | |||
+ | Inițializează LCD-ul în mod 4-bit, 2 rânduri, folosind comenzi standard trimise prin I2C cu funcții low-level (`twi_write()`). | ||
+ | |||
+ | |||
+ | - `handleSelfDestructSequence()` | ||
+ | |||
+ | Afișează un mesaj animat derulant pe LCD, urmat de un countdown și un efect vizual/auditiv (flash LED + sunet de alarmă), apoi revine la `lockSystem()`. | ||
+ | |||
+ | |||
+ | Validarea funcțională a fost realizată fizic, cu testarea tuturor scenariilor: | ||
+ | |||
+ | |||
+ | - cod corect → deblocare + ton pozitiv + LED verde | ||
+ | |||
+ | |||
+ | - cod greșit → mesaj eroare + ton negativ + LED roșu | ||
+ | |||
+ | |||
+ | - 3 greșeli → secvență specială de autodistrugere | ||
+ | |||
+ | |||
+ | - blocare automată → verificat după 10 secunde inactivitate | ||
+ | |||
+ | |||
+ | Toate modulele funcționează sincron, fără blocări sau conflicte, datorită utilizării `millis()` pentru temporizări non-blocante și a organizării logice clare între stări (locked/unlocked). | ||
+ | ` | ||
+ | |||
+ | ^ Componentă ^ Metodă de calibrare ^ Rezultat / Valoare finală ^ | ||
+ | | Servomotor | Testare empirică a impulsurilor PWM manuale | 600 µs = deblocat (0°), 1500 µs = blocat (90°) | | ||
+ | | Tastatură 4×4 | Debounce software ajustat folosind `millis()` | Timp de debounce: 50 ms | | ||
+ | | LCD 1602 I2C | Ajustare timpi între comenzi și date, conform datasheet | Funcționare stabilă, fără caractere corupte | | ||
+ | | Buzzer piezoelectric | Reglare durată și frecvență pentru sunete clare și diferențiate | Ton pozitiv: 262–330 Hz, eroare: 262–175 Hz | | ||
+ | |||
+ | |||
+ | ===== Rezultate obținute ===== | ||
+ | |||
+ | • Sistemul funcționează stabil și complet automatizat. | ||
+ | |||
+ | • Codul PIN este verificat corect, cu feedback audio-vizual. | ||
+ | |||
+ | • Servomotorul acționează zăvorul precis, fără librării externe. | ||
+ | |||
+ | • LCD-ul comunică prin I2C low-level (fără Wire.h). | ||
+ | |||
+ | • Blocarea automată funcționează corect cu temporizare non-blocantă. | ||
+ | |||
+ | • Secvența de autodistrugere este declanșată după 3 greșeli. | ||
+ | |||
+ | • Toate componentele au fost testate fizic, cu rezultate conforme. | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
- | ===== Download ===== | + | Proiectul a reușit să integreze cu succes conceptele studiate în laborator, precum GPIO, PWM și I2C, într-un sistem embedded funcțional și bine organizat. Abordarea low-level, fără librării externe, a permis un control complet asupra hardware-ului și o înțelegere aprofundată a comunicației între componente. |
- | <note warning> | + | Sunt fericit că am reușit să implementez de la zero un seif inteligent folosind Arduino, parcurgând toate etapele esențiale: planificarea logicii, căutarea și achiziția componentelor, documentarea din surse online și vizionarea de tutoriale video pe YouTube. |
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | |
+ | Experiența a fost una practică, educativă și motivantă, și m-a ajutat să înțeleg mai bine cum se dezvoltă un proiect embedded cap-coadă. | ||
- | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | ||
- | </note> | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
- | <note tip> | + | - 26 Aprilie – Alegerea temei proiectului |
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | |
- | </note> | + | |
+ | - 1, 2 Mai – Brainstorming pentru alegerea componentelor | ||
+ | |||
+ | - 3 Mai – Comandarea componentelor hardware | ||
+ | |||
+ | - 6 Mai – Construirea circuitului electronic în Tinkercad (simulare) | ||
+ | |||
+ | - 8 Mai – Recepționarea componentelor fizice | ||
+ | |||
+ | - 10 Mai – Completarea Milestone 1 | ||
+ | |||
+ | - 12 Mai – Asamblarea circuitului real | ||
+ | |||
+ | - 12 Mai – Implementarea unui cod funcțional high-level (cu librării) | ||
+ | |||
+ | - 17 Mai – Prezentarea Milestone 2 | ||
+ | |||
+ | - 24 Mai – Convertirea codului high-level în cod low-level (fără librării) | ||
+ | |||
+ | - 25 Mai – Finalizarea și prezentarea Milestone 3 | ||
+ | |||
+ | - 28 Mai – Participarea la PM Fair | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
<note> | <note> | ||
[[https://github.com/Emilian953/Smart-Safe-Box| Pagina de GitHub]] | [[https://github.com/Emilian953/Smart-Safe-Box| Pagina de GitHub]] | ||
- | [[https://drive.google.com/file/d/12_EX6L4X6f8X2gsXAWvi_QgrKrP5VBlj/view?usp=drive_link|Demo-Video]] | + | |
+ | [[https://drive.google.com/file/d/12_EX6L4X6f8X2gsXAWvi_QgrKrP5VBlj/view?usp=drive_link|Demo-Video in development]] | ||
+ | |||
+ | [[https://drive.google.com/file/d/1xmLwBL_BmBSYDKec8ba2yeDeOBSv0kOU/view?usp=sharing|Demo-Video fully built]] | ||
</note> | </note> | ||
<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> | ||