To save a lot of repetition, see this fairly recent thread (and maybe put related discussion there). Personally, if/when I were designing an analogue keypad interface, I'd try the values I suggested in #37 of that thread, because they offer the potenial for an interrupt-driven keypad entry routine. However, an alarm system is sufficiently "slow" that a normal polling loop including the code you listed, will probably work well enough (but may need the key thresholds optimised for your specific build).I'm experimenting with this, previously published, circuit........ thoughts please.
I only want to use this on the 'outside' circuit that goes to the garage.From the little reading I did, I thought the purpose of the ADC was to be able to detect a specific type of tampering--shorting of the leads to the sensor.
I can't really see how likely to happen this contingency is when the sensors are inside the building to be secured.
It is perhaps worth highlighting that the commercial "FSL" scheme, with resistors in series and parallel across the contacts, allow detecting four states using just two wires: contact open, contact closed, wiring cut, wiring short.I only want to use this on the 'outside' circuit that goes to the garage.
Inside circuits are 'on' or 'off'.
That is very much how it is done. There's no set standard, else it would be easier to tamper! but all your guessed values are absolutely typical. Resistances in that range leave the cable run lengths and contact resistance negligible in comparison.So in the attached circuit, with a 6K8 shunt, 1K2 series, and 4K7 to 0V, the picaxe reads 5V if the sensor leads are shorted, 0V if they are cut, 1.85V if the switch is closed, and 3.98V if it is open. Is this how it is done? I just guessed at the R values--what is standard?
In a previous house we installed a commercial system in which the only perimeter sensor was on an the most obviously tempting entry window, and that was after some argument with the installer who of course wanted more work. Internally, I organised PIRs on the basis that a fair few rooms are uninteresting and others are for practical purposes inaccessible except from within the house. For example, if you want to enter the bathroom to steal our towels or even the kitchen to make off with a refrigerator packed full of cutlery, well, go for it. However, you could not by any discreet means enter a room of interest without detection.I would save on all the wiring and have 2 PIRs in the passage. If both PIRs trigger then send a message by mobile. This limits false positives and dramatically simplifies code and hardware. Note that PIRs work best from a distance so creative positioning is required.
In my opinion PIRs are better than window sensors as they cover a wider range of situations. What if the thieves come through the roof or cut the putty/seal around the glass?
The two window resistors could be higher value, as you have noticed it, what values do you suggest?If I'm reading this correctly, opening/closing the 3k3 and 6k8 switches would give a very similar ADC to opening/closing the 10k switch.
I wasn't commenting on your actual values, rather the fact that 2 switches both operated (or faulty) would give the fault code for a different switch. If you get burgled it won't make a difference, but if you are fault finding in 5 years time, it might.The two window resistors could be higher value, as you have noticed it, what values do you suggest?
serout oled,baud,(254,134,#bit0,#bit1,#bit2,#bit3,#bit4,#bit5,#bit6,#bit7)
if b1=0 then goto skipX
if bit8=1 then serout oled,baud,(254,134,"X"):endif
if bit9=1 then serout oled,baud,(254,135,"X"):endif
if bit10=1 then serout oled,baud,(254,136,"X"):endif
if bit11=1 then serout oled,baud,(254,137,"X"):endif
if bit12=1 then serout oled,baud,(254,138,"X"):endif
if bit13=1 then serout oled,baud,(254,139,"X"):endif
if bit14=1 then serout oled,baud,(254,140,"X"):endif
if bit15=1 then serout oled,baud,(254,141,"X"):endif
skipX:
Thanks
TOF
w10 = w0
for b10 = 134 to 141
w11 = w10 and 256 ; Read "Disabled" flag
if w11 = 0 then
w11 = w10 and 1 ; Read Status flag
if w11 = 0 then
w11 = "0"
else w11 = "1"
endif
else
w11 = "X"
endif
serout oled,baud,(254,b10,w11)
w10 = w10 / 2 ; Shift on to the next bit(s)
next b10
Indeed. What makes one solution better than another; better source code readability, fastest execution, smallest program code size, smoothest display update, something else ?There might be lots of discussion about whether this is "better" ...
[color=Navy]#Macro [/color][color=Black]ShowBit[/color][color=Blue]( [/color][color=Black]stateBit, disableBit [/color][color=Blue])
If [/color][color=Black]disableBit [/color][color=DarkCyan]= [/color][color=Navy]1 [/color][color=Blue]Then
SerOut oled[/color][color=Black], [/color][color=Blue]baud[/color][color=Black], [/color][color=Blue]( [/color][color=Red]"X" [/color][color=Blue])
Else
SerOut oled[/color][color=Black], [/color][color=Blue]baud[/color][color=Black], [/color][color=Blue]( [/color][color=Black]#stateBit [/color][color=Blue])
End If[/color]
[color=Navy]#EndMacro[/color]
[color=Blue]SerOut oled[/color][color=Black], [/color][color=Blue]baud[/color][color=Black], [/color][color=Blue]( [/color][color=Navy]254[/color][color=Black], [/color][color=Navy]134 [/color][color=Blue])[/color]
[color=Black]ShowBit[/color][color=Blue]( [/color][color=Purple]bit0[/color][color=Black], [/color][color=Purple]bit8 [/color][color=Blue])[/color]
[color=Black]ShowBit[/color][color=Blue]( [/color][color=Purple]bit1[/color][color=Black], [/color][color=Purple]bit9 [/color][color=Blue])[/color]
[color=Black]ShowBit[/color][color=Blue]( [/color][color=Purple]bit2[/color][color=Black], [/color][color=Purple]bit10 [/color][color=Blue])[/color]
[color=Black]ShowBit[/color][color=Blue]( [/color][color=Purple]bit3[/color][color=Black], [/color][color=Purple]bit11 [/color][color=Blue])[/color]
[color=Black]ShowBit[/color][color=Blue]( [/color][color=Purple]bit4[/color][color=Black], [/color][color=Purple]bit12 [/color][color=Blue])[/color]
[color=Black]ShowBit[/color][color=Blue]( [/color][color=Purple]bit5[/color][color=Black], [/color][color=Purple]bit13 [/color][color=Blue])[/color]
[color=Black]ShowBit[/color][color=Blue]( [/color][color=Purple]bit6[/color][color=Black], [/color][color=Purple]bit14 [/color][color=Blue])[/color]
[color=Black]ShowBit[/color][color=Blue]( [/color][color=Purple]bit7[/color][color=Black], [/color][color=Purple]bit15 [/color][color=Blue])[/color]
; AXE134 Serial 20x4 OLED using PICAXE-18M2
; Emulates basic serial operation of the popular AXE033 module
; CPS, May 2011
; JB, Jan 2012
#picaxe 18M2
; Supported Commands
; 0-7, 8-15 CGRAM characters
; 16-252 normal ASCII characters, according to selected character map table
; 253, X display 12 character pre-saved message from EEPROM memory, X can be 0-11
; 254, X OLED command, X can be 0 to 255
; 255, X control outputs C.2, C.1, C.0 (via lower 3 bits of X)
#define use_welcome ; display the welcome message upon power up
symbol baud = N2400_16 ; Serial baud rate 2400,N,8,1. Note main program runs at 16MHz
symbol spare0 = C.0 ; spare output 0
symbol spare1 = C.1 ; spare output 1
symbol spare2 = C.2 ; spare output 2
symbol RX = C.5 ; serial receive pin
symbol enable = C.6 ; OLED enable
symbol rs = C.7 ; OLED RS
; OLED data pins are on B.0 to B.7
; Store the 20 character user defined messages in EEPROM data memory
; First two messages are optionally used as welcome message
; Please remember 4 line displays always use the strange 1-3-2-4 line layout.
EEPROM 00, (" ALARM SET ") ; store msg 0 in the EEPROM memory
EEPROM 20, (" ALARM RESET ") ; store msg 1 in the EEPROM memory
EEPROM 40, (" ALARM TEST ") ; store msg 2 in the EEPROM memory
EEPROM 60, (" ALARM ALARM ALARM ") ; store msg 3 in the EEPROM memory
EEPROM 80, (" GARAGE ") ; store msg 4 in the EEPROM memory
EEPROM 100, (" REAR DOOR ") ; store msg 5 in the EEPROM memory
EEPROM 120, (" FRONT DOOR ") ; store msg 6 in the EEPROM memory
EEPROM 140, (" PIR OFFICE ") ; store msg 7 in the EEPROM memory
EEPROM 160, (" PIR HALL ") ; store msg 8 in the EEPROM memory
EEPROM 180, (" PIR LOUNGE ") ; store msg 9 in the EEPROM memory
EEPROM 200, (" PANIC ALARM ") ; store msg 10 in the EEPROM memory
EEPROM 220, (" ALARM SETTING ") ; store msg 11 in the EEPROM memory
;initialise OLED
init:
gosub OLED_init ; initialise OLED
; display welcome message if desired
#ifdef use_welcome
let b1 = 11 ; message 0 on top line
gosub msg ; do it
low rs ; command mode
let pinsB = 192 ; move to line 2, instruction 192
pulsout enable,1 ; pulse the enable pin to send data.
high rs ; character mode again
let b1 = 11 ; message 1 on bottom line
gosub msg ; do it
#endif
; main program loop, runs at 16MHz
main:
serin RX,baud,b1 ; wait for the next byte
; NB keep character mode test as first item in this list to optimise speed
if b1 < 253 then
let pinsB = b1 ; output the data
pulsout enable,1 ; pulse the enable pin to send data.
goto main ; quickly loop back to top
else if b1 = 254 then
low rs ; change to command mode for next character
serin RX,baud,b1 ; wait for the command byte
let pinsB = b1 ; output the data
pulsout enable,1 ; pulse the enable pin to send data.
high rs ; back to character mode
goto main ; quickly loop back to top
else if b1 = 253 then
serin RX,baud,b1 ; wait for the next byte
gosub msg ; do the 16 character message
goto main ; back to top
else ; must be 255
serin RX,baud,b1 ; wait for the next byte
let pinsC = b1 & %00000111 | %10000000
; output the data on C.0 to C.1, keep RS high
goto main ; back to top
end if
; power on OLED initialisation sub routine
OLED_init:
let dirsC = %11000111 ; PortC 0,1,2,6,7 all outputs
let dirsB = %11111111 ; PortB all outputs
; Winstar OLED Module Initialisation
; according to WS0010 datasheet (8 bit mode)
pause 500 ; Power stabilistation = 500ms
; Function set - select only one of these 4 character table modes
;let pinsB = %00111000 ; 8 bit, 2 line, 5x8 , English_Japanese table
let pinsB = %00111001 ; 8 bit, 2 line, 5x8 , Western_European table1
;let pinsB = %00111010 ; 8 bit, 2 line, 5x8 , English_Russian table
;let pinsB = %00111011 ; 8 bit, 2 line, 5x8 , Western_European table2
pulsout enable,1 ;
let pinsB = %00001100 ; Display on, no cursor, no blink
pulsout enable,1
let pinsB = %00000001 ; Display Clear
pulsout enable,1
pause 7 ; Allow 6.2ms to clear display
setfreq m16 ; now change to 16Mhz
let pinsB = %00000010 ; Return Home
pulsout enable,1
let pinsB = %00000110 ; Entry Mode, ID=1, SH=0
pulsout enable, 1
high rs ; Leave in character mode
return
; display message from EEPROM sub routine
; message number 0-11 must be in b1 when called
; uses (alters) b1, b2, b3, b4
msg:
let b2 = b1 // 12 * 20 ; EEPROM start address is 0 to 11 multiplied by 20
let b3 = b2 + 20 - 1 ; end address is start address + (20 - 1)
for b4 = b2 to b3 ; for 20 times
read b4,b1 ; read next character from EEPROM data memory into b1
let pinsB = b1 ; output the data
pulsout enable,1 ; pulse the enable pin to send data.
next b4 ; next loop
return
Can you explain this line from your "Main Board" post:
"relays connected to D.0 & D.7 and provided voltage free change over contact. mains rated."
I particularly don't understand the part after "and".
Testing stage is now done,impressive, hope you can make it...
Hope to hear from you, when it is done..