Anders Bjørn Øbro & Rasmus Bundsgaard

Video link: https://drive.google.com/file/d/1My3AFTRMGfyxT8A-JAJg8_Ir0CPq4n0Q/view?usp=sharing

Vi har bygget et sikkerhedssystem til en model af et hus, da vi mener det er essentielt for at føle tryghed i sit eget hus. Mange alarmsystemer kan i dag enten til- og frakobles uden kode via en chip, som husets beboere kan tage med sig, eller med kode via en fastmonteret alarm på en væg. Vi har dog valgt at bruge en fjernbetjening, for at illustrere en kobling af dem begge. Dette er ikke valgt fordi det er en bedre metode end de ovenstående to, men fordi det illustrere fordelene ved begge metoder. Vores kobling af de to metoder ville dog være mere fordelagtig hvis vi havde inkorporeret en chip i fjernbetjeningen som gjorde det muligt at til- eller frakoble alarmsystemet uden at skulle taste koden, men vi prioriterede de andre elementer i projektet højere. Når koden tastes på fjernbetjeningen, vil det kunne ses på en LCD-skærm, som giver brugeren feedback om alarmsystemets status. Derudover vil en korrekt kode aktivere systemets sensorer, herunder en PIR bevægelsessensor, en ultralydssensor, og en LDR sensor. Bevægelsessensoren aktiveres af alle bevægelser i rummet. Ultralydssensoren aktiveres hvis lydbølgerne bliver kortere end det valgte, hvilket indikere at en person er gået foran sensoren. LDR sensoren aktiveres hvis der kommer et pludseligt udsving i lysmålingen, hvilket indikere at en person har tændt et lys, eller lyst på sensoren med en lommelygte. Hvis en af sensorerne aktiveres, vil en piezo højtaler spille en høj alarm-lyd, samtidig med at en motor drejer to LED’er rundt, med blinkende blåt og rødt lys, for at symbolisere politilygter.

På nedenstående billede kan der ses et billede af vores Tinkercad model.

Som det kan ses på billedet, valgte vi at sætte to Arduinoer sammen, for at kunne bruge flere pins, og samtidig opdele alarmsystemets dele. Dette gjorde det muligt at koble alle sensorer på den ene Arduino, og alle aktuatorer på den anden Arduino (bortset fra LCD skærmen). På den måde kan den ene Arduino (A1) ses som værende ‘master’, da den tjekker systemets status, og om en sensor er gået i gang. Hvis en sensor aktiveres, sender den et ‘HIGH’-signal gennem breadboardet til en anden Arduino. Den anden Arduino (A2) kan ses som værende ‘slave’, da dens eneste formål er at vente på signalet, og derefter gøre indbrudstyven opmærksom på at alarmen er gået i gang, ved at spille lyde på piezo-højtaleren og blinke med LED’erne.

På nedenstående billede kan der ses et billede af vores Fritzing model.

Obs. ledningerne i portene i Arduinoerne er ikke vejledende.

På nedenstående flowchart ses projektets kodemæssige prioritering:

Som det kan ses på flowchartet, er systemets vigtigste prioritering at tjekke om koden bliver indtastet, da vi ønsker at kunne gøre dette med det samme. Derefter bliver der tjekket om systemet er aktiveret. Dette bestemmer om informationen fra sensorerne skal tilgodeses eller om der faktisk skal handles. Derfor bliver der altid kaldt på checkPassword funktionen for at finde ud af om der er logget ind eller ej.

Den ene Arduino (A1) styrer sensorer og om brugeren har logget ind på systemet. Den anden Arduino(A2) håndterer alarmsystemets aktuatorer, hvis den første Arduino opdager indbrud. 

Samtalen mellem de to Arduinoer er simpel og består kun af et high-low signal, afhængigt af om nogle er brudt ind eller ej.

Samlet opstilling

