This is an old revision of the document!
Proiectul presupune realizarea unui sistem integrat de securitate, bazat pe două microcontrolere Arduino care comunică între ele prin protocolul I2C. Acesta utilizează diverși senzori și module pentru a oferi acces securizat și monitorizarea mediului, asigurând astfel integritatea conținutului din interior.
1. Arduino Master
Rol: Controlul central al sistemului, interfața cu utilizatorul.
Componente conectate:
2. Arduino Slave
Rol: Colectarea datelor de mediu și detectarea mișcărilor neautorizate.
Componente conectate:
Masterul interoghează Slave-ul prin I2C pentru a primi un `SensorPacket` care conține:
Dacă tilt este “true”, sistemul presupune o tentativă de furt și activează alarma (buzzer).
Accesul se face prin cod PIN introdus pe keypad. Dacă codul este corect, se deblochează ușa și se aprinde LED-ul.
În lipsa utilizatorului, ecranul LCD se stinge automat.
Scop: Permite deblocarea dulapului doar de către utilizatori autorizați.
Flux:
Scop: Permite configurarea sau schimbarea codului de securitate de către utilizator.
Flux:
Scop: Se monitorizează parametrii de mediu și se generează alerte în caz de manipulare.
Arduino Slave măsoară periodic:
Dacă este detectată înclinare:
Arduino Master cere periodic datele de la slave, chiar și fără prezență umană. Dacă `tilt = true`:
Scop: Afișează informațiile esențiale într-un format concis.
Format LCD:
Bill of Materials:
Nr. | Componentă | Cantitate | Preț (RON) |
1 | Arduino Uno | 2 | 35 |
3 | LCD 16×2 cu I2C | 1 | 16 |
4 | Tastatură Keypad 4×4 | 1 | 7 |
5 | Servomotor SG90 | 1 | 12 |
6 | Modul DHT11 (temp+umiditate) | 1 | 12 |
7 | Modul KY-037 (microfon) | 1 | 5 |
8 | Modul SW-520 (tilt sensor) | 1 | 5 |
9 | Modul RTC DS1302 | 1 | 15 |
10 | Senzor ultrasonic HC-SR04 | 1 | 20 |
11 | LED roșu | 1 | ~0 |
12 | Rezistor 220Ω | 1 | ~0 |
13 | Buzzer activ | 1 | 2 |
14 | Fire jumper M-M și F-F | ~20 | 30 |
15 | Breadboard | 1 | 14 |
TOTAL: 2 x 35 + 16 + 7 + 12 + 12 + 5 + 5 + 15 + 20 + 0 + 0 + 2 + 30 + 14 = ~210
Conexiuni Master
Componentă | Pin Arduino | Descriere |
---|---|---|
LCD (I2C) | A4 (SDA), A5 (SCL) | Comunicație I2C pentru afișaj 16×2 LCD |
Tastatură (Keypad) | 2, 3, 4, 5, A0–A3 | Tastatură 4×4 – pini digitali + analogici |
Servomotor | 6 | Pin PWM pentru mecanismul de blocare/deblocare |
Senzor ultrasonic | 8 (Trig), 9 (Echo) | Detectare proximitate cu HC-SR04 |
Buzzer | 7 | Alarma pentru acces greșit |
LED (stare deschis) | 10 | Se aprinde când se deblochează ușa |
Arduino Slave | A4 (SDA), A5 (SCL) | Comunicație I2C master către slave |
Conexiuni Slave
Componentă | Pin Arduino | Descriere |
---|---|---|
Senzor DHT11 | 2 | Măsoară temperatura și umiditatea |
Senzor Sunet KY-037 | A1 | Citire analogică a nivelului de sunet |
Senzor Înclinare SW-530 | 3 (INT) | Detectează mișcări prin întrerupere |
Modul Ceas DS1302 | 4 (CLK), 5 (DAT), 6 (RST) | Ceas în timp real prin protocol 3-fire |
Arduino Master | A4 (SDA), A5 (SCL) | Comunicație I2C în modul slave |
Version 1
Software-ul utilizat:
ZIP: software_master.zip software_slave.zip
GITHUB: https://github.com/gabriel-2802/Arduino-Smart-Locker
Listă Librării Arduino Utilizate
Library Name | Descriere |
———————- | ———————————————————————– |
`Wire.h` | Comunicare I2C între Arduino master și slave |
`DHT.h` | Citirea senzorului de temperatură și umiditate DHT11 |
`RtcDS1302.h` | Controlul modulului RTC (ceas în timp real) DS1302 |
`LiquidCrystal_I2C.h` | Controlul ecranului LCD 1602 prin magistrala I2C |
`Keypad.h` | Gestionarea tastaturii matriciale 4×4 |
`Servo.h` | Controlul servomotorului SG90 |
`Arduino.h` | Bibliotecă implicită Arduino, necesară pentru funcționare generală |
Clase/structuri utiliazate:
/** Arduino Electronic Safe Copyright (C) 2020, Uri Shaked. Released under the MIT License. */ class SafeState { public: SafeState(); void lock(); bool unlock(String code); bool locked(); bool hasCode(); void setCode(String newCode); private: void setLock(bool locked); bool _locked; };
// custom structs, enums enum LockedPhase { PHASE_IDLE, PHASE_WAIT_INPUT, PHASE_VERIFY, PHASE_GRANTED, PHASE_DENIED }; enum UnlockedPhase { PHASE_UNLOCK_IDLE, PHASE_UNLOCK_OPTIONS, PHASE_NEW_CODE_ENTER, PHASE_NEW_CODE_CONFIRM, PHASE_CODE_SUCCESS, PHASE_CODE_FAIL, PHASE_RELOCK }; struct SensorPacket { uint8_t hour; uint8_t minute; uint8_t day; uint8_t month; uint16_t year; float temperature; float humidity; uint8_t soundPercent; bool tilt; } __attribute__((packed));
void setup() { // Inițializează LCD-ul, servo-ul, senzorii, buzzerul, LED-ul, I²C, etc. // Afișează mesajul „Welcome” și setează sistemul ca fiind blocat/deblocat în funcție de starea salvată. }
void resetScreenState() { // Golește ecranul și resetează toți indicatorii interni și codurile introduse. // Este apelată după o perioadă lungă de inactivitate sau după eroare. }
void requestSensorData() { // Trimite o solicitare I²C către slave (adresă definită) pentru a primi structura SensorPacket. // Aceasta include ora, temperatura, umiditatea, sunetul și detectarea de mișcare (tilt). }
void lock() { // Mută servomotorul în poziția de blocare și oprește LED-ul intern. }
void unlock() { // Mută servomotorul în poziția de deblocare și aprinde LED-ul pentru a semnala deschiderea. }
bool isUserClose() { // Trimite un puls prin TRIG și măsoară timpul până la recepție cu ECHO. // Dacă distanța este sub un prag, consideră că un utilizator este în apropiere. }
void safeLockedLogicStep() { // Selectează și apelează funcția corespunzătoare fazei active de blocare (Idle, Input, Verificare, Grant/Deny). }
void handlePhaseIdle() { // Afișează senzorii pe LCD (temp, umiditate, sunet), simbolul de lacăt și pregătește introducerea codului. // Dacă este detectat tilt, activează alarma. }
void handlePhaseWaitInput() { // Citește caractere de la tastatură până se introduc 4 cifre. Afișează * pe ecran pentru fiecare. }
void handlePhaseVerify() { // Verifică codul introdus. Dacă este corect, se deblochează. Dacă nu, crește contorul de eșec. // La 3 încercări eșuate, activează buzzerul. }
void handlePhaseGrantOrDeny() { // După succes sau eșec, așteaptă 1.5 secunde și revine la starea inițială. }
void safeUnlockedLogicStep() { // Selectează și apelează funcția corespunzătoare fazei active de unlocked (Idle, New code, Confirmare etc). }
void handleUnlockIdle() { // Afișează opțiunile: apăsarea „A” pentru schimbare cod, „B” pentru blocare. }
void handleUnlockOptions() { // Primește comanda utilizatorului pentru a începe schimbarea codului sau a bloca. }
void handleNewCodeEnter() { // Permite introducerea noului cod (4 cifre), afișând *. }
void handleNewCodeConfirm() { // Solicită confirmarea codului introdus. Dacă se potrivește, este salvat ca noul cod. }
void handleCodeSuccessOrFail() { // După setarea codului sau în caz de eroare, așteaptă și revine în meniul unlocked. }
void handleRelock() { // Activează servo pentru a închide fizic și revine în starea blocată. }
void loop() { // Verifică periodic proximitatea utilizatorului. // Cere date de la slave, verifică tilt. // Apelează logica pentru starea curentă (locked/unlocked) doar dacă utilizatorul este prezent. }
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.
Resurse Hardware
Component | Datasheet Link |
---|---|
Arduino Uno | Farnell PDF |
LCD 1602 I2C Display | HandsOnTec PDF |
SG90 Servo Motor | Imperial College PDF |
DHT11 Temperature & Humidity Sensor | AllDataSheet DHT11 |
KY-037 Sound Sensor | AllDataSheet KY-037 |
SW-520D Tilt Sensor | Funduino PDF |
Rtc DS1302 RTC Module | RS Components PDF |