This shows you the differences between two versions of the page.
pm:prj2023:avaduva:safebox [2023/05/29 19:33] alexia.marinescu created |
pm:prj2023:avaduva:safebox [2023/05/29 21:46] (current) alexia.marinescu [Concluzii] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Electronic piano keybaord====== | + | ====== SAFEBOX ====== |
===== Introducere ===== | ===== Introducere ===== | ||
<nowiki> | <nowiki> | ||
- | Acest proiect Arduino este în esența un joc în care utilizatorul va putea să "cânte" la pian. | + | |
- | Proiectul conține o tastatura formată din 7 butoane ce simulează 7 note muzicale ale unui pian, împreună cu un ecran LCD care afișează nota apăsată și un buton separat pentru a selecta unul dintre cele 7 cântece presetate. | + | Scopul acestui proiect constă în dezvoltarea unui sistem de securitate pentru un seif, care implică următoarele aspecte: |
- | Scopul proiectului este de a crea o modalitate interactivă și distractivă de a învăța și de a produce muzică folosind tehnologia. | + | |
- | Acest proiect este util pentru o varietate de persoane, inclusiv pentru cei care doresc să învețe mai multe despre programare și electronică, dar și pentru cei care își doresc o modalitate distractivă de a produce muzică. | + | ● Crearea unui seif dotat cu o încuietoare avansată. Accesul la seif este permis doar prin scanarea unui card RFID. |
+ | |||
+ | |||
+ | ● În cazul în care cardul RFID nu este recunoscut, se va utiliza o măsură alternativă de securitate. Utilizatorul are la dispoziție maxim 10 secunde pentru a introduce o parolă pe un tastator numeric. În acest timp, un LED va clipi intermitent, indicând disponibilitatea introducerii parolei. | ||
+ | |||
+ | |||
+ | ● Dacă timpul maxim este depășit fără a se introduce o parolă corectă, un buzzer va emite un zgomot puternic, semnalizând o potențială tentativă de acces neautorizat. | ||
+ | |||
+ | |||
+ | ● În cazul în care autentificarea prin parolă este reușită, seiful se va deschide prin acționarea unui servomotor. | ||
+ | |||
+ | |||
+ | ● După deschiderea seifului, acesta poate fi închis din nou prin scanarea unui card RFID corect. | ||
+ | |||
+ | |||
+ | ● Scopul final al acestui proiect este de a oferi o modalitate sigură de depozitare a bunurilor. | ||
+ | |||
</nowiki> | </nowiki> | ||
===== Descriere generală ===== | ===== Descriere generală ===== | ||
<nowiki> | <nowiki> | ||
- | Tastatura muzicală pe care o construiți se bazează pe placa de dezvoltare Arduino Uno și folosește o combinație de butoane, rezistențe, un potențiometru, un ecran LCD și un buzzer pentru a produce sunetele muzicale. | + | |
- | Butoanele sunt utilizate pentru a selecta notele muzicale și sunt conectate la pinii digitali ai plăcii Arduino Uno, iar rezistențele sunt utilizate pentru a limita curentul electric care circulă prin butoane. Potențiometrul este utilizat pentru a controla volumul și este conectat la un alt pin digital de pe placa Arduino. | + | |
- | Ecranul LCD este utilizat pentru a afișa nota muzicală selectată de utilizator și este conectat la pinii digitali și analogici ai plăcii Arduino. Buzzer-ul este utilizat pentru a produce sunetele muzicale și este conectat la un alt pin digital de pe placa Arduino. | + | |
- | În momentul în care utilizatorul selectează o notă muzicală apăsând butonul corespunzător, placa Arduino va trimite semnalul corespunzător pentru a activa buzzer-ul și a produce sunetul muzical. În același timp, ecranul LCD va afișa nota muzicală selectată. | + | |
- | În plus, utilizatorul poate selecta unul dintre cele 7 cântece presetate prin apăsarea butonului separat. Placa Arduino va trimite semnalul corespunzător pentru a produce sunetele muzicale pentru melodia selectată. | + | |
</nowiki> | </nowiki> | ||
- | {{:pm:prj2023:avaduva:schemapmproject.png|}} | + | |
+ | {{:pm:prj2023:avaduva:arhitecturamicroprocesoarelor.jpeg|}} | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
- | * Arduino UNO | + | --- Listă de piese:--- |
- | * Butoane push | + | |
- | * LED | + | ● Arduino UNO |
- | * Poetntiometru | + | |
- | * Ecran LCD 16x2 | + | ● breadboard |
- | * Buzzer | + | |
- | * Rezistente | + | ● keypad |
- | * Diverse fire | + | |
- | ===Schema Electrica=== | + | ● modul RFID (RC522) |
- | {{:pm:prj2023:avaduva:schemapmproject2.png?700}} | + | |
- | ===Design final=== | + | ● card, tag de proximitate RFID |
- | {{:pm:prj2023:avaduva:placuta-finala.jpg?700}} | + | |
+ | ● servomotor | ||
+ | |||
+ | ● buzzer | ||
+ | |||
+ | ● LED multicolor | ||
+ | |||
+ | ● rezistențe (1 x 100Ω, 2 x 220Ω) | ||
+ | |||
+ | ● jumpere | ||
+ | |||
+ | ● headere | ||
+ | |||
+ | --- Poza circuit --- | ||
+ | |||
+ | {{:pm:prj2023:avaduva:pozafinala1ma.jpeg|}} | ||
+ | |||
+ | |||
+ | {{:pm:prj2023:avaduva:pozafinala2ma.jpeg|}} | ||
- | {{:pm:prj2023:avaduva:placuta_finala2.jpg?700}} | ||
===== Software Design ===== | ===== Software Design ===== | ||
Line 36: | Line 67: | ||
<note tip> | <note tip> | ||
- | Descrierea codului aplicaţiei (firmware): | + | // C++ code |
- | * 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 | + | #include <SPI.h> |
- | * (etapa 3) surse şi funcţii implementate | + | |
+ | #include <Servo.h> | ||
+ | |||
+ | #include <Keypad.h> | ||
+ | |||
+ | #include <MFRC522.h> | ||
+ | |||
+ | #define SERVO_PIN 2 | ||
+ | |||
+ | #define LED_GREEN_PIN A3 | ||
+ | |||
+ | #define LED_RED_PIN A4 | ||
+ | |||
+ | #define BUZZER_PIN A5 | ||
+ | |||
+ | #define SDA_PIN 10 | ||
+ | |||
+ | #define RST_PIN 9 | ||
+ | |||
+ | #define WAIT 1000 | ||
+ | |||
+ | #define WARNING_BUZZ_INTERVAL 700 | ||
+ | |||
+ | #define WARNING_TIMEOUT 10000 | ||
+ | |||
+ | #define MAX_PASSWD_LENGTH 64 | ||
+ | |||
+ | Servo servo; | ||
+ | |||
+ | const byte ROW_NUM = 4; //four rows | ||
+ | |||
+ | const byte COLUMN_NUM = 3; //3 columns | ||
+ | |||
+ | char keys[ROW_NUM][COLUMN_NUM] = { | ||
+ | { '1', '2', '3' }, | ||
+ | { '4', '5', '6' }, | ||
+ | { '7', '8', '9' }, | ||
+ | { '*', '0', '#' } | ||
+ | }; | ||
+ | //https : //electropeak.com/learn/interfacing-4x3-membrane-matrix-keypad-with-arduino/ | ||
+ | //byte pin_rows[ROW_NUM] = {5, 10, 9, 7}; //connect to the row pinouts of the keypad | ||
+ | //byte pin_column[COLUMN_NUM] = {6, 4, 8}; //connect to the column pinoutsof the keypad | ||
+ | byte pin_rows[ROW_NUM] = { 3, 8, 7, 5 }; //connect to the row pinouts of the keypad | ||
+ | byte pin_column[COLUMN_NUM] = { 4, A2, 6 }; //connect to the column pinouts of the keypad | ||
+ | // Init keypad | ||
+ | Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_column, ROW_NUM, | ||
+ | COLUMN_NUM); | ||
+ | // Init RC522 | ||
+ | MFRC522 rc522(SDA_PIN, RST_PIN); | ||
+ | String enteredPasswd; | ||
+ | const String correctPasswd = "5575"; | ||
+ | const byte correctCodeSize = 4; | ||
+ | const byte correctCode[4] = { 99, 88, 50, 25 }; | ||
+ | volatile int safeState; // 0 = open, 1 = closed | ||
+ | void setup() { | ||
+ | Serial.begin(9600); | ||
+ | SPI.begin(); | ||
+ | rc522.PCD_Init(); | ||
+ | Serial.println("Aproprie cardul.."); | ||
+ | enteredPasswd = ""; | ||
+ | pinMode(BUZZER_PIN, OUTPUT); | ||
+ | pinMode(LED_GREEN_PIN, OUTPUT); | ||
+ | pinMode(LED_RED_PIN, OUTPUT); | ||
+ | servo.attach(SERVO_PIN); | ||
+ | servo.write(0); | ||
+ | delay(500); | ||
+ | } | ||
+ | volatile int servoPos = 0; // var to store the servo pos | ||
+ | volatile bool wrongTag = false; | ||
+ | volatile bool proceed = false; | ||
+ | volatile bool state = 0; // 0 = closed, 1 = open | ||
+ | volatile unsigned long lastReadTime = 0; | ||
+ | volatile unsigned long previousMillisBuzz = 0; | ||
+ | volatile unsigned long warningStateStart = 0; | ||
+ | bool checkPasswd(String enteredPasswd) { | ||
+ | int length = enteredPasswd.length(); | ||
+ | if (length != correctPasswd.length()) { | ||
+ | return false; | ||
+ | } | ||
+ | for (int i = 0; i < length; i++) { | ||
+ | if (correctPasswd[i] != enteredPasswd[i]) { | ||
+ | return false; | ||
+ | } | ||
+ | } | ||
+ | return true; | ||
+ | } | ||
+ | void actLED() { | ||
+ | if (!state) { | ||
+ | analogWrite(LED_GREEN_PIN, 0); | ||
+ | analogWrite(LED_RED_PIN, 255); | ||
+ | } else { | ||
+ | analogWrite(LED_RED_PIN, 0); | ||
+ | analogWrite(LED_GREEN_PIN, 255); | ||
+ | } | ||
+ | } | ||
+ | void actBuzzer() { | ||
+ | if (!state) { | ||
+ | tone(BUZZER_PIN, 100, 300); | ||
+ | } else { | ||
+ | tone(BUZZER_PIN, 100, 100); | ||
+ | delay(200); | ||
+ | tone(BUZZER_PIN, 300, 100); | ||
+ | } | ||
+ | } | ||
+ | void warningBuzz() { | ||
+ | unsigned long currentMillis = millis(); | ||
+ | if (currentMillis - previousMillisBuzz >= WARNING_BUZZ_INTERVAL) { | ||
+ | previousMillisBuzz = currentMillis; | ||
+ | tone(BUZZER_PIN, 350, 200); | ||
+ | } | ||
+ | } | ||
+ | void wrongPasswordBuzz() { | ||
+ | tone(BUZZER_PIN, 450); | ||
+ | delay(1000); | ||
+ | noTone(BUZZER_PIN); | ||
+ | } | ||
+ | void angryBuzz() { | ||
+ | Serial.println("INTRUDER"); | ||
+ | for (int i = 0; i < 80; i++) { | ||
+ | if (i % 2 == 0) { | ||
+ | analogWrite(LED_GREEN_PIN, 0); | ||
+ | analogWrite(LED_RED_PIN, 255); | ||
+ | } else { | ||
+ | analogWrite(LED_GREEN_PIN, 255); | ||
+ | analogWrite(LED_RED_PIN, 0); | ||
+ | } | ||
+ | tone(BUZZER_PIN, 50); | ||
+ | delay(50); | ||
+ | } | ||
+ | noTone(BUZZER_PIN); | ||
+ | } | ||
+ | void lock_unlock() { | ||
+ | servo.write(90 - servoPos); | ||
+ | servoPos = 90 - servoPos; | ||
+ | state = !state; | ||
+ | actLED(); | ||
+ | actBuzzer(); | ||
+ | } | ||
+ | void loop() { | ||
+ | // LED CODE | ||
+ | actLED(); | ||
+ | // RFID READER CODE | ||
+ | if (!wrongTag) { | ||
+ | // Look for new cards | ||
+ | if (rc522.PICC_IsNewCardPresent()) { // Select one of the cards | ||
+ | unsigned long time = millis(); | ||
+ | if (time - lastReadTime >= WAIT) { | ||
+ | lastReadTime = time; | ||
+ | if (rc522.PICC_ReadCardSerial()) { | ||
+ | //Show UID on serial monitor | ||
+ | byte letter; | ||
+ | for (byte i = 0; i < correctCodeSize; i++) { | ||
+ | if (rc522.uid.uidByte[i] != correctCode[i]) { | ||
+ | Serial.println("ERROR! Invalid tag! Enter keys!"); | ||
+ | // TODO: intermittent buzz | ||
+ | warningStateStart = millis(); | ||
+ | enteredPasswd = ""; | ||
+ | wrongTag = true; | ||
+ | } else { | ||
+ | Serial.println("OK"); | ||
+ | proceed = true; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } else { | ||
+ | warningBuzz(); | ||
+ | unsigned long currTime = millis(); | ||
+ | if (currTime - warningStateStart >= WARNING_TIMEOUT) { | ||
+ | angryBuzz(); | ||
+ | warningStateStart = millis(); // reset | ||
+ | } | ||
+ | // Wrong tag => have to read keypad | ||
+ | char key = keypad.getKey(); | ||
+ | if (key) { | ||
+ | if (key == '#') { | ||
+ | bool validPasswd = checkPasswd(enteredPasswd); | ||
+ | if (validPasswd) { | ||
+ | Serial.println("OK!"); | ||
+ | proceed = true; | ||
+ | wrongTag = false; | ||
+ | } | ||
+ | else { | ||
+ | wrongPasswordBuzz(); | ||
+ | } | ||
+ | enteredPasswd = ""; | ||
+ | } else { | ||
+ | enteredPasswd += key; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | if (proceed) { | ||
+ | lock_unlock(); | ||
+ | } | ||
+ | proceed = false; | ||
+ | } | ||
</note> | </note> | ||
Line 46: | Line 273: | ||
<note tip> | <note tip> | ||
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | Am reusit realizarea unui seif conform descrierii. |
</note> | </note> | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | <note tip> | ||
+ | Proiectul a avut un rol benefic în dezvoltarea competențelor atât în programarea Arduino, cât și în implementarea componentelor hardware. | ||
+ | </note> | ||
===== Download ===== | ===== Download ===== | ||
Line 62: | Line 291: | ||
<note> | <note> | ||
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | https://www.arduino.cc/reference/en/libraries/keypad/ |
+ | |||
+ | https://www.arduino.cc/reference/en/libraries/mfrc522/ | ||
+ | |||
+ | https://www.arduino.cc/reference/en/libraries/easy-mfrc522/ | ||
</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> | ||