Arduino 1 består af følgende komponenter og udførsler:

  1. Tjek fjernbetjening:
    • Her modtages input fra fjernbetjeningen, som i tjekker om der blev indtastet en korrekt adgangskode.
  2. LCD skærm
    • Baseret på artiklen fra Bakker (2020) , valgte vi at bruge en 220Ω modstand til baggrundsbelysningen for en sikkerheds skyld, selvom dette ikke er nødvendigt, da databladet fra Elegoo (2021) fortæller den kan tage 5,5 volt som absolut maks. 
    • Den fungerer som systemets feedback til brugeren.
  3. PIR bevægelsessensor
    • En af alarmsystemets sensorer, som er placeret mod indgangen, og kan måle hele rummet for bevægelse.
  4. LDR lyssensor
    • Vi har brugt en 220Ω modstand baseret på  Using an LDR Sensor With Arduino (2019).
    • Fungerer som en af alarmsystemets sensorer. Måler lysforskellen i rummet, svarende til at en person tænder en lampe eller lyser med en lommelygte.
  5. Ultralyd sensor
    • Fungerer som en af alarmsystemets sensorer. Måler om afstanden til modsatte væg bliver kortere, hvilket indikerer at noget/nogen er gået ind foran.
  6. Signal til Arduino 2
    • Sender et ‘high’ signal når alarmen bliver aktiveret.

Arduino A2 modtager et signal fra Arduino A1 og udfører følgende handlinger:

  1. DC motor
    • Ved hjælp af en h-bro, og nogle Lego-dele som gearing, roterer vi motoren hver sin retning. Fordi vi går fra små tandhjul til større, vil gearene rotere langsommere. Moteren er sat til et lille hvidt tandhjul, som drejer et stort gråt tandhjul. På det store tandhjul har vi sat et meget lille gråt tandhjul, som igen roterer et stort gråt tandhjul, hvorpå lysdioderne er placeret.
  2. LED lysdioder
    • Baseret på artiklen Arduino – BlinkWithoutDelay (2021) , har vi brugt en 220Ω modstand til hver LED pærer.
    • De er placeret på DC motoren, og blinker skiftevis mens alarmen er i gang.
  3. Piezo højtaler

Gennemgang af koden:

Det første A1 tjekker er om fjernbetjeningen modtager input

Her bliver inputtet afkodet af oversætterfunktionen. Derudover vil inputtet ændre en række password variabler. Vi har ikke kunnet finde en metode til at tilføje et indeks til et array dynamisk. Vores løsning til dette problem er at lave fire variabler, henholdsvis password- A, B, C og D. Når der modtages et input, vil det nyeste input sættes til passwordA, og det sidste input vil rokeres til at være passwordB, osv. Indtil de fire varibler stemmer overens med den prædefinerede kode: 1,2,3,4.

Hvis det stemmer overens bliver systemet enten slået til eller fra, afhængigt af dets tidligere stadie. 

Hvis alarmen er slået til, vil nedenstående funktioner udføres, som tjekker om der er registreret bevægelse eller lys i rummet. 

Hvis der registreres enten lys, bevægelse eller ny distance til ultralydsensoren bliver funktionen SendArduinoSignal kaldt, med et ‘High’-signal, hvilket slår alarmen til. Efter nogle sekunder slår vi alarmen fra igen.

I koden til Arduino A2 sørger vi for at kunne måle ‘High’/’Low’-signaler fra den Arduino A1 i Setup med attachInterrupt, som sørger for at ændre mellem state 0 og 1 afhæng af signalet. I Loop tjekker vi dets state, og aktivere aktuatorerne hvis nødvendigt.

////////////////////////////////////////////////////////////A1///////////////////////////////////////////////////////
// IRremote - Version: Latest 
#include <IRremote.h>
#include <IRremoteInt.h>
#include <LiquidCrystal.h>

//display
int receiver = 12; // Signal Pin of IR receiver to Arduino Digital Pin 11


const int PIN_TO_SENSOR = 8;   // the pin that OUTPUT pin of sensor is connected to
int pinStateCurrent   = LOW; // current state of pin
int pinStatePrevious  = LOW; // previous state of pin

const int pingPin = 11; // Trigger Pin of Ultrasonic Sensor
const int echoPin = 10; // Echo Pin of Ultrasonic Sensor

const int ldrPin = A0;
int andenArduino = 13;
int caliUltra = 0;

