Gruppemedlemmer

Jens Kristian Vitus Bering – jberi18@student.sdu.dk

Karl Amadeus Finsson Hansen – karlh18@student.sdu.dk

Pradeep Thayaparan – prtha18@student.sdu.dk

Introduktion

Corona tiderne har vist sig at have været yderst effektive mod indbrud, da der har været markant lavere indbrud end de par sidste år. Denne positive spiral kan snart ændres, når landet lukker mere op efter flere folk er blevet vaccineret. Derfor har gruppen lavet et alarmsystem, der forsøger, at skabe mere sikkerhed i hjemmet.

Videogennemgang af løsningen

Opbygning af hardware

Figur 1 – Fritzing tegning af Sentry Intruder Prevention

Anvendte komponenter

SensorActuatorAndet
Motion SensorDC MotorH-Bro
ThermistorPassive BuzzerPower Supply Module
RFIDLCDResistor: 10k OHMPotentiometer(10k)
Tabel 1 – Anvendte Komponenter

Sentry Intruder Prevention-Systemet bruger en papkasse som erstatning for et hus. For at lave systemet skulle systemet primært udføre tre operationer. Systemet skulle opfange, at der var nogen i huset. System skulle vide hvordan den skulle udløse en alarm og systemet skulle vide, hvornår det skulle udløse alarm. Figur 1 samt Tabel 1 giver overblik over de anvendte komponenter i systemet.

Er der nogen i huset?

Den første del var, at opfange at der var nogen inde i rummet. Gruppen stod overfor et valg af brugen af en PIR Motion Sensor, som er generel sensor der kan opfange bevægelser foran sig eller en Ultrasonic Sensor som kan måle afstanden fra et objekt. Da gruppen blot ville vide, om der var nogen i rummet og ikke om, hvor tæt man var, valgte gruppen at gå med PIR Motion Sensoren og blev sat på indersiden af vores paphus med retning mod døren.

Hvornår skal der udløses alarm?

Den anden del vat finde ud af, hvornår en alarm skulle udløses eller snarere hvornår den ikke skulle udløses. Til dette formål stod valget mellem et slags kode system såsom indtaste en pinkode ved hjælp af en Membrane Switch eller et kort system som som ville tillade adgang til huset uden at udløse alarmen ved at bruge et Radio Frequency Identification modul (RFID). Valget faldt på RFID da dette var lidt mere spændende at arbejde med og blev sat uden på kassen lige ved dør indgangen. For at komme ind i huset skulle man derfor have et gyldigt kort. Hvis man ikke havde det og gik igennem huset ville PIR Motion Sensoren registrere, at der var nogen inde i huset når der ikke skulle være nogen og udløse alarm. 

Hvordan skal alarmen udløses? 

Den sidste del var, hvad der ville ske, hvis vores PIR-Motion Sensor registrerer nogen bevægelse inde i paphuset når den ikke burde. Til dette formål blev der anvendt en DC Motor til at trække en snor op foran døren, og en Passive Buzzer som alarmlyd.

Skærm og Temperatur 

Udover de tre væsentlige dele var der også nogle mindre ting at tage fat om. Brugen af en DC Motor krævede, at Power Supply Module til at være den primære strømforsyning til systemet samt en LCD-skærm til at vise temperatur fra Thermistoren såfremt, udover at også vise “Access Granted” og “Access Denied” på skærmen når kortet blev brugt.

Kredsløbsdiagram

På Figure 2 ses kredsløbsdiagrammet for Sentry Intruder Prevention. Kredsløbs diagrammet viser det elektriske kredsløb mellem komponenterne. Via diagrammet er det muligt, at visualisere hvordan strømmen går komponent til komponent og hvilken indflydelse det har.

Figur 2 – Kredsløbsdiagram af Sentry Intruder Prevention

Opbygning af program

