Security & Safety Alarm - Simion Diana-Maria 331CA

Student: Simion Diana-Maria

Grupa: 331CAa

Introducere

Ideea de baza de la care am pornit a fost crearea unei alarme multifunctionale pentru casa/apartament care sa detecteze atat prezenta unui strain, cat si situatii neprevazute precum un incendiu/gaz emanat.

Pentru a pune in dificultate intrusul in casa in care se afla sistemul, o data simtita prezenta, alarma va declansa un zgomot puternic ce va putea fi oprit doar prin introducerea parolei (setata anterior de proprietar). La introducerea parolei corecte, zgomotul va inceta, insa la introducerea unei parole gresite, sistemul va fi blocat pentru o bucata de timp, iar zgomotul va continua.

Proprietarul are atat optiunea de a dezactiva sistemul de alarma (cand este acasa de exemplu), dar si de a reseta parola curenta.

Senzorul de gaz va fi declansat de prezenta unei cantitati semnificatice de GPL, izobutan, propan, metan, alcool, hidrogen sau fum. Acesta va porni de asemenea o alarma destul de galagioasa pentru a anunta membrii locuintei aflati in alte camere.

Pentru a spori aplicabilitatea sistemului, am introdus si un modul bluetooth care anunta proprietarul ce parole au fost introduse, dar care poate salva si istoricul parolelor setate de catre el (in caz ca acesta uita parola curenta).

Consider proiectul util si usor de integrat in viata de zi cu zi, putand fi montat intr-o cutie pe un perete sau dulap.

Descriere generală

Shema bloc

Interactiunea cu utilizatorul

  • Modalitatea prin care utilizatorul ofera input este tastatura numerica, iar instructiunile de utilizare a acesteia provin din interactiunea cu LCD-ul. Pe acesta apare in timp real atat introducerea parolei, dar si rezultatul acesteia (Daca a fost introdusa corect; cat timp e nevoie sa astepti pentru o incercare urmatoare).
  • Perceperea miscarii la o anumita distanta de senzorul de distanta va declansa buzzerul, pana la introducerea parolei corecte. O varianta mai galagioasa a acestuia va fi declansata si pe durata interceptarii ueni cantitati mari de gaz sau fum.
  • Starea in care se afla alarma (activata sau dezactivata) este data de cele 2 LED-uri rosu si verde.
  • Prin bluetooth sunt transmise informatiile legate de parola curenta si parolele incercate.

Diagrama starilor

Semnificatia pentru tastele folosite sunt:

  • A - Enter / Next
  • B - Activate Alarm
  • C - Reset

Utilizarea acestora este ghidata de urmatorul flow:

Hardware Design

Lista de componente

Schema electrica

Pentru schema electrica am folosit Eagle. Dintre componentele proiectului, cateva sunt din bibliotecile Sparkfun si Adafruit, cateva piese din biblioteci externe (cele mai multe piese de aici), cateva desenate de mine.

Software Design

Implementare

Setup

Initializez pinii de input si output pentru toate componentele software si cateva variabile necesare.

/* Initializes all the hardware components */
void setup()
{
	/* Serial setup */
	Serial.begin(9600);

	/* LCD setup */
	lcd.init();
	lcd.backlight();
	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;
}

In loop() am separat responsabilitatea fiecarei componente prin urmatoarele functii:

  • Senzorul de distanta masoara distanta de la acesta
     void distanceSensorJob() 
  • Senzorul de gaz analizeaza cantitatea de gaz.fum din aer si declanseaza alarma daca este cazul
    void gasSensorJob()
  • Buzzerul porneste daca alarma est pornita si prezenta a fost detectata
     void buzzerJob() 
  • Ledurile se vor aprinde in functie de activarea /deactivarea alarmei
    void ledsJob() 

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.

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();
			}
		}
	}
}

Setarea parolei

/* 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;
				}
			}
		}
	}
}

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.

void checkPassword();

Optiunea aleasa dupa introducerea corecta a parolei

In functie de optiunea aleasa, actualizez variabilele necesare functionarii asteptate a sistemului.

void activateOrReset();

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.

void activateAlarmCountdown(int option, int timeout)

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.

/* 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);
		}
	}
}

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

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

Jurnal

  • 9.05.2022 - Alegerea proiectului si definitivarea functionalitatilor
  • 16.05.2022 - Documentatie: Introducere, descriere generala, schema bloc, componente shema electrica
  • 21-22.05.2022 - Conectarea componentelor, comunicarea cu LCD-ul
  • 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

Export to PDF

pm/prj2022/cristip/apartmentalarm.txt · Last modified: 2022/06/02 10:06 by diana_maria.simion
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0