int passwordA;
int passwordB;
int passwordC;
int passwordD;
int passwordStartAlarm;
bool unlocked = true;
/*-----( Declare objects )-----*/
IRrecv irrecv(receiver);     // create instance of 'irrecv'
decode_results results;      // create instance of 'decode_results'
LiquidCrystal lcd = LiquidCrystal(2, 3, 4, 5, 6, 7);

void setup()
{
  pinMode(andenArduino, OUTPUT);
  Serial.begin(9600);
  Serial.println("IR Receiver Button Decode"); 
  irrecv.enableIRIn(); // Start the receiver
  lcd.begin(16, 2);
  pinMode(PIN_TO_SENSOR, INPUT);
  pinMode(ldrPin, INPUT);
}

void loop()
{
  
  CheckForControllerInput();
  turnSystemOn();
  
  if(unlocked==false)
  {
    CheckForMovement();
    CheckUltraSoundDistance();
    ChechLight();
  }

  delay(300);
  
}
//Her slås alarmsystemet til og fra
void turnSystemOn() {
  if(passwordA==4 && passwordB==3 && passwordC ==2 && passwordD == 1) {
    lcd.clear();
    lcd.setCursor(2, 0);
    lcd.print("CORRECT PASSWORD");
    delay(3000);
    lcd.clear();
    if(unlocked == true)
      {
         unlocked = false;
         lcd.print("Alarmsystem on");
         delay(3000);
         lcd.clear();
         clearPassword();
      }
    else
      {
         unlocked = true;
         lcd.print("Alarmsystem off");
         delay(3000);
         lcd.clear();
         clearPassword();
      }    
  }
}


void clearPassword()
{
    passwordA=0;
    passwordB=0;
    passwordC=0;
    passwordD=0;
}
  
void CheckForMovement() {
  pinStatePrevious = pinStateCurrent; // store old state
  pinStateCurrent = digitalRead(PIN_TO_SENSOR);   // read new state
  
  if (pinStatePrevious == LOW && pinStateCurrent == HIGH) {   // pin state change: LOW -> HIGH
    Serial.println("movement detected"); 
 
    lcd.print("movement detected!");
    // start alarm!
    SendArduinoSignal(HIGH);
    delay(3000);
    SendArduinoSignal(LOW);
    lcd.clear();
      
  } 
  else if (pinStatePrevious == HIGH && pinStateCurrent == LOW) {   // pin state change: HIGH -> LOW
    lcd.print("movement stopped!");
    delay(3000);
    lcd.clear();
  }
}

void SendArduinoSignal(int state) {
  digitalWrite(andenArduino, state);
}

void CheckForControllerInput () {
  if (irrecv.decode(&results)) // have we received an IR signal?
  {
    passwordD = passwordC;
    passwordC = passwordB;
    passwordB = passwordA;
    
    Serial.println(results.value); // > here you get the integer from your Remote
    // use an Decimal to Hexadecimal Converter to get the Hex like this: http://www.binaryhexconverter.com/decimal-to-hex-converter
    // add your Mapping in the function translateIR > check the two examples with Power and number 5-Button
    translateIR(); 
    irrecv.resume(); // receive the next value
  } 
}

void CheckUltraSoundDistance() {
  long duration, inches, cm;
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(pingPin, LOW);
  pinMode(echoPin, INPUT);
  duration = pulseIn(echoPin, HIGH);
  inches = microsecondsToInches(duration);
  cm = microsecondsToCentimeters(duration);
  Serial.print(inches);
  Serial.print("in, ");
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();
  delay(100);
  
  if(caliUltra==0)
    {
      caliUltra = cm;
    }

  if(cm != caliUltra)
    {
       Serial.println("BUSTED"); 
       lcd.print("someone moving by");
       SendArduinoSignal(HIGH);
       delay(3000);
       SendArduinoSignal(LOW);
       lcd.clear();
    }
}
long microsecondsToInches(long microseconds) {
  return microseconds / 74 / 2;
}

long microsecondsToCentimeters(long microseconds) 
{
  return microseconds / 29 / 2;
}