Sentry Intruder Prevention er lavet således, at for at komme ind i huset skal man scanne sit kort ind. Hvis der ikke skannet et gyldigt kort og vedkommende er gået ind i gennem døren, så vil systemet tolke dette som et indbrud og udløse alarmen.

Figure 3 – Flow Diagram of Sentry Intruder Prevention

Start

Ovenstående flow diagram på figur 3 viser overordnet, hvordan adfærden i systemet. Ved Start konfigurerer projektet alle sine moduler og gør systemet klar til at køre.

Card found

Som nævnt er det nødvendigt at anvende et brugbart kort for at komme igennem huset. Når du lægger kortet på RFID scanneren vil denne tjekke om det er gyldigt. Det første tjek i denne process er om der er mere en et kort foran RFID scanneren. Hvis der er mere end et sker et “collision” og det vil blive afvist. Hvis kun et kort vil det gå videre i processen vil at læse kortets ID. Hvis kortet er gyldigt vil give “Access Granted” og vedkommende har 10 sekunder at gå ind i huset før alarmen går i gang igen. Hvis der ikke var et gyldigt kort ID ville det sige “Access Denied” på LCD-skærmen og dermed afvise personen at komme ind.

Card Not Found

Hvis programmet ikke er i “Access Granted” tilstand og døren alligevel går op vil PIR Motion Sensoren opfange bevægelse i rummet og udløse alarmen. Alarmen er sammenkobling af en Passive Buzzer som udløser støj og en DC Motor der strammer et reb op således, at den nægter vedkommende at gå igennem døren.

Kode

Den nedenstående kode er struktureret således, at metoderne er deklareret i toppen af siden imens implementationen af den ligger længere nede for at give indblik.

#include <SPI.h>
#include <RFID.h>
#include <LiquidCrystal.h>

//---------------------------------------Component Pins & Method Declarations--------------------------//

// DC Motor
int speedPin = 5;
int dir1 = 4;
int dir2 = 3;

void setDCMotorPins();
void setDCMotorSpeedAndDirection(int, char);

//Passive Buzzer
int passiveBuzzerPin = 8;

void alarmBuzzerSound();

// Pir Motion Sensor
int pirPin = 2;
int pirSensorValue;

//Thermistor
int thermistorPin = A5;
int temperatureSensorValue;

void calcTemp();

//LCD
LiquidCrystal lcd(7, A0, A1, A2, A3, A4);

// RFID
RFID rfid(10, 9);
unsigned char status;
unsigned char str[MAX_LEN];
String accessGranted[2] = {"131212513717"};
int accessGrantedSize = 2;

void checkCardRFID();
//------------------------------------------Arduino Setup & Loop------------------------------------//

void setup()
{
  setDCMotorPins();
  Serial.begin(9600);
  SPI.begin();
  rfid.init();

  lcd.begin(16, 2);
  pinMode(pirPin, INPUT);
}

void loop()
{
  checkCardRFID();
  lcd.clear();
  lcd.setCursor(0, 1);
  delayMicroseconds(2);
  pirSensorValue = digitalRead(pirPin);
  if (pirSensorValue == HIGH)
  {
    alarmBuzzerSound();
    setDCMotorSpeedAndDirection(255, 'r');
    lcd.clear();
  }
  calcTemp();
}
//-------------------------------------Function Implementation-------------------------------------------//

void checkCardRFID()
{
  if (rfid.findCard(PICC_REQIDL, str) == MI_OK) //Wait for a tag to be placed near the reader
  {
    Serial.println("Card found");
    String temp = "";                //Temporary variable to store the read RFID number
    if (rfid.anticoll(str) == MI_OK) //Anti-collision detection, read tag serial number
    {
      Serial.print("The card's ID number is : ");
      for (int i = 0; i < 4; i++) //Record and display the tag serial number
      {
        temp = temp + (0x0F & (str[i] >> 4));
        temp = temp + (0x0F & str[i]);
      }
      Serial.println(temp);
      checkAccess(temp); //Check if the identified tag is an allowed to open tag
    }
    rfid.selectTag(str); //Lock card to prevent a redundant read, removing the line will make the sketch read cards continually
  }
  rfid.halt();
}

