This shows you the differences between two versions of the page.
pm:prj2025:iotelea:emilian.horduna [2025/05/26 20:15] emilian.horduna [Software Design] |
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 ===== | ||
Line 102: | Line 104: | ||
- | Elemente software implementate până în acest moment: | + | ====Elemente software implementate până în acest moment==== |
• Control tastatură matricială 4x4 (scanare + debouncing software) | • Control tastatură matricială 4x4 (scanare + debouncing software) | ||
Line 117: | Line 120: | ||
• Afișare mesaje pe LCD I2C controlat prin TWI | • Afișare mesaje pe LCD I2C controlat prin TWI | ||
- | Element de noutate: | + | ====Corelare cu laboratoare==== |
- | • Cod scris fără librării externe – totul este controlat direct prin registrul microcontrolerului. | + | ^ 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 | | ||
- | • Interfața I2C cu LCD este complet low-level, fără utilizarea Wire.h. | ||
- | • PWM-ul pentru servo este controlat prin generare manuală de semnal, fără Servo.h. | + | ==== Implementarea logicii ==== |
- | Corelare cu laboratoare: | ||
- | • Lab 0 – GPIO: tastatură, LED-uri | + | Programul începe prin apelarea funcțiilor de inițializare: |
- | • Lab 3 – PWM & Timere: servo și buzzer | ||
- | • Lab 6 – I2C: comunicare cu LCD (fără librării) | + | - `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). |
- | Structura proiectului: | ||
- | - Tastatura permite introducerea PIN-ului | + | - `lcd_init()` și `twi_init()` pregătesc interfața LCD 1602 și inițializează comunicația I2C la nivel de registre TWI. |
- | - LCD-ul afișează statusul și mesajele | ||
- | - Dacă PIN-ul este corect, servomotorul deblochează ușa, se aprinde LED-ul verde și se aude un semnal sonor pozitiv | + | - `setServoPosition(1500)` setează servomotorul în poziția de blocare (90°), la pornirea sistemului. |
- | - După 10 secunde, sistemul se blochează automat, revine LED-ul roșu | ||
- | - 3 greșeli la rând declanșează o secvență animată de autodistrugere (LCD + buzzer + LED blinking) | + | - Variabilele globale precum `isUnlocked`, `enteredCode`, `unlockTime` sunt resetate la valori inițiale. |
- | - Interacțiunea între module se face exclusiv prin GPIO, PWM, I2C – toate gestionate software fără delay-uri blocante | ||
- | Validare: | + | După inițializare, programul intră în bucla principală: |
- | • Sistemul a fost testat funcțional complet – introducerea codului, feedback vizual și sonor, blocare automată, secvență de eroare. | ||
- | • Toate funcționalitățile rulează sincron, fără interferențe sau erori. | + | 1. Se apelează `scanKeypad()` pentru a detecta apăsări pe tastatura 4×4. |
- | Calibrare: | ||
- | • Servomotorul a fost calibrat manual pentru unghiurile de blocare (1500µs = blocat, 600µs = deblocat), verificat fizic pe prototip. | + | 2. Dacă utilizatorul apasă `*`, codul introdus este resetat și se afișează mesajul “Enter PIN”. |
- | • Debouncing-ul tastaturii a fost testat empiric și ajustat prin delay de 50ms. | ||
- | • Durata semnalelor PWM și I2C a fost reglată pentru a asigura funcționarea corectă pe toate componentele. | + | 3. Dacă se apasă o cifră/caracter, acesta este adăugat la `enteredCode`, care este afișat pe LCD. |
- | Optimizări: | ||
- | • Toate întârzierile blocante au fost înlocuite cu temporizări bazate pe millis() | + | 4. Când lungimea `enteredCode` este egală cu `correctCode`, se compară valorile: |
- | • LCD-ul nu este actualizat permanent – doar când e nevoie, pentru a evita flicker | + | A) Dacă codul este corect: |
- | • Servomotorul este controlat doar în momentul schimbării stării, nu continuu | + | • Se apelează `unlockSystem()` – servomotorul deschide zăvorul, se aprinde LED-ul verde și buzzerul emite un ton pozitiv. |
- | <note tip> | + | • Se salvează `unlockTime` și se setează `isUnlocked = true`. |
- | Descrierea codului aplicaţiei (firmware): | + | |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
- | * (etapa 3) surse şi funcţii implementate | + | |
- | </note> | + | |
- | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | B) Dacă codul este greșit: |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | • 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 ===== | ||
Line 204: | Line 294: | ||
[[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> | ||