void ChechLight()
  {
  int ldrStatus = analogRead(ldrPin);

  if (ldrStatus <= 150) 
    {
    Serial.println("det er mørkt");
      return;
  
    } 
  
  else 
    {

      Serial.println("det er ikke mørkt");
        lcd.print("Light detected");
        delay(3000);
        lcd.clear();
        SendArduinoSignal(HIGH);
        delay(3000);
        SendArduinoSignal(LOW);
    }
  
  }

void translateIR() // takes action based on IR code received
{
  lcd.setCursor(2, 0);
  switch(results.value) 
  {
    case 0xFFA25D: lcd.print("POWER"); break;     
    case 0xFFE21D: lcd.print("FUNC/STOP"); break;
    case 0xFF629D: lcd.print("VOL+"); break;
    case 0xFF22DD: lcd.print("FAST BACK");    break;
    case 0xFF02FD: lcd.print("PAUSE");    break;
    case 0xFFC23D: lcd.print("FAST FORWARD");   break;
    case 0xFFE01F: lcd.print("DOWN");    break;
    case 0xFFA857: lcd.print("VOL-");    break;
    case 0xFF906F: lcd.print("UP");    break;
    case 0xFF9867: lcd.print("EQ");    break;
    case 0xFFB04F: lcd.print("ST/REPT");    break;
    
    case 0xFF6897: 
      lcd.print("0");   
      passwordA = 0;
      break;
    case 0xFF30CF: 
    Serial.println("1");
      lcd.print("1");    
      passwordA = 1;
      
      break;
    case 0xFF18E7: 
      lcd.print("2");
      passwordA = 2;
      break;
    case 0xFF7A85: 
      lcd.print("3");   
      passwordA = 3;
      break;
    case 0xFF10EF: 
      lcd.print("4");   
      passwordA = 4; 
      break; 
    case 0xFF38C7: 
      lcd.print("5");    
      passwordA = 5;
      break;     
    case 0xFF5AA5: 
      lcd.print("6");    
      passwordA = 6;
      break;
    case 0xFF42BD: 
      lcd.print("7");    
      passwordA = 7;
      break;
    case 0xFF4AB5: 
      lcd.print("8");    
      passwordA = 8;
      break;
    case 0xFF52AD: 
      lcd.print("9");    
      passwordA = 9;
      break;
    case 0xFFFFFFFF: lcd.print(" REPEAT");break;  
    default: lcd.print("");
  }
  delay(500);
}
         
////////////////////////////////////////////////////////////A2///////////////////////////////////////////////////////
const int pwm = 7;
  
const int in_1 = 6; 
const int in_2 = 5;
int andenArduino = 2;
int val = 0;
const int redPin = 8;
const int bluePin = 3;
const int buzzer = 9;
int state = 1;
void setup() 
{ 
  pinMode(buzzer,OUTPUT);
  pinMode(pwm,OUTPUT); 
  pinMode(in_1,OUTPUT); 
  pinMode(in_2,OUTPUT); 
  pinMode(andenArduino, INPUT);
  pinMode(redPin,OUTPUT);
  pinMode(bluePin,OUTPUT);

 
  attachInterrupt(digitalPinToInterrupt(andenArduino),isr,RISING); // trigger on rising edge of master voltage signal
}

void loop() {

 
  if (state==1)
    {
          larmeAlarm();
          DCmotor();
          state=0;
    }
  
  
}

void isr() 
{
 state=1;
}

void larmeAlarm(){
  
   for(int i=0;i<5;i++)
    {
      tone(buzzer, 1000);
      delay(300);//wait for 1ms
      tone(buzzer, 2000);
      delay(300);//wait for 1ms
      noTone(buzzer);
    }
  }

void blinkendeLygter(){
  
  digitalWrite(bluePin,LOW);
  digitalWrite(redPin,HIGH);
  delay(200);
  digitalWrite(redPin,LOW); 
  digitalWrite(bluePin,HIGH);
  delay(200);
   digitalWrite(redPin,LOW); 
  digitalWrite(bluePin,LOW);
 }

 void DCmotor()
  {
  digitalWrite(in_1,LOW); 
          digitalWrite(in_2,HIGH); 
          analogWrite(pwm,255);
          blinkendeLygter();
          //delay for 3 sec Clock wise motion
          
          delay(1000);
          
          //for break
          
          digitalWrite(in_1,HIGH); 
          digitalWrite(in_2,HIGH); 
          delay(200);
          
          //for anticlock wise
          
          digitalWrite(in_1,HIGH); 
          digitalWrite(in_2,LOW); 
          blinkendeLygter();
          delay(1000);
          
          //for break
          
          digitalWrite(in_1,HIGH); 
          digitalWrite(in_2,HIGH); 
          delay(200);
  
  }

