Projekt: Raspberry Pi Inbrottslarm/Hemlarm/Övervakning
Hej,
Detta blir mitt tredje projekt med Raspberry Pi. I min föregående tråd skrev jag om hur man styr GPIO via PHP. I den här tråden kommer jag bygga ett hemlarm med Keypad (för pinkod, larma på/av), magnetkontakter och webkameror.
Det jag vill åstadkomma är ett hemlarm som ljuder och skickar e-post när larmet triggas, antingen av magnetkontakterna eller webkamerorna.
Byggde en prototyp för ett tag sedan som fungerade bra, dock var det lite jobbigt att behöva surfa in på min hemsida för att larma av. Så nu blir det med en keypad vid dörren istället, plus att webkamerorna ska integreras.
Skriptspråk blir, HTML,PHP,Python
I dagsläget tror jag inte att jag kommer lödda, men vi får se.
Kommer ni på en bra ide till mitt projekt, håll det inte för er själva!
GPIO pins Rev 2.0
------------------------------------
3v3 ------- | ----- 5v
GPIO2 ----- | ----- 5v
GPIO3 ----- | ----- GND
GPIO4 ----- | ----- GPIO14
GND ------- | ----- GPIO15
GPIO17 ---- | ----- GPIO18
GPIO27 ---- | ----- GND
GPIO22 ---- | ----- GPIO23
3v3 ------- | ----- GPIO24
GPIO10 ---- | ----- GND
GPIO9 ----- | ----- GPIO25
GPIO11 ---- | ----- GPIO8
GND ------- | ----- GPIO7
------------------------------------
VIDEO out |
------------------------------------
Inköpslista (Mycket är köpt på Ebay):
1.a Raspberry Pi (OS, Rasbian Weezy). 349:-
1.b SDHC 4GB. 119:-
1.c Strömadapter. 149:-
1.d Mini/Slim USB WiFI dongel. 80:-
1.e Inbyggnadslåda för Raspberry Pi, Breadboard och kopplingar (19x19x7cm). 100:-

1.g Labborationskablar (JumperCables) ha-ha, ha-ho 40pack. 18:-
1.h Resistorer/motstånd blandat (270Ohm, 1kOhm behövs) Ebay. 10-20:-
1.i Kopplingsplint 19:-