void checkAccess(String temp) //Function to check if an identified tag is registered to allow access
{
  boolean granted = false;
  for (int i = 0; i <= (accessGrantedSize - 1); i++) //Runs through all tag ID numbers registered in the array
  {
    if (accessGranted[i] == temp) //If a tag is found then open/close the lock
    {
      Serial.println("Access Granted");
      lcd.print("access granted");
      granted = true;
      delay(10000);
    }
  }
  if (granted == false) //If the tag is not found
  {
    lcd.print("Access Denied");
  }
}

void setDCMotorPins()
{
  pinMode(speedPin, OUTPUT);
  pinMode(dir1, OUTPUT);
  pinMode(dir2, OUTPUT);
}

void setDCMotorSpeedAndDirection(int speed, char direction)
{
  if (direction = 'r')
  {
    digitalWrite(dir1, LOW);
    digitalWrite(dir2, HIGH);
    analogWrite(speedPin, 255);
  }
  else if (direction = 'l')
  {
    digitalWrite(dir2, LOW);
    digitalWrite(dir1, HIGH);
    analogWrite(speedPin, 255);
  }
}

void alarmBuzzerSound()
{
  for (int i = 0; i < 255; i++)
  {
    analogWrite(passiveBuzzerPin, i);
  }

  for (int i = 255; i > 0; i--)
  {
    analogWrite(passiveBuzzerPin, i);
  }
}

void calcTemp()
{
  lcd.setCursor(0, 0);
  temperatureSensorValue = analogRead(thermistorPin);
  double tempK = log(100000 * ((1024.0 / temperatureSensorValue - 1)));
  tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK)) * tempK);
  float tempC = tempK - 273.15;
  lcd.print("Temp = ");
  lcd.print(tempC);
};

Uddybende om funktionerne

Der er lavet nogle funktioner som har hver sit ansvar og de beskrevet nedenstående.

setDCMotorPins()-metoden har til ansvar at konfigurere de forskellige pins som DC Motoren anvender.

setDCMotorSpeedAndDirection(int speed, char direction)-metoden har til ansvar at sætte omdrejningshastigheden og  om den skal med eller imod klokken. Den bliver brugt når rebet skal strammes.
alarmBuzzerSound()-metoden har til ansvar at afspille en konstant buzz lyd  ved brug af den Passive Buzzer komponent

checkCardRFID() – Metoden har til ansvar at at læse kort ind på RFID komponentet ved hjælp af et bibiotek som hedder RFID. Den står for at læse det kort man sætter til komponentet og udskrive dens ID i serial, derefter laver den et kald til en funktion som hedder checkAccess()

checkAccess()-metoden har til ansvar at se om det kort man har sat til RFID komponentet godkendt til adgang, det gør den ved at kigge imod et array af godkendte ID’s. Hvis den er godkendt laver den et print til vores LCD skærm hvor der står “Access Granted” og derefter laver den et delay på 10 sekunder som er den tid vores alarmsystem så er slået fra, hvis den ikke er godkendt skriver den “Access Denied” til vores LCD og intet andet sker.

De 4 første funktioner bliver alle kaldt fra vores loop, og det er her selve alarm systemet er skrevet

Opbygning af den samlede fysiske prototype