Konklusion

Vi mener at alarmsystemet er meget effektivt, med kun enkelte mekanikker som kunne forbedres. Det er muligt at logge ind og ud af systemet, og alarmen er meget hurtig til at registrere bevægelser eller lysændringer i rummet. Alle sensorer fungere som de skal, og det eneste problem er at de nogle kan kan være lidt for overfølsomme. Dette ville godt kunne være et problem hvis der kom bevægelse fra en nærliggende vej, som kan registreres gennem et vindue. Vi mener at dioderne og alarmen fungerer som de skal. Det største problem vi oplevede var i forbindelse med DC motoren og dens gearing. Vi ville gerne have at dioderne på motoren roterede to omgange, men der var for meget modstand i opsætningen. Dette gjalt især friktionen mellem motorens Lego-gear og de resterende gear, da vi ikke kunne placere motoren helt vinkelret mod de andre gear. Det var derfor svært at lave et responsivt system der gav mulighed for fuld rotation. Selvom projektet har mulighed for forbedring er vi tilfredse med alarmsystemet.

Perspektivering

Grundet begrænsede ressourcer til projektet valgte vi at bruge en photoresistor til alarmsystemet, selvom det ikke er en særlig optimal måde at opfange en tyv på. Dette skyldes at en tyv sagtens kan begå indbrud ved dagslys, som betyder at der ikke behøves at tænde nogen lys, derudover vil den blive påvirket af eksempelvis en udefra kørende bil, som lyser ind gennem vinduet. I vores projekt kunne vi dog have forbedret brugen af denne sensor ved at gemme værdier løbende, for at tage et gennemsnit, og på baggrund af dette vurdere hvilke ændringer der er i rummet over en kort periode, og vurdere om der er en person i huset.

Som nævnt i konklusionen havde vi problemer med en høj modstand i gearingen. Selve konstruktionen var opbygget meget omhyggeligt, men sammensætningen mellem Lego og DC motoren skabte problemer. Vi kunne derfor forbedre projektet ved at lave en gearing som er beregnet til vores DC motor, eller brugt en Lego-motor til at skabe samme effekt.

Vores valg af fjernbetjening til projektets til- og fra kobling medførte nogle komplikationer i koden. Vi valgte derfor at nedprioritere muligheden for at kunne ændre koden undervejs, og have flere kode-kombinationer. Derudover ville fjernbetjeningens funktionalitet forbedres hvis vi tilkoblede en chip, så man ikke behøvede at indtaste en kode hver gang. Dette kunne derfor forbedres til en anden gang.

Referenceliste

Bakker, B. (2020, August 24). How to Control an LCD Display with Arduino (8 Examples). Makerguides.Com. https://www.makerguides.com/character-lcd-arduino-tutorial/?fbclid=IwAR3BJhdwMA6ru1JCcn8lcgndPyaSU90P9uzn6rtTZbt6v3k-C0PleSQGVcA

ELEGOO UNO R3 Project The Most Complete Starter Kit Tutorial. (2021, March 28). ELEGOO Official. https://www.elegoo.com/blogs/arduino-projects/elegoo-uno-r3-project-the-most-complete-starter-kit-tutorial

Using an LDR Sensor With Arduino. (2019, August 27). Codevele. https://codevele.com/tutorials/arduino/using-an-ldr-sensor-with-arduino.html

Arduino – BlinkWithoutDelay. (ukendt forfatter). Arduino. Hentet April 29, 2021, fra https://www.arduino.cc/en/pmwiki.php?n=Tutorial/BlinkWithoutDelay

Circuit design Piezo. (ukendt forfatter). Tinkercad. Hentet April 29, 2021, fra https://www.tinkercad.com/things/hOu3am5ihCm-piezo

Leave a Reply