summaryrefslogtreecommitdiff
path: root/wpd/WpdBasicHardwareDriver/firmware
diff options
context:
space:
mode:
authorDave Wilson <[email protected]>2015-03-17 19:50:07 -0700
committerDave Wilson <[email protected]>2015-03-17 19:50:07 -0700
commit97cf5197cf5b882b2c689d8dc2b555f2edf8f418 (patch)
tree46f3701832d70b420eb0fc0eb93261f9da45db3f /wpd/WpdBasicHardwareDriver/firmware
parentef1905bf1e8825bb31120dfb27e0daf3154d859a (diff)
Initial publish
Diffstat (limited to 'wpd/WpdBasicHardwareDriver/firmware')
-rw-r--r--wpd/WpdBasicHardwareDriver/firmware/compass_wpd_enabled.bs294
-rw-r--r--wpd/WpdBasicHardwareDriver/firmware/flex_force_wpd_enabled.bs260
-rw-r--r--wpd/WpdBasicHardwareDriver/firmware/h48c_3-axis_wpd_enabled.bs2175
-rw-r--r--wpd/WpdBasicHardwareDriver/firmware/memsic2125_wpd_enabled.bs2107
-rw-r--r--wpd/WpdBasicHardwareDriver/firmware/piezo_wpd_enabled.bs255
-rw-r--r--wpd/WpdBasicHardwareDriver/firmware/ping_wpd_enabled.bs257
-rw-r--r--wpd/WpdBasicHardwareDriver/firmware/pir_wpd_enabled.bs250
-rw-r--r--wpd/WpdBasicHardwareDriver/firmware/qti_wpd_enabled.bs263
-rw-r--r--wpd/WpdBasicHardwareDriver/firmware/temp_humidity_wpd_enabled.bs2225
9 files changed, 886 insertions, 0 deletions
diff --git a/wpd/WpdBasicHardwareDriver/firmware/compass_wpd_enabled.bs2 b/wpd/WpdBasicHardwareDriver/firmware/compass_wpd_enabled.bs2
new file mode 100644
index 00000000..335d2c7e
--- /dev/null
+++ b/wpd/WpdBasicHardwareDriver/firmware/compass_wpd_enabled.bs2
@@ -0,0 +1,94 @@
+' Compass_wpd_enabled.bs2
+'
+' Displays x (N/S) and y (W/E) axis measurements along with the direction the
+' Compass Module is pointing, measured in degrees clockwise from north.
+'
+' THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
+' ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+' THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+' PARTICULAR PURPOSE.
+'
+' Copyright (c) Microsoft Corporation. All rights reserved
+'
+' {$STAMP BS2}
+' {$PBASIC 2.5}
+' ============================================================================
+
+' -----[ Pins/Constants/Variables ]-------------------------------------------
+DinDout PIN 6 ' P6 transceives to/from Din/Dout
+Clk PIN 5 ' P5 sends pulses to HM55B's Clk
+En PIN 4 ' P4 controls HM55B's /EN(ABLE)
+
+Reset CON %0000 ' Reset command for HM55B
+Measure CON %1000 ' Start measurement command
+Report CON %1100 ' Get status/axis values command
+Ready CON %1100 ' 11 -> Done, 00 -> no errors
+NegMask CON %1111100000000000 ' For 11-bit negative to 16-bits
+
+x VAR Word ' x-axis data
+y VAR Word ' y-axis data
+status VAR Nib ' Status flags
+angle VAR Word ' Store angle measurement
+
+SensorID VAR Byte 'Sensor identifier = 5 for PIR
+ElementSize VAR Byte 'Size (in bytes) of each element
+ElementCount VAR Byte 'Count of elements in packet
+Padding VAR Byte 'Padding for the 8-byte element
+
+SensorID = 1
+ElementSize = 1
+ElementCount = 3 '3-bytes for compass data;
+
+NewInterval VAR Word 'New interval requested by user
+Interval VAR Word 'Interval value utlized by firmware
+
+LFD CON $10 'Linefeed character
+
+Interval = 200 '.20 of a second interval
+NewInterval = 200
+
+' -----[ Main Routine ]-------------------------------------------------------
+
+Main:
+ GOSUB PollSensor 'Was motion detected?
+ GOSUB RetrieveInterval 'Retrieve units data
+
+' -----[ Subroutines ]--------------------------------------------------------
+
+Timeout:
+ SEROUT 16, 16468, [DEC1 SensorID, DEC1 ElementSize, DEC1 ElementCount, DEC3 angle, DEC5 Interval,LFD]
+ GOTO Main
+
+PollSensor: ' Compass module subroutine
+
+ HIGH En: LOW En ' Send reset command to HM55B
+ SHIFTOUT DinDout,clk,MSBFIRST,[Reset\4]
+
+ HIGH En: LOW En ' HM55B start measurement command
+ SHIFTOUT DinDout,clk,MSBFIRST,[Measure\4]
+ status = 0 ' Clear previous status flags
+
+ DO ' Status flag checking loop
+ HIGH En: LOW En ' Measurement status command
+ SHIFTOUT DinDout,clk,MSBFIRST,[Report\4]
+ SHIFTIN DinDout,clk,MSBPOST,[Status\4] ' Get Status
+ LOOP UNTIL status = Ready ' Exit loop when status is ready
+
+ SHIFTIN DinDout,clk,MSBPOST,[x\11,y\11] ' Get x & y axis values
+ HIGH En ' Disable module
+
+ IF (y.BIT10 = 1) THEN y = y | NegMask ' Store 11-bits as signed word
+ IF (x.BIT10 = 1) THEN x = x | NegMask ' Repeat for other axis
+
+ angle = x ATN -y ' Convert x and y to brads
+ angle = angle */ 360 ' Convert brads to degrees
+
+ RETURN
+
+
+RetrieveInterval:
+ SERIN 16, 16468, Interval, Timeout, [DEC NewInterval] 'Retrieve interval
+ IF NewInterval >= 10 AND NewInterval <= 60000 THEN
+ Interval = NewInterval
+ ENDIF
+ RETURN \ No newline at end of file
diff --git a/wpd/WpdBasicHardwareDriver/firmware/flex_force_wpd_enabled.bs2 b/wpd/WpdBasicHardwareDriver/firmware/flex_force_wpd_enabled.bs2
new file mode 100644
index 00000000..9b9e5b2c
--- /dev/null
+++ b/wpd/WpdBasicHardwareDriver/firmware/flex_force_wpd_enabled.bs2
@@ -0,0 +1,60 @@
+' Flex_force_wpd_enabled.bs2
+'
+' Displays R/C Discharge Time in BASIC Stamp DEBUG Window
+'
+' THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
+' ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+' THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+' PARTICULAR PURPOSE.
+'
+' Copyright (c) Microsoft Corporation. All rights reserved
+'
+' {$STAMP BS2}
+' {$PBASIC 2.5}
+' =========================================================================
+
+' -----[ Declarations ]----------------------------------------------------
+
+rawForce VAR Word ' Stores raw output
+sensorPin CON 15 ' Flexiforce sensor circuit
+
+' -----[ Main Routine ]----------------------------------------------------
+
+SensorID VAR Byte 'Sensor identifier = 5 for PIR
+ElementSize VAR Byte 'Size (in bytes) of each element
+ElementCount VAR Byte 'Count of elements in packet
+Padding VAR Byte 'Padding for the 8-byte element
+
+SensorID = 3
+ElementSize = 1
+ElementCount = 5 '4-bytes for pressure data; 5 for interval
+
+NewInterval VAR Word 'New interval requested by user
+Interval VAR Word 'Interval value utlized by firmware
+
+Interval = 200
+NewInterval = 200
+
+LFD CON $10 'Linefeed character
+
+Main:
+
+ GOSUB PollSensor 'Was motion detected?
+ GOSUB RetrieveInterval 'Retrieve units data
+
+Timeout:
+ SEROUT 16, 16468, [DEC1 SensorID, DEC1 ElementSize, DEC1 ElementCount, DEC5 rawForce, DEC5 Interval, LFD]
+ GOTO Main
+
+PollSensor:
+ HIGH sensorPin ' Discharge the capacitor
+ PAUSE 2
+ RCTIME sensorPin,1,rawForce ' Measure RC charge time
+ RETURN
+
+RetrieveInterval:
+ SERIN 16, 16468, Interval, Timeout, [DEC NewInterval] 'Retrieve interval
+ IF NewInterval >= 10 AND NewInterval <= 60000 THEN
+ Interval = NewInterval
+ ENDIF
+ RETURN
diff --git a/wpd/WpdBasicHardwareDriver/firmware/h48c_3-axis_wpd_enabled.bs2 b/wpd/WpdBasicHardwareDriver/firmware/h48c_3-axis_wpd_enabled.bs2
new file mode 100644
index 00000000..daba0fc9
--- /dev/null
+++ b/wpd/WpdBasicHardwareDriver/firmware/h48c_3-axis_wpd_enabled.bs2
@@ -0,0 +1,175 @@
+' h48c_3-axis_wpd_enabled.bs2
+'
+' THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
+' ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+' THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+' PARTICULAR PURPOSE.
+'
+' Copyright (c) Microsoft Corporation. All rights reserved
+'
+' {$STAMP BS2}
+' {$PBASIC 2.5}
+'
+' =========================================================================
+
+' -----[ Program Description ]---------------------------------------------
+'
+' Test program for the H48C 3-Axis Accelerometer module.
+'
+' Connections:
+'
+' +------------+
+' | * |
+' CLK | o o | Vdd (+5v)
+' | +--+ |
+' DIO [ o | | o | CS\
+' | +--+ |
+' Vss | o o | 0G (free-fall indication)
+' | |
+' +------------+
+'
+' How it Works:
+'
+' An onboard MCP3204 12-bit ADC is used to read the VRef, X-, Y-, and
+' Z-axis outputs from the Hitachi H48C accelerometer. The reference
+' voltage output from H48C is 1.65 volts (3.3 / 2).
+'
+' After reading the reference voltage and an output channel the g-force
+' for the channel is calculated with this formula:
+'
+' axis - vref 3.3
+' G = ----------- x ------
+' 4095 0.3663
+'
+' For use in the program the forumla can be simplified to:
+'
+' G = (axis - vref) x 0.0022
+'
+' To allow the display of fractional g-force in the integer system of the
+' BASIC Stamp we multiply 0.0022 by 100 -- this will allow us to display
+' g-force in 0.01g units.
+
+
+
+' -----[ I/O Definitions ]-------------------------------------------------
+
+Dio PIN 15 ' data to/from module
+Clk PIN 14 ' clock output
+CS PIN 13 ' active-low chip select
+
+
+' -----[ Constants ]-------------------------------------------------------
+
+XAxis CON 0 ' adc channels
+YAxis CON 1
+ZAxis CON 2
+VRef CON 3
+
+Cnt2Mv CON $CE4C ' counts to millivolts
+ ' 0.80586 with **
+GfCnv CON $3852 ' g-force conversion
+ ' 0.22 with **
+
+' -----[ Variables ]-------------------------------------------------------
+
+axis VAR Nib ' axis selection
+rvCount VAR Word ' ref voltage adc counts
+axCount VAR Word ' axis voltage adc counts
+mVolts VAR Word ' millivolts
+Gforce VAR Word ' axis g-force
+
+xGforce VAR Word ' x-axis force
+yGforce VAR Word ' y-axis force
+zGforce VAR Word ' z-axis force
+
+dValue VAR Word ' display value
+dPad VAR Nib ' display pad
+
+' Below lines are WPD additions
+
+SensorID VAR Byte 'Sensor identifier = 9 for Hitachi
+ElementCount VAR Byte 'Count of elements in packet
+ElementSize VAR Byte 'Size (in bytes) of each element
+
+
+NewInterval VAR Word 'New interval requested by user
+Interval VAR Word 'Interval value utlized by firmware
+
+SensorID = 9
+ElementSize = 4 'Each element contains a sign byte, followed by a G-force integer value, followed by a G-force fraction (in hundredths).
+ElementCount = 3 'Each element corresponds to one of the three axis (X, Y, and Z)
+
+Interval = 2000
+NewInterval = 2000
+
+
+' -----[ EEPROM Data ]-----------------------------------------------------
+
+
+' -----[ Initialization ]--------------------------------------------------
+
+Reset:
+ HIGH CS ' deselect module
+
+' -----[ Program Code ]----------------------------------------------------
+
+Main:
+ GOSUB GetGforces 'Retrieves G-forces along 3 axis
+ GOSUB RetrieveInterval 'Retrieves event-interval data
+
+ Timeout:
+ SEROUT 16, 16780, [DEC1 SensorID, DEC1 ElementSize, DEC1 ElementCount, DEC1(xGforce.BIT15), DEC1(ABS xGforce/100),DEC2(ABS xGforce),DEC1(yGforce.BIT15),DEC1(ABS yGforce/100),DEC2(ABS yGforce),DEC1(zGforce.BIT15),DEC1(ABS zGforce/100),DEC2(ABS zGforce),DEC5 Interval ]
+ GOTO Main
+
+ GOTO Main
+
+
+' -----[ Subroutines ]-----------------------------------------------------
+
+' Retrieves the event-interval property from the WPD driver
+RetrieveInterval:
+ SERIN 16, 16780, Interval, Timeout, [DEC NewInterval] 'Retrieve interval
+ IF NewInterval >= 10 AND NewInterval <= 60000 THEN
+ Interval = NewInterval
+ ENDIF
+
+' Retrieves G forces along all three axis
+GetGforces:
+ FOR axis = XAxis TO ZAxis ' loop through each axis
+ GOSUB Get_H48C ' read vRef & axis counts
+ ' calculate g-force
+ ' -- "Gforce" is signed word
+ IF (axCount >= rvCount) THEN
+ Gforce = (axCount - rvCount) ** GfCnv ' positive g-force
+ ELSE
+ Gforce = -((rvCount - axCount) ** GfCnv) ' negative g-force
+ ENDIF
+ IF (axis = XAxis) THEN
+ xGforce = Gforce
+ ENDIF
+ IF (axis = YAxis) THEN
+ yGforce = Gforce
+ ENDIF
+ IF (axis = ZAxis) THEN
+ zGforce = Gforce
+ ENDIF
+ NEXT
+ RETURN
+
+' Reads VRef and selected H48C axis through an MCP3204 ADC
+' -- pass axis (0 - 2) in "axis"
+' -- returns reference voltage counts in "rvCount"
+' -- returns axis voltage counts in "axCounts"
+
+Get_H48C:
+ LOW CS
+ SHIFTOUT Dio, Clk, MSBFIRST, [%11\2, VRef\3] ' select vref register
+ SHIFTIN Dio, Clk, MSBPOST, [rvCount\13] ' read ref voltage counts
+ HIGH CS
+ PAUSE 1
+ LOW CS
+ SHIFTOUT Dio, Clk, MSBFIRST, [%11\2, axis\3] ' select axis
+ SHIFTIN Dio, Clk, MSBPOST, [axCount\13] ' read axis voltage counts
+ HIGH CS
+ RETURN
+
diff --git a/wpd/WpdBasicHardwareDriver/firmware/memsic2125_wpd_enabled.bs2 b/wpd/WpdBasicHardwareDriver/firmware/memsic2125_wpd_enabled.bs2
new file mode 100644
index 00000000..80449357
--- /dev/null
+++ b/wpd/WpdBasicHardwareDriver/firmware/memsic2125_wpd_enabled.bs2
@@ -0,0 +1,107 @@
+' memsic2125_wpd_enabled.bs2
+'
+' THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
+' ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+' THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+' PARTICULAR PURPOSE.
+'
+' Copyright (c) Microsoft Corporation. All rights reserved
+'
+' {$STAMP BS2}
+' {$PBASIC 2.5}
+'
+' =========================================================================
+
+' -----[ Program Description ]---------------------------------------------
+'
+' Read the pulse outputs from a Memsic 2125 accelerometer and converts to
+' G-force
+'
+' g = ((t1 / 10 ms) - 0.5) / 12.5%
+'
+' www.memsic.com
+
+
+' -----[ Revision History ]------------------------------------------------
+
+
+' -----[ I/O Definitions ]-------------------------------------------------
+
+Xin PIN 8 ' X input from Memsic 2125
+Yin PIN 9 ' Y input from Memsic 2125
+
+
+' -----[ Constants ]-------------------------------------------------------
+
+' Set scale factor for PULSIN
+
+#SELECT $STAMP
+ #CASE BS2, BS2E
+ Scale CON $200 ' 2.0 us per unit
+ #CASE BS2SX
+ Scale CON $0CC ' 0.8 us per unit
+ #CASE BS2P
+ Scale CON $0C0 ' 0.75 us per unit
+ #CASE BS2PE
+ Scale CON $1E1 ' 1.88 us per unit
+#ENDSELECT
+
+HiPulse CON 1 ' measure high-going pulse
+LoPulse CON 0
+
+' -----[ Variables ]-------------------------------------------------------
+
+xRaw VAR Word ' pulse from Memsic 2125
+xmG VAR Word ' g force (1000ths)
+
+yRaw VAR Word
+ymG VAR Word
+
+'disp VAR Byte ' displacement (0.0 - 0.99)
+
+
+' Below lines are WPD additions
+
+SensorID VAR Byte 'Sensor identifier = 1 for memsic
+ElementSize VAR Byte 'Size (in bytes) of each element
+ElementCount VAR Byte 'Count of elements in packet
+
+NewInterval VAR Word 'New interval requested by user
+Interval VAR Word 'Interval value utlized by firmware
+
+SensorID = 6
+ElementSize = 1
+ElementCount = 6 '6-bytes for g-force
+
+LFD CON $10 'Linefeed character
+
+Interval = 100 '.10 of a second interval
+NewInterval = 100
+
+' -----[ Program Code ]----------------------------------------------------
+
+Main:
+ GOSUB Read_G_Force 'reads G-force
+ GOSUB RetrieveInterval 'Retrieve units data
+
+ Timeout:
+ SEROUT 16, 16468, [DEC1 SensorID, DEC1 ElementSize, DEC1 ElementCount, DEC1(xmG.BIT15), DEC1(ABS xmG/1000),DEC1(ABS xmG/10),DEC1(ymG.BIT15),DEC1(ABS ymG/1000),DEC1(ABS ymG/10),DEC5 Interval,LFD]
+ GOTO Main
+
+
+ RetrieveInterval:
+ SERIN 16, 16468, Interval, Timeout, [DEC NewInterval] 'Retrieve interval
+ IF NewInterval >= 10 AND NewInterval <= 60000 THEN
+ Interval = NewInterval
+ ENDIF
+
+' -----[ Subroutines ]-----------------------------------------------------
+
+Read_G_Force:
+ PULSIN Xin, HiPulse, xRaw ' read pulse output
+ xRaw = xRaw */ Scale ' convert to uSecs
+ xmG = ((xRaw / 10) - 500) * 8 ' calc 1/1000 g
+ PULSIN Yin, HiPulse, yRaw
+ yRaw = yRaw */ Scale
+ ymG = ((yRaw / 10) - 500) * 8
+ RETURN \ No newline at end of file
diff --git a/wpd/WpdBasicHardwareDriver/firmware/piezo_wpd_enabled.bs2 b/wpd/WpdBasicHardwareDriver/firmware/piezo_wpd_enabled.bs2
new file mode 100644
index 00000000..ff5a7b55
--- /dev/null
+++ b/wpd/WpdBasicHardwareDriver/firmware/piezo_wpd_enabled.bs2
@@ -0,0 +1,55 @@
+' Piezo_wpd_enabled.bs2
+'
+' This program demonstrates using the LDT0 as a switch/trigger
+'
+' THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
+' ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+' THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+' PARTICULAR PURPOSE.
+'
+' Copyright (c) Microsoft Corporation. All rights reserved
+'
+' {$STAMP BS2}
+' {$PBASIC 2.5}
+' =========================================================================
+
+SensorID VAR Byte 'Sensor identifier = 8 for piezo
+ElementSize VAR Byte 'Size (in bytes) of each element
+ElementCount VAR Byte 'Count of elements in packet
+bVibration VAR Byte 'Vibration-detection variable (single element for PIR)
+Padding VAR Byte 'Padding for the 8-byte element
+
+SensorID = 8
+ElementSize = 1
+ElementCount = 1 '1-byte for motion data; 5 for interval
+
+NewInterval VAR Word 'New interval requested by user
+Interval VAR Word 'Interval value utlized by firmware
+
+Interval = 500
+NewInterval = 500
+
+LFD CON $10 'Linefeed character
+
+
+' -----[ Program Code ]----------------------------------------------------
+
+Main:
+
+ GOSUB PollSensor 'Was motion detected?
+ GOSUB RetrieveInterval 'Retrieve units data
+
+Timeout:
+ SEROUT 16, 16468, [DEC1 SensorID, DEC1 ElementSize, DEC1 ElementCount, DEC1 bVibration, DEC5 Interval, LFD]
+ GOTO Main
+
+PollSensor:
+ bVibration = IN0 ' Assign status of P0 to bMotion
+ RETURN
+
+RetrieveInterval:
+ SERIN 16, 16468, Interval, Timeout, [DEC NewInterval] 'Retrieve interval
+ IF NewInterval >= 10 AND NewInterval <= 60000 THEN
+ Interval = NewInterval
+ ENDIF
+ RETURN
diff --git a/wpd/WpdBasicHardwareDriver/firmware/ping_wpd_enabled.bs2 b/wpd/WpdBasicHardwareDriver/firmware/ping_wpd_enabled.bs2
new file mode 100644
index 00000000..e2af29a7
--- /dev/null
+++ b/wpd/WpdBasicHardwareDriver/firmware/ping_wpd_enabled.bs2
@@ -0,0 +1,57 @@
+' Ping_wpd_enabled.bs2
+'
+' Measure distance with Ping))) sensor and display in both in & cm
+'
+' THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
+' ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+' THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+' PARTICULAR PURPOSE.
+'
+' Copyright (c) Microsoft Corporation. All rights reserved
+'
+' {$STAMP BS2}
+' {$PBASIC 2.5}
+' =========================================================================
+
+' Conversion constants for room temperature measurements.
+CmConstant CON 2260
+cmDistance VAR Word
+time VAR Word
+SensorID VAR Byte 'Sensor identifier = 5 for PIR
+ElementSize VAR Byte 'Size (in bytes) of each element
+ElementCount VAR Byte 'Count of elements in packet
+Padding VAR Byte 'Padding for the 8-byte element
+
+SensorID = 4
+ElementSize = 1
+ElementCount = 5 '4-bytes for pressure data; 5 for interval
+
+NewInterval VAR Word 'New interval requested by user
+Interval VAR Word 'Interval value utlized by firmware
+
+
+LFD CON $10 'Linefeed character
+
+Interval = 200 '.20 of a second interval
+NewInterval = 200
+
+Main:
+ GOSUB PollSensor 'Was motion detected?
+ GOSUB RetrieveInterval 'Retrieve units data
+
+Timeout:
+ SEROUT 16, 16468, [DEC1 SensorID, DEC1 ElementSize, DEC1 ElementCount, DEC5 cmDistance, DEC5 Interval,LFD]
+GOTO Main
+
+PollSensor:
+ PULSOUT 0, 5
+ PULSIN 0, 1, time
+ cmDistance = cmConstant ** time
+RETURN
+
+RetrieveInterval:
+ SERIN 16, 16468, Interval, Timeout, [DEC NewInterval] 'Retrieve interval
+ IF NewInterval >= 10 AND NewInterval <= 60000 THEN
+ Interval = NewInterval
+ ENDIF
+RETURN \ No newline at end of file
diff --git a/wpd/WpdBasicHardwareDriver/firmware/pir_wpd_enabled.bs2 b/wpd/WpdBasicHardwareDriver/firmware/pir_wpd_enabled.bs2
new file mode 100644
index 00000000..259c5025
--- /dev/null
+++ b/wpd/WpdBasicHardwareDriver/firmware/pir_wpd_enabled.bs2
@@ -0,0 +1,50 @@
+' Pir_wpd_enabled.bs2
+'
+' THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
+' ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+' THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+' PARTICULAR PURPOSE.
+'
+' Copyright (c) Microsoft Corporation. All rights reserved
+'
+' {$STAMP BS2}
+' {$PBASIC 2.5}
+' =========================================================================
+
+SensorID VAR Byte 'Sensor identifier = 5 for PIR
+ElementSize VAR Byte 'Size (in bytes) of each element
+ElementCount VAR Byte 'Count of elements in packet
+bMotion VAR Byte 'Motion-detection variable (single element for PIR)
+Padding VAR Byte 'Padding for the 8-byte element
+
+SensorID = 5
+ElementSize = 1
+ElementCount = 1 '1-byte for motion data; 5 for interval
+
+NewInterval VAR Word 'New interval requested by user
+Interval VAR Word 'Interval value utlized by firmware
+
+LFD CON $10 'Linefeed character
+
+Interval = 500 '.500 of a second interval
+NewInterval = 500
+
+Main:
+
+ GOSUB PollSensor 'Was motion detected?
+ GOSUB RetrieveInterval 'Retrieve units data
+
+Timeout:
+ SEROUT 16, 16468, [DEC1 SensorID, DEC1 ElementSize, DEC1 ElementCount, DEC1 bMotion, DEC5 Interval,LFD]
+ GOTO Main
+
+PollSensor:
+ bMotion = IN0 ' Assign status of P0 to bMotion
+ RETURN
+
+RetrieveInterval:
+ SERIN 16, 16468, Interval, Timeout, [DEC NewInterval] 'Retrieve interval
+ IF NewInterval >= 10 AND NewInterval <= 60000 THEN
+ Interval = NewInterval
+ ENDIF
+ RETURN \ No newline at end of file
diff --git a/wpd/WpdBasicHardwareDriver/firmware/qti_wpd_enabled.bs2 b/wpd/WpdBasicHardwareDriver/firmware/qti_wpd_enabled.bs2
new file mode 100644
index 00000000..fdfdff7c
--- /dev/null
+++ b/wpd/WpdBasicHardwareDriver/firmware/qti_wpd_enabled.bs2
@@ -0,0 +1,63 @@
+' Qti_wpd_enabled.bs2
+'
+' THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
+' ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+' THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+' PARTICULAR PURPOSE.
+'
+' Copyright (c) Microsoft Corporation. All rights reserved
+'
+' {$STAMP BS2}
+' {$PBASIC 2.5}
+' =========================================================================
+
+' -----[ I/O Definitions ]------------------------------------------------------
+LineSnsrPwr CON 10 ' line sensor power
+LineSnsrIn CON 9 ' line sensor input
+
+' -----[ Constants ]------------------------------------------------------------
+'CLREOL CON 11 ' clear to end of line (DEBUG)
+
+' -----[ Variables ]------------------------------------------------------------
+Sense VAR Word ' sensor raw reading
+
+SensorID VAR Byte 'Sensor identifier = 5 for PIR
+ElementSize VAR Byte 'Size (in bytes) of each element
+ElementCount VAR Byte 'Count of elements in packet
+Padding VAR Byte 'Padding for the 8-byte element
+NewInterval VAR Word 'New interval requested by user
+Interval VAR Word 'Interval value utlized by firmware
+
+SensorID = 7
+ElementSize = 1
+ElementCount = 4 '4-bytes for sensor data
+Interval = 200
+NewInterval = 200
+
+LFD CON $10 'Linefeed character
+
+' -----[ Main Code ]------------------------------------------------------------
+Main:
+
+ GOSUB PollSensor 'Retrieve sensor value
+ GOSUB RetrieveInterval 'Retrieve units data
+
+Timeout:
+ SEROUT 16, 16468, [DEC1 SensorID, DEC1 ElementSize, DEC1 ElementCount, DEC4 Sense, DEC5 Interval, LFD]
+ GOTO Main
+
+PollSensor:
+ HIGH LineSnsrPwr ' activate sensor
+ HIGH LineSnsrIn ' discharge QTI cap
+ PAUSE 1
+ RCTIME LineSnsrIn, 1, Sense ' read sensor value
+ LOW LineSnsrPwr ' deactivate sensor
+RETURN
+
+RetrieveInterval:
+ SERIN 16, 16468, Interval, Timeout, [DEC NewInterval] 'Retrieve interval
+ IF NewInterval >= 10 AND NewInterval <= 60000 THEN
+ Interval = NewInterval
+ ENDIF
+ RETURN
+
diff --git a/wpd/WpdBasicHardwareDriver/firmware/temp_humidity_wpd_enabled.bs2 b/wpd/WpdBasicHardwareDriver/firmware/temp_humidity_wpd_enabled.bs2
new file mode 100644
index 00000000..bc2982f7
--- /dev/null
+++ b/wpd/WpdBasicHardwareDriver/firmware/temp_humidity_wpd_enabled.bs2
@@ -0,0 +1,225 @@
+' Temp_humidity_wpd_enabled.BS2
+' This program demonstrates the interface and conversion of SHT11/15 data
+' to usable program values. This program uses advanced math features of
+' PBASIC, specifically the ** operator.
+'
+' THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
+' ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+' THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+' PARTICULAR PURPOSE.
+'
+' Copyright (c) Microsoft Corporation. All rights reserved
+'
+' {$STAMP BS2}
+' {$PBASIC 2.5}
+
+'
+' =========================================================================
+' -------------------------------------------------------------------------
+' I/O Definitions
+' -------------------------------------------------------------------------
+ShtData PIN 1 ' bi-directional data
+Clock PIN 0
+' -------------------------------------------------------------------------
+' Constants
+' -------------------------------------------------------------------------
+ShtTemp CON %00011 ' read temperature
+ShtHumi CON %00101 ' read humidity
+ShtStatW CON %00110 ' status register write
+ShtStatR CON %00111 ' status register read
+ShtReset CON %11110 ' soft reset
+Ack CON 0
+NoAck CON 1
+No CON 0
+Yes CON 1
+DegSym CON 186 ' degrees symbol for DEBUG
+' -------------------------------------------------------------------------
+' Variables
+' -------------------------------------------------------------------------
+ioByte VAR Byte ' data from/to SHT11
+ackBit VAR Bit ' ack/nak from/to SHT11
+toDelay VAR Byte ' timeout delay timer
+timeOut VAR Bit ' timeout status
+soT VAR Word ' temp counts from SHT11
+tC VAR Word ' temp - Celcius
+tF VAR Word ' temp - Fahrenheit
+soRH VAR Word ' humidity counts
+rhLin VAR Word ' humidity; linearized
+rhTrue VAR Word ' humidity; compensated
+status VAR Byte ' status byte
+
+'-------------------------------------------------------------------------
+' WPD Variables
+'-------------------------------------------------------------------------
+SensorID VAR Byte 'Sensor identifier = 2 for Sensiron Temp/Humidity
+ElementSize VAR Byte 'Size (in bytes) of each element
+ElementCount VAR Byte 'Count of elements in packet
+Padding VAR Byte 'Padding for the 8-byte element
+
+SensorID = 2
+ElementSize = 1
+ElementCount = 7 '4-bytes for temp, 3-bytes for relative humidity
+
+NewInterval VAR Word 'New interval requested by user
+Interval VAR Word 'Interval value utlized by firmware
+
+LFD CON $10 'Linefeed character
+
+Interval = 2000
+NewInterval = 2000
+
+' -------------------------------------------------------------------------
+' EEPROM Data
+' -------------------------------------------------------------------------
+' -------------------------------------------------------------------------
+' Initialization
+' -------------------------------------------------------------------------
+Initialize:
+GOSUB SHT_Connection_Reset ' reset device connection
+' -------------------------------------------------------------------------
+' Program Code
+' -------------------------------------------------------------------------
+Main:
+ GOSUB SHT_Measure_Temp 'Retrieve temperature
+ GOSUB SHT_Measure_Humidity 'Retrieve humidity
+ GOSUB RetrieveInterval 'Retrieve interval data
+
+SendData:
+ SEROUT 16, 16468, [DEC1 SensorID, DEC1 ElementSize, DEC1 ElementCount, DEC4 (tF), DEC3 (rhTrue), DEC5 Interval, LFD]
+ GOTO Main
+
+RetrieveInterval:
+ SERIN 16, 16468, Interval, SendData, [DEC NewInterval] 'Retrieve interval
+ IF NewInterval >= 10 AND NewInterval <= 60000 THEN
+ Interval = NewInterval
+ ENDIF
+RETURN
+
+' -------------------------------------------------------------------------
+' Subroutines
+' -------------------------------------------------------------------------
+' connection reset: 9 clock cyles with ShtData high, then start sequence
+'
+SHT_Connection_Reset:
+SHIFTOUT ShtData, Clock, LSBFIRST, [$FFF\9]
+' generates SHT11 "start" sequence
+' _____ _____
+' ShtData |_______|
+' ___ ___
+' Clock ___| |___| |___
+'
+SHT_Start:
+INPUT ShtData ' let pull-up take high
+LOW Clock
+HIGH Clock
+LOW ShtData
+LOW Clock
+HIGH Clock
+INPUT ShtData
+LOW Clock
+RETURN
+' measure temperature
+' -- celcius = raw * 0.01 - 40
+' -- fahrenheit = raw * 0.018 - 40
+'
+SHT_Measure_Temp:
+GOSUB SHT_Start ' alert device
+ioByte = ShtTemp ' temperature command
+GOSUB SHT_Write_Byte ' send command
+GOSUB SHT_Wait ' wait for measurement
+ackBit = Ack ' another read follows
+GOSUB SHT_Read_Byte ' get MSB
+soT.HIGHBYTE = ioByte
+ackBit = NoAck ' last read
+GOSUB SHT_Read_Byte ' get LSB
+soT.LOWBYTE = ioByte
+' Note: Conversion factors are multiplied by 10 to return the
+' temperature values in tenths of degrees
+tC = soT ** $1999 - 400 ' convert to tenths C
+tF = soT ** $2E14 - 400 ' convert to tenths F
+RETURN
+' measure humidity
+'
+SHT_Measure_Humidity:
+GOSUB SHT_Start ' alert device
+ioByte = ShtHumi ' humidity command
+GOSUB SHT_Write_Byte ' send command
+GOSUB SHT_Wait ' wait for measurement
+ackBit = Ack ' another read follows
+GOSUB SHT_Read_Byte ' get MSB
+soRH.HIGHBYTE = ioByte
+ackBit = NoAck ' last read
+GOSUB SHT_Read_Byte ' get LSB
+soRH.LOWBYTE = ioByte
+' linearize humidity
+' rhLin = (soRH * 0.0405) - (soRH^2 * 0.0000028) - 4
+'
+' for the BASIC Stamp:
+' rhLin = (soRH * 0.0405) - (soRH * 0.002 * soRH * 0.0014) - 4
+'
+' Conversion factors are multiplied by 10 to return tenths
+'
+rhLin = (soRH ** $67AE) - (soRH ** $83 * soRH ** $5B) - 40
+' temperature compensated humidity
+' rhTrue = (tc - 25) * (soRH * 0.00008 + 0.01) + rhLin
+'
+' Conversion factors are multiplied by 10 to return tenths
+' -- simplified
+'
+rhTrue = (tC - 250) * (soRH ** $34) + rhLin
+RETURN
+' sends "status"
+'
+SHT_Write_Status:
+GOSUB SHT_Start ' alert device
+ioByte = ShtStatW ' write to status reg cmd
+GOSUB SHT_Write_Byte ' send command
+ioByte = status
+GOSUB SHT_Write_Byte
+RETURN
+' returns "status"
+'
+SHT_Read_Status:
+GOSUB SHT_Start ' alert device
+ioByte = ShtStatW ' write to status reg cmd
+GOSUB SHT_Read_Byte ' send command
+ackBit = NoAck ' only one byte to read
+GOSUB SHT_Read_Byte
+RETURN
+' sends "ioByte"
+' returns "ackBit"
+'
+SHT_Write_Byte:
+SHIFTOUT ShtData, Clock, MSBFIRST, [ioByte] ' send byte
+SHIFTIN ShtData, Clock, LSBPRE, [ackBit\1] ' get ack bit
+RETURN
+' returns "ioByte"
+' sends "ackBit"
+'
+SHT_Read_Byte:
+SHIFTIN ShtData, Clock, MSBPRE, [ioByte] ' get byte
+SHIFTOUT ShtData, Clock, LSBFIRST, [ackBit\1] ' send ack bit
+INPUT ShtData ' release data line
+RETURN
+' wait for device to finish measurement (pulls data line low)
+' -- timeout after ~1/4 second
+'
+SHT_Wait:
+INPUT ShtData ' data line is input
+timeOut = No ' assume no timeout
+FOR toDelay = 1 TO 250 ' wait ~1/4 second
+IF (ShtData = 0) THEN EXIT
+PAUSE 1
+NEXT
+IF (toDelay = 250) THEN timeOut = Yes ' loop completed = timeout
+RETURN
+
+' reset SHT11/15 with soft reset
+'
+SHT_Soft_Reset:
+GOSUB SHT_Connection_Reset ' reset the connection
+ioByte = ShtReset ' reset command
+ackBit = NoAck ' only one byte to send
+GOSUB SHT_Write_Byte ' send it
+PAUSE 11 ' wait at least 11 ms
+RETURN \ No newline at end of file