Skip to content

Smart Intercom

Real-Time system that allow to pass only authorized/invited people, using Face-Recognition or NFC cards.

The principle of operation:

  • Person approaches to the intercom
  • Looks at the camera
  • The system compare his face with authorized people
  • If it finds it, then the door opens and a person can enter
  • There is also another way to pass;
  • The person with the pass card place it to the RFID location and the door opens if it finds the code of this card in its database

**This project is still in work. I hope the final version will be more beautiful.

Preparation:

Relay connection

  • Connect relay to RPI 3. In my case i used GPIO12 pin for data , 5v for power and you can choose any GND.

You can test the relay with shell script, just create a simple sh script:

nano open.sh
chmod +x open.sh
sh open.sh

paste the code below and run it

Script code:

#!/bin/bash 
echo 12 > /sys/class/gpio/export 
echo out > /sys/class/gpio/gpio12/direction 
echo 0 > /sys/class/gpio/gpio12/value 
ping -c 1 localhost 
echo 12 > /sys/class/gpio/export 
echo out > /sys/class/gpio/gpio12/direction 
echo 1 > /sys/class/gpio/gpio12/value

Camera connection

  • Connect camera module and enable it in raspi-config:

Open the raspi-config tool from the Terminal:

sudo raspi-config

Select Enable camera and hit Enter, then go to Finish and you’ll be prompted to reboot.

To test that the system is installed and working, try the following command:

raspistill -v -o test.jpg

Led Connection

Connect your led to any gpio you want + GND. In my case i used GPIO16 for green led and GPIO26 for red. When you are done, test it:

Create 2 simple python scripts for green and red led with following content:

from gpiozero import LED 
from time import sleep 
led = LED(16) 
while True: 
   led.on() 
   sleep(3) 
   led.off() 
   led.cleanup()
from gpiozero import LED 
from time import sleep 
led = LED(26) 
while True: 
   led.on() 
   sleep(3) 
   led.off() 
   led.cleanup()

And then test it. If led’s are glowing, then everything works good.

python led.py
python led2.py

Face Recognition Script

Install this module from pypi using pip3(or pip2 for Python 2):

pip3 install face_recognition 

Create directory “pic” and “unknown” in Documents for example and place there some face pics of people you know. My case it’s (“/home/pi/Documents/pic/”) and (“/home/pi/Documents/unknown/”).

Create python script with following code

import face_recognition 
import picamera 
import numpy as np 
import os 
camera = picamera.PiCamera() 
camera.resolution = (320, 240) 
output = np.empty((240, 320, 3), dtype=np.uint8) 
print("Loading known face image(s)") 
ep_image = face_recognition.load_image_file("/home/pi/Documents/pic/ep.jpg") 
ep_face_encoding = face_recognition.face_encodings(ep_image)[0] 
vl_image = face_recognition.load_image_file("/home/pi/Documents/pic/vl.jpg") 
vl_face_encoding = face_recognition.face_encodings(vl_image)[0] 
face_locations = [] 
face_encodings = [] 
while True: 
   print("Capturing image.") 
   camera.capture(output, format="rgb") 
   face_locations = face_recognition.face_locations(output) 
   print("Found {} faces in image.".format(len(face_locations))) 
   face_encodings = face_recognition.face_encodings(output, face_locations) 
   for face_encoding in face_encodings: 
       match = face_recognition.compare_faces([ep_face_encoding,vl_face_encoding], face_encoding) 
       name = "<Unknown Person>" 
       os.system("python /home/pi/led2.py &") 
       import time 
       date_string = time.strftime("%Y-%m-%d-%H:%M:%S") 
       camera.capture("/home/pi/Documents/unknown/image-" + date_string + ".jpg")

Test it

python facerec.py

RFIDConnection

Pins:

We need this to connect our RFID module to Raspberry pi 1.

  • Preparation
$ sudo nano /etc/modprobe.d/raspi-blacklist.conf
#blacklist spi-bcm2708
$ sudo apt-get install python-dev
$ git clone https://github.com/lthiery/SPI-Py.git
$ cd SPI-Py
$ sudo python setup.py install
  • read.py When the script finds authorized card, it opens user picture on the remote RPI 3 (runs led scripts), then it opens the door.