1.j VELLMAN SV3 12volt siren 30:-
2.a Matrix Keypad "0-9 *#". 10:-
2.b Inbyggnadslåda för kablage (Keypad klistras på locket). 35:-
2.c RJ45 10m hane-hane. 60:-
(Matrix Keypad 4x3 behöver 7 ledare till GPIO, rj45 har 8)
2.d Moduljack RJ45 "tool-free" för enkelheten att flytta keypad, byggs in i lådan. 35:-
3.a Magnetkontakt (Larma dörr/fönster) 49:-
3.b Kablage 4 ledare telefonkablage 6:-/meter
4.a Foscam Webcam (wifi) ca 400:-
5.a SMS tjänst (http://www.textlocal.com/)
Ritning.
Keypad:
Kommer använda mig av en RJ45 kontakt för att koppla in Keypaden, i lådan kommer "JumperCables" koppla samman RJ45 kontakten med keypaden.
Chassi för Raspberry och Breadboard:
Här kommer alla kablar att kopplas in till Raspberry PIs GPIO via breadboard, Kabelplinten är för att snabbt kunna flytta på lådan.
Kod:
Edit 2013-12-26.
Har med hjälp av Gaven McDonald på Youtube lyckats skapa ett Pythonskript som är tänkt att ta emot input från keypaden. Här hittar ni videon:
Började med att labba med olika loopar, tanken är att man knappar in koden och avslutar med "#", om man skriver fel, radera allt med "*":
http://softwaist.se/raspberrypi/projekt2/keypad.py
correctPassword = '1234#'
passwordCount = ''
password = ''
# Keypad password check
while True:
if password == '#' and passwordCount == correctPassword:
print("Password Correct")
#Call external script, external script checks if alarm is going to be set on or off.
#os.system("HomeSurveillance.py 1")
passwordCount = ""
password = ""
if password == correctPassword:
print("Password Correct")
#Call external script, external script checks if alarm is going to be set on or off.
#os.system("HomeSurveillance.py 1")
passwordCount = ""
password = ""
elif passwordCount != correctPassword:
password = input("Enter PIN ")
passwordCount += password
if password == "*":
print("Keypad Reset")
passwordCount = ""
password = ""
Sedan gick jag vidare med skriptet som Gaven har skrivit:
keypad_pincode.py
Koden är testad! 2014-01-21
:Uppdaterat:
- def för siren
- kontrollera status för larmet via textfil
###############################################
# Created by Gaven MacDonald #
# http://www.youtube.com/watch?v=yYnX5QodqQ4 #
# #
# Modified by Ted Elmenheim #
###############################################
#KEYPAD LAYOUT
#----------
#|1 2 3 | --7 ----\
#|4 5 6 | --6 ---\|
#|7 8 9 | --5 -- ||
#|* 0 # | --4 - \||
#---------- \|||
# | | | |||| GPIO.BCM
# | | | ||| \---7---- 4
# 1 2 3 || \----6---- 3
# | | | | \-----5---- 2
# | | \ \------4---- 10
# | \ ---------------3---- 9
# \ ------------------2---- 8
# --------------------1---- 7
#GPIO pins Rev 2.0
#------------------------------------
#3v3 ------- | ----- 5v
#GPIO2 ----- | ----- 5v
#GPIO3 ----- | ----- GND
#GPIO4 ----- | ----- GPIO14
#GND ------- | ----- GPIO15
#GPIO17 ---- | ----- GPIO18
#GPIO27 ---- | ----- GND
#GPIO22 ---- | ----- GPIO23
#3v3 ------- | ----- GPIO24
#GPIO10 ---- | ----- GND
#GPIO9 ----- | ----- GPIO25
#GPIO11 ---- | ----- GPIO8
#GND ------- | ----- GPIO7
#------------------------------------
# VIDEO out |
#------------------------------------
import RPi.GPIO as GPIO
import time
import os
GPIO.setmode(GPIO.BCM)
#Setup PIN CODE CHECKER
correctPassword = '1234#'
passwordCount = ''
password = ''
#Setup GPIO for siren
GPIO.setup(11, GPIO.OUT)
#Define sounds
def SoundSiren_PIN_Correct():
GPIO.output(11, True)
time.sleep(0.25)
GPIO.output(11, False)
time.sleep(0.25)
GPIO.output(11, True)
time.sleep(0.25)
GPIO.output(11, False)
time.sleep(0.25)
def SoundSiren_PIN_Reset():
GPIO.output(11, True)
time.sleep(0.25)
GPIO.output(11, False)
time.sleep(0.25)
MATRIX = [ [1,2,3],
[4,5,6],
[7,8,9],
['*',0,'#'] ]
#GPIO BCM rev.2
ROW = [7,8,9,10]
COL = [2,3,4]
#Setup GPIO COL output pins
for j in range(3):
GPIO.setup(COL[j], GPIO.OUT)
GPIO.output(COL[j], 1)
#Setup GPIO ROW input pins
for i in range(4):
GPIO.setup(ROW[i], GPIO.IN, pull_up_down = GPIO.PUD_UP)
try:
while(True):
time.sleep(0.2)
for j in range(3):
GPIO.output(COL[j],0)
for i in range(4):
if GPIO.input(ROW[i]) == 0:
#print(MATRIX[i][j])
#KEYPAD PIN CODE CHECKER
password = MATRIX[i][j]
passwordCount += str(password)
print(passwordCount)
if password == '#' and passwordCount == correctPassword:
print("Password Correct")
#Sound siren
SoundSiren_PIN_Correct()
#Get status of alarm 1=on 0=off
if "off" in open("alarm_status").read():
SetActive = open('alarm_status','w')
SetActive.write('on')
SetActive.close()
#Call external script to turn on Alarm.
#os.system("HomeSurveillance.py 1")
print("Alarm Active!")
else:
#Set status to "off"
SetDisabled = open('alarm_status','w')
SetDisabled.write('off')
SetDisabled.close()
#Call external script to turn off Alarm.
#os.system("HomeSurveillance.py 1")
print("Alarm Disabled!")
passwordCount = ""
password = ""
if password == correctPassword:
print("Password Correct")
#Call external script, external script checks if alarm is going to be set on or off.
#os.system("HomeSurveillance.py 1")
passwordCount = ""
password = ""
if password == '#' and passwordCount != correctPassword:
print("Wrong PIN - Keypad Reset")
passwordCount = ""
password = ""
#Sound siren
SoundSiren_PIN_Reset()
if password == "*":
print("Keypad Reset")
passwordCount = ""
password = ""
#Sound siren
SoundSiren_PIN_Reset()
while(GPIO.input(ROW[i]) == 0):
pass
GPIO.output(COL[j],1)
except KeyboardInterrupt:
GPIO.cleanup()
print("...............")
print("Script terminated - GPIO reset!")
print("...............")
Larm via SMS
Skapat ett gratiskonto på http://www.textlocal.com/, fungerar bra, verkar också ha helt ok priser (83 SMS för 68sek, ca 80öre/st).
Kommer använda mig av följande guide för att skicka larm:
#!/usr/bin/python
#-----------------------------------
# Send SMS Text Message
#
# Author : Matt Hawkins
# Site : http://www.raspberrypi-spy.co.uk/
# Date : 30/08/2012
#
# Requires account with TxtLocal
# http://www.txtlocal.co.uk/?tlrx=114032
#
#-----------------------------------
# Import required libraries
import urllib # URL functions
import urllib2 # URL functions
# Define your message
message = 'Test message sent from my Raspberry Pi'
# Set your username and sender name.
# Sender name must alphanumeric and
# between 3 and 11 characters in length.
username = 'joebloggs@example.com'
sender = 'RPiSpy'
# Your unique hash is available from the docs page
# https://control.txtlocal.co.uk/docs/
hash = '1234567890abcdefghijklmnopqrstuvwxyz1234'
# Set the phone number you wish to send
# message to.
# The first 2 digits are the country code.
# 44 is the country code for the UK
# Multiple numbers can be specified if required
# e.g. numbers = ('447xxx123456','447xxx654321')
numbers = ('447xxx123456')
# Set flag to 1 to simulate sending
# This saves your credits while you are
# testing your code.
# To send real message set this flag to 0
test_flag = 1
#-----------------------------------
# No need to edit anything below this line
#-----------------------------------
values = {'test' : test_flag,
'uname' : username,
'hash' : hash,
'message' : message,
'from' : sender,
'selectednums' : numbers }
url = 'http://www.txtlocal.com/sendsmspost.php'
postdata = urllib.urlencode(values)
req = urllib2.Request(url, postdata)
print 'Attempt to send SMS ...'
try:
response = urllib2.urlopen(req)
response_url = response.geturl()
if response_url==url:
print 'SMS sent!'
except urllib2.URLError, e:
print 'Send failed!'
print e.reason
DIY:
Idag har jag påbörjat bygget, fick hem keypaden och var på kjell och handlade en inbyggnadslåda 120x70x20 och en "keystone CAT6 UTP Toolless" RJ45 hona.
Borrade hål i locket så att kabeln kom igenom och klistrade på keypaden (Självhäftande baksida). Sågade sedan ett jack i kortsidan så att RJ45 kontakten fick plats.. inte helt hundra då kontakten var för stor, fast jag sågat av alla fästen...menmen, det blir ok, kommer inte se undersidan. Limmade sedan fast RJ45 kontakten med kontaktlim så att den inte ska kunna röra sig (Den är dock fastkilad).

Så här ser den ut stängd. kommer visa kabeldragningen i dosan vid annat tillfälle, har inte fått mina "jumper cables" än.

2014-01-11:
Limmade fast kopplingslisten och laborationsplattan i lådan.
Borrade två hål (3mm) för att fästa RPi. Det gick inget vidare att limma fast muttrar i plasten, men det gör inte så mycket då undersidan har gummifötter. Satte även distanser av krympslang mellan RPi och lådan.
Borrade 1 hål (10mm) i ena sidopanelen för att dra ström och andra kablar igenom.

2014-01-21:
Har äntligen tagit mig tiden att fixa kablaget för keypad-dosan. I och med att jag inte följde någon Ethernet-standard så fick jag snällt använda mig av en multimeter för att se vart kablarna gick

Gick ändå ganska smidigt, kopplar på min patchkabel och drar in den i min låda

Snyggt och prydligt.. eller hur..eeeh.. om jag bara orkat sparka igång löddkolven så hade jag minskat antalet kablar lite.
3st 1kΩ (Ohm) resistor kopplas emellan mina columns. Hade också kunnat köra 4st men då för row. (Keypaden är 3 kolumner och 4 rader)

Editerade sedan skriptet för Keypaden. Uppdaterade med funktion (def) för sirenen och av/på funktion via textfil för att vet om jag ska sätta igång larmet eller stänga av det.
editerade rader:
#rad 49 (används för att skriva till en textfil):
import os
#rad 60-75 (Funktion för ljud/siren):
#Define sounds
def SoundSiren_PIN_Correct():
GPIO.output(11, True)
time.sleep(0.25)
GPIO.output(11, False)
time.sleep(0.25)
GPIO.output(11, True)
time.sleep(0.25)
GPIO.output(11, False)
time.sleep(0.25)
def SoundSiren_PIN_Reset():
GPIO.output(11, True)
time.sleep(0.25)
GPIO.output(11, False)
time.sleep(0.25)
#rad 116-136 (sirenen kallar på en funktion istället. On/Off funktion tillagd):
#Sound siren
SoundSiren_PIN_Correct()
#Get status of alarm 1=on 0=off
if "off" in open("alarm_status").read():
SetActive = open('alarm_status','w')
SetActive.write('on')
SetActive.close()
#Call external script to turn on Alarm.
#os.system("HomeSurveillance.py 1")
print("Alarm Active!")
else:
#Set status to "off"
SetDisabled = open('alarm_status','w')
SetDisabled.write('off')
SetDisabled.close()
#Call external script to turn off Alarm.
#os.system("HomeSurveillance.py 1")
print("Alarm Disabled!")
#rad 149-155 (Om man slår fel kod, får man en Keypad Reset):
if password == '#' and passwordCount != correctPassword:
print("Wrong PIN - Keypad Reset")
passwordCount = ""
password = ""
#Sound siren
SoundSiren_PIN_Reset()
2014-02-02:
Kopplingsdiagram för magnetkontakter

Kopplade dock ihop det med separata GND och 3.3v, hade inga ha till ha jumper cables och orkade inte luska ut något annat

Skrev lite kod för att får input från magnetkontakterna:
#!/usr/bin/python
#GPIO pins Rev 2.0
#------------------------------------
#3v3(used)-- | ----- 5v
#GPIO2(used) | ----- 5v
#GPIO3(used) | ----- GND
#GPIO4(used) | ----- GPIO14
#GND ------- | ----- GPIO15
#GPIO17 ---- | ----- GPIO18
#GPIO27 ---- | ----- GND
#GPIO22 ---- | ----- GPIO23
#3v3(used)-- | ----- GPIO24(used)
#GPIO10(used)| ----- GND(used)
#GPIO9(used) | ----- GPIO25(used)
#GPIO11(used)| ----- GPIO8(used)
#GND(used)-- | ----- GPIO7(used)
#------------------------------------
# VIDEO out |
#------------------------------------
# Import required Python libraries
import RPi.GPIO as GPIO
import time
import subprocess
# Use BCM GPIO references instead of physical pin numbers
GPIO.setmode(GPIO.BCM)
#Remove warnings
GPIO.setwarnings(False)
# Front door GPIO24
GPIO.setup(24, GPIO.IN)
FrontDoor_Input = GPIO.input(24)
# Back door GPIO25
GPIO.setup(25, GPIO.IN)
BackDoor_Input = GPIO.input(25)
#Check doormagnet for input
def home_surveillance_2_0():
while True:
#assuming the script to call is long enough we can ignore bouncing
time.sleep(0.2)
if ( GPIO.input(24) == False ):
#Front Door - ALARM!
#this is the script that will be called (as root)
#os.system("python /var/www/sendmail.py")
##subprocess.Popen("python /var/www/sendmail.py", shell=True)
##subprocess.Popen("python /var/www/alarm.py on", shell=True)
##subprocess.Popen("date >> /var/www/status.txt", shell=True)
print("Front Door OPEN!")
time.sleep(2)
if ( GPIO.input(25) == True ):
#Back Door - ALARM!
#this is the script that will be called (as root)
#os.system("python /var/www/sendmail.py")
##subprocess.Popen("python /var/www/sendmail.py", shell=True)
##subprocess.Popen("python /var/www/alarm.py on", shell=True)
##subprocess.Popen("date >> /var/www/status.txt", shell=True)
print("Back Door OPEN!")
time.sleep(5)
try:
home_surveillance_2_0()
except KeyboardInterrupt:
GPIO.cleanup()
print("...............")
print("Script terminated - GPIO reset!")
print("...............")
Se vad jag printar!
3dreserven.se/whatsprinting.php