Før produktet kan blive brugt i praksis måtte gruppen bygge et mini hus ud af pap, for derefter, at demonstrere et rigtigt scenarie med de komponenter, som er blevet beskrevet i forrige afsnit. Figur 4 og 5 viser den fysiske opbygning af produktet. Papkassen skal forestille et hus med en dør. Derudover kan de benyttede komponenter også ses. Bevægelsessensoren var klistret fast på siden af kassen med noget klæbemasse, så den er tættest på døren så muligt og dermed kan registrere noget bevægelse når døren åbnes. På billederne kan DC motoren ses, som er blevet sat sammen med et træstykke, for at kunne vikle tråden sammen, lige så snart, at bevægelsessensoren har registreret noget bevægelse. Produktet udgør også af et Power Supply Module, som skal supplere noget strøm til bla. DC motoren da, arduinoen i sig selv ikke var stærk nok. Den Passive Buzzer er ikke blevet klæbet til væggen på samme måde men er dog placeret i kassen, så den vil kunne afgive lyd. DC Motoren er styret af ved hjælp af en H-bro. Den er placeret direkte i breadboardet, som ligger i kassen. 

Potentiometeret og Termistoren er placeret på breadboardet, men kunne i princippet også være monteret længere væk fra breadboardet for at virkeliggøre scenariet med alarmsystemet, men dette undlod gruppen at gøre, hvilket kan læses i perspektiveringsafsnittet. Det har dog været muligt at få placeret nogle af komponenterne længere væk fra hinanden ved hjælp af female to male ledninger. 

Figur 4 – Indvendigt billede af alarmsystemet i paphuset
Figur 5 – Udvendigt billede af alarmsystemet i paphuset

Billede 5 viser kassen forfra, hvoraf komponenterne LCD display og RFID kan ses. Komponenterne er sat op således, at man kan se dem lige foran døren og dermed få besked lige så snart man har kørt kortet. I kassen er der blevet skåret et lille udsnit, så displayets ledninger kan forbindes til breadboardet, som på den måde kan give et bedre look udefra uden nogen former for ledninger. Samme fremgangsmåde er brugt på RFID.

Konklusion

Gruppen har formået at lave et alarmsystem, hvori alarmsystemet går i gang, hvis man ikke har indtastet sit kort før man går ind gennem døren. Gruppen har derfor delvist nået målet om at lave et hjemmealarm system, men må indrømme, at resultatet ikke er elegant. Systemet har alle komponenterne på plads, men gruppen har måttet lave nogle modifikationer, såsom at lave systemet til en miniature version og yderligere placere komponenter længere ned end oprindeligt planlagt grundet manglende ledninger.

Perspektivering

Overordnet Manglende Lednings Forlængere (Female to Male)

Gruppen ønskede at teste systemet på en normal måde, i en fuld skala udgave således, at det blev brugt ved døren til et hus. På grund af manglen på forlængerledninger (female to male) blev dette desværre ikke en mulighed, og derfor var gruppen nødt til at lave en miniature version af systemet. Og derfor vil flere af underpunkterne understøtte dette overordnede punkt.

LCD ligger langt nede ved døren

Oprindeligt ville gruppen gerne have LCD’en omkring midt dørs højde ved siden af således, at man kunne se temperaturen og om man kunne gå ind gennem døren. LCD ligger så langt nede ved døren fordi den krævede 12 ledninger og hvis de skulle forlænges ville det kræve 12 yderligere og dette havde gruppen ikke til rådighed.

Termistoren & Alarmen ligger bare indenfor huset uden sammenkobling

Alarmen(Passive Buzzer) og Temperaturmåleren(Termistoren) i løsningen ligger bare indenfor huset, men oprindeligt var planen at hænge dem op ved hjælp af klister eller lignende, men grundet manglende ledninger var dette ikke en mulighed.

Måtte skifte første projekt ud

Oprindeligt ville gruppen lave et projekt med en hjemme spritdispenser, hvori den ville have forskellige ekstra funktioner og ikke lukke dig ind i huset før du har sprittet hænder for ellers ville man risikere at udløse en alarm. Gruppen måtte dog desværre konkludere, at 3 servo motorer og en DC motor samlet ikke var stærke nok til at trykke sprit flasken for at få spritten ud af den. Derfor skiftede gruppen over til et alarmsystem og fik brugt flere idéer fra det forrige projekt.

Leave a Reply