import MFRC522 
import signal 
import os 
continue_reading = True 
MIFAREReader = MFRC522.MFRC522() 
cardA = [46,44,187,26,163] 
cardB = [176,203,130,124,133] 
cardC = [20,38,121,207,132] 
def end_read(signal, frame): 
 global continue_reading 
 continue_reading = False 
 print "Ctrl+C captured, ending read." 
 MIFAREReader.GPIO_CLEEN() 
signal.signal(signal.SIGINT, end_read) 
while continue_reading: 
 (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL) 
 if status == MIFAREReader.MI_OK: 
   print "Card detected" 
 (status,backData) = MIFAREReader.MFRC522_Anticoll() 
 if status == MIFAREReader.MI_OK: 
   print "Card read UID: "+str(backData[0])+","+str(backData[1])+","+str(backData[2])+","+str(backData[3])+","+str(backData[4]) 
   if  backData == cardA: 
     print "Evghenii" 
     os.system("sshpass -p *password* ssh root@10.0.0.60 fbi -T 1 -d /dev/fb1 -noverbose /home/pi/Documents/pic/ep.jpg") 
     os.system("sshpass -p *password* ssh root@10.0.0.60 /home/pi/Documents/open.sh 2>/dev/null") 
#      os.system("sshpass -p *password* ssh root@10.0.0.60 sleep 2") 
     os.system("sshpass -p *password* ssh root@10.0.0.60 killall fbi") 
   elif backData == cardB: 
     print "Vlad" 
     os.system("sshpass -p *password* ssh root@10.0.0.60 fbi -T 1 -d /dev/fb1 -noverbose /home/pi/Documents/pic/vl.jpg") 
     os.system("sshpass -p *password* ssh root@10.0.0.60 /home/pi/Documents/open.sh 2>/dev/null") 
#     os.system("sshpass -p *password* ssh root@10.0.0.60 sleep 2") 
     os.system("sshpass -p *password* ssh root@10.0.0.60 killall fbi") 
   elif backData == cardC: 
     print "is Card C" 
   else: 
     print "wrong Card" 
     os.system("sshpass -p *password* ssh root@10.0.0.60 /home/pi/led2.py 2>/dev/null")
  • Using Example
$ git clone https://github.com/rasplay/MFRC522-python.git
$ cd MFRC522-python
$ sudo python read.py

$ sudo python read.py

Button + Telegram

button.py

#!/usr/bin/python
import RPi.GPIO as GPIO
from subprocess import call
from datetime import datetime
import time
import os
shutdownPin = 29
shutdownMinSeconds = 5
debounceSeconds = 0.01
GPIO.setmode(GPIO.BOARD)
GPIO.setup(shutdownPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
buttonPressedTime = None
def buttonStateChanged(pin):
    global buttonPressedTime
    if not (GPIO.input(pin)):
        if buttonPressedTime is None:
            buttonPressedTime = datetime.now()
    else:
        if buttonPressedTime is not None:
            elapsed = (datetime.now() - buttonPressedTime).total_seconds()
            buttonPressedTime = None
            if elapsed >= shutdownMinSeconds:
                call(['shutdown', '-r', 'now'], shell=True)
            elif elapsed >= debounceSeconds:
        os.system()
                os.system("sshpass -p password ssh root@10.14.0.89 -p1337 notify-send -i /usr/share/icons/gnome/32x32/actions/ring2.png Smart-Intercom Guest_at_the_door")        
GPIO.add_event_detect(shutdownPin, GPIO.BOTH, callback=buttonStateChanged)
while True:
    time.sleep(5)

Added pushbutton to Smart Intercom.  It sends you last photo to telegram bot and sends notification to Ubuntu Desktop PC.

In order to disable entrance in specific hours via push-button, i made the following  bash script:

#!/bin/bash

H=$(date +%H)
if (( 7 <= 10#$H && 10#$H < 19 )); then     echo between 7AM and 19PM
sh /home/pi/action.sh
else    echo error
sh /home/pi/error.sh
fi

action.sh – opens the door between 7 am and 19 pm

error.sh – displays restriction image between 19 pm and 7 am error.sh script

#!/bin/bash
DISPLAY=:0.0 XAUTHORITY=/home/pi/.Xauthority /usr/bin/feh --hide-pointer -x -q -D 5 -B black -F /home/pi/error.png &
ping -c 4 localhost 2>/dev/null
DISPLAY=:0.0 XAUTHORITY=/home/pi/.Xauthority xdotool key "x"

P.S to run this script you will need to install xdotool

sudo apt install xdotool