This shows you the differences between two versions of the page.
pm:prj2022:cristip:apartmentalarm [2022/06/02 01:43] diana_maria.simion [Download] |
pm:prj2022:cristip:apartmentalarm [2022/06/02 10:06] (current) diana_maria.simion [Concluzii] |
||
---|---|---|---|
Line 66: | Line 66: | ||
===== Software Design ===== | ===== Software Design ===== | ||
+ | ==== Implementare ==== | ||
- | Structura codului se imparte in cele 2 functii efundamentale in Arduino: | + | ** Setup ** |
- | * setup() | + | |
- | * loop() | + | |
- | In loop() am separat responsabilitatea fiecarei componente prin urmatoarele functii: | + | Initializez pinii de input si output pentru toate componentele software si cateva variabile necesare. |
- | * void distanceSensorJob() | + | |
- | * void gasSensorJob() | + | |
- | * void buzzerJob() | + | |
- | * void ledsJob() | + | |
- | * void keypadAndLcdJob() | + | |
- | * void checkPassword() | + | |
+ | <code> | ||
+ | /* Initializes all the hardware components */ | ||
+ | void setup() | ||
+ | { | ||
+ | /* Serial setup */ | ||
+ | Serial.begin(9600); | ||
- | Biblioteci folosite: | + | /* LCD setup */ |
- | * Wire.h | + | lcd.init(); |
- | * LiquidCrystal_I2C.h | + | lcd.backlight(); |
- | * Keypad.h | + | lcd.print("Starting"); |
+ | |||
+ | /* Distance sensor setup */ | ||
+ | pinMode(TRIG_PIN, OUTPUT); | ||
+ | pinMode(ECHO_PIN, INPUT); | ||
+ | |||
+ | /* Piezo buzzer setup */ | ||
+ | pinMode(BUZZER_PIN, OUTPUT); | ||
+ | |||
+ | /* Leds setup */ | ||
+ | pinMode(GREEN_LED_PIN, OUTPUT); | ||
+ | pinMode(RED_LED_PIN, OUTPUT); | ||
+ | |||
+ | /* Keypad setup */ | ||
+ | customKeypad.setDebounceTime(50); | ||
+ | |||
+ | /* Messages to be printed setup*/ | ||
+ | texts[0] = text0; | ||
+ | texts[1] = text1; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | In **loop()** am separat responsabilitatea fiecarei componente prin urmatoarele functii: | ||
+ | * Senzorul de distanta masoara distanta de la acesta <code> void distanceSensorJob() </code> | ||
+ | * Senzorul de gaz analizeaza cantitatea de gaz.fum din aer si declanseaza alarma daca este cazul <code>void gasSensorJob()</code> | ||
+ | * Buzzerul porneste daca alarma est pornita si prezenta a fost detectata <code> void buzzerJob() </code> | ||
+ | * Ledurile se vor aprinde in functie de activarea /deactivarea alarmei <code>void ledsJob() </code> | ||
+ | |||
+ | In afara de acestea tratez urmatoarele situatii astfel: | ||
+ | |||
+ | ** Sincronizarea intre tastele apasate si LCD ** | ||
+ | |||
+ | Flowul descris este similar cu cel din diagrama de stari. Folosesc variabilele boolean isPasswordSet si activeAlarm ca sa identific state-ul din diagrama. | ||
+ | |||
+ | <code> | ||
+ | void keypadAndLcdJob() | ||
+ | { | ||
+ | /* Updte the buzzer and lcd status */ | ||
+ | buzzerJob(); | ||
+ | lcdMessages(); | ||
+ | gasSensorJob(); | ||
+ | |||
+ | /* Actions after the password was set */ | ||
+ | if (isPasswordSet) { | ||
+ | if (activeAlarm) { | ||
+ | checkPassword(); | ||
+ | } else { | ||
+ | activateOrReset(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /* The password has to be set */ | ||
+ | char key = customKeypad.getKey(); | ||
+ | if (key) { | ||
+ | if (isPasswordSet == false) { | ||
+ | if (key == NEXT_KEY) { | ||
+ | lcd.setCursor(0, 1); | ||
+ | lcd.print(emptyLine); | ||
+ | setPassword(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ** Setarea parolei ** | ||
+ | |||
+ | <code> | ||
+ | /* Sets the current password */ | ||
+ | void setPassword() | ||
+ | { | ||
+ | while (true) { | ||
+ | /* Pretty prints for the user */ | ||
+ | ... | ||
+ | |||
+ | char key = customKeypad.getKey(); | ||
+ | if (key) { | ||
+ | if (passwordIndex < MAX_INDEX) { | ||
+ | /* Show the current character and then replace with a "*" */ | ||
+ | ... | ||
+ | |||
+ | /* Save the current character and advance */ | ||
+ | ... | ||
+ | } else { | ||
+ | if (key == ACTIVATE_KEY) { | ||
+ | /* Send the complete password to the user via bluetooth */ | ||
+ | ... | ||
+ | |||
+ | /* Prints a countdown until the alarm is activated */ | ||
+ | activateAlarmCountdown(0, ACTIVATE_ALARM_TIMEOUT); | ||
+ | |||
+ | /* Mark the set alarm and reset indexes */ | ||
+ | ... | ||
+ | |||
+ | /* The function can exit when the activate key was pressed */ | ||
+ | return; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </code> | ||
+ | |||
+ | ** Verificarea parolei ** | ||
+ | |||
+ | Pentru aceasta parte, am ales sa pastrez un loop infinit care se opreste cu introducerea corecta a parolei. Intre incercari am pus un countdown care sa blocheze incercarile abuzive. Pentru a testa mai usor insa, am lasat niste timpi mici. Implementarea urmeaza un pattern similar cu setPassword. | ||
+ | |||
+ | <code> | ||
+ | void checkPassword(); | ||
+ | </code> | ||
+ | |||
+ | ** Optiunea aleasa dupa introducerea corecta a parolei ** | ||
+ | |||
+ | In functie de optiunea aleasa, actualizez variabilele necesare functionarii asteptate a sistemului. | ||
+ | |||
+ | <code> | ||
+ | void activateOrReset(); | ||
+ | </code> | ||
+ | |||
+ | ** Countdown ** | ||
+ | |||
+ | Functia poate fi folosita atat pentru numaratoarea inversa pana la activarea alarmei (dupa ce a fost setata), dar si dupa o incercare gresita, prin cei doi parametri pentru mesajul dorit de afisat si numarul de la care sa inceapa numaratoarea inversa. | ||
+ | |||
+ | <code> | ||
+ | void activateAlarmCountdown(int option, int timeout) | ||
+ | </code> | ||
+ | |||
+ | ** Mesajele afisate pe LCD ** | ||
+ | |||
+ | In plus, prin variabila enteredPasswordState am retinut starea in care userul a introdus de introdus parola, insa nu a trecut la pasul urmator. | ||
+ | |||
+ | <code> | ||
+ | /* Prints helper messages on the LCD */ | ||
+ | void lcdMessages() | ||
+ | { | ||
+ | /* First row message */ | ||
+ | lcd.setCursor(0, 0); | ||
+ | if (isPasswordSet == false) { | ||
+ | lcd.print(setPasswordMessage); | ||
+ | |||
+ | /* Second row message */ | ||
+ | lcd.setCursor(0, 1); | ||
+ | lcd.print(pressAMessage); | ||
+ | } else if (activeAlarm == true) { | ||
+ | if (enteredPasswordState == false) { | ||
+ | lcd.print(alarmOnMessage); | ||
+ | } | ||
+ | } else if (activeAlarm == false) { | ||
+ | if (isPasswordCorrect == true) { | ||
+ | lcd.print(activateMessage); | ||
+ | |||
+ | /* Second row message */ | ||
+ | lcd.setCursor(0, 1); | ||
+ | lcd.print(resetMessage); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== Biblioteci folosite ==== | ||
+ | * Wire.h - comunicarea cu modulul I2C | ||
+ | * LiquidCrystal_I2C.h - comunicarea cu LCD-ul cu modul I2C | ||
+ | * Keypad.h - comunicarea cu tastatura numerica | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
Line 99: | Line 261: | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | Proiectul a fost placut de realizat si am categoric o mai buna intelegere a celor lucrate la laborator, intrucat am avut mai mult timp de gandire. | ||
+ | |||
+ | Provocarea principala a venit din structurarea interactiunii cu tastatura numerica si LCD-ul astfel incat sa nu fie nevoie de instructiuni suplimentare de utilizare ale acestora. | ||
+ | |||
+ | Conectarea cu modulul bluetooth a fost de asemenea satisfacator, iar o idee de imbunatatire consta in crearea unui UI mai dragut si a posibilitatii efectuarii de configurari pentru alarma de pe telefon. | ||
+ | |||
+ | Testarea pentru senzorul de fum a fost putin problematica pentru ca a trebuit sa dau foc hartiei:). | ||
===== Download ===== | ===== Download ===== | ||
Arhiva: {{:pm:prj2022:cristip:security_and_safety_alarm_system.zip|}} | Arhiva: {{:pm:prj2022:cristip:security_and_safety_alarm_system.zip|}} | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
+ | |||
+ | * 9.05.2022 - Alegerea proiectului si definitivarea functionalitatilor | ||
- | <note tip> | + | * 16.05.2022 - Documentatie: Introducere, descriere generala, schema bloc, componente shema electrica |
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | |
- | </note> | + | |
- | ===== Bibliografie/Resurse ===== | + | * 21-22.05.2022 - Conectarea componentelor, comunicarea cu LCD-ul |
- | Resurse: | + | * 28.05.2022 - Logica pentru setarea, activarea si resetarea parolei |
+ | |||
+ | * 29.05.2022 - Conectarea cu modulul bluetooth | ||
+ | |||
+ | * 30.05.2022 - Documentatie: Software design, rezultate obtinute | ||
+ | |||
+ | * 31.05.2022 - Rezolvare bug-uri si imbunatatiri | ||
+ | ===== Resurse ===== | ||
LCD: https://create.arduino.cc/projecthub/Arnov_Sharma_makes/lcd-i2c-tutorial-664e5a | LCD: https://create.arduino.cc/projecthub/Arnov_Sharma_makes/lcd-i2c-tutorial-664e5a | ||
Line 118: | Line 294: | ||
Keypad: https://www.circuitbasics.com/how-to-set-up-a-keypad-on-an-arduino/ | Keypad: https://www.circuitbasics.com/how-to-set-up-a-keypad-on-an-arduino/ | ||
+ | Modul Bluetppth: https://www.instructables.com/Remotely-Control-LED-using-HC-05-Bluetooth-Arduino/ | ||
+ | |||
+ | Piese Eagle: https://github.com/ErichStyger/mcuoneclipse/tree/master/Eagle/Library | ||
- | <note> | + | ===== Export to PDF ===== |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | |
- | </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> |