Skip to content

Commit 1315d17

Browse files
committed
Detector workng well!
1 parent a5b3da1 commit 1315d17

File tree

2 files changed

+96
-48
lines changed

2 files changed

+96
-48
lines changed

SipNPyuff/code.py

Lines changed: 44 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,28 @@
44
import adafruit_lps35hw
55
from puff_detector import PuffDetector
66

7-
8-
9-
107
i2c = busio.I2C(board.SCL, board.SDA)
118
# i2c = DebugI2C(i2c)
129
lps = adafruit_lps35hw.LPS35HW(i2c, 0x5C)
10+
CONSOLE = True
11+
DEBUG = True
1312

1413
lps.zero_pressure()
1514
lps.data_rate = adafruit_lps35hw.DataRate.RATE_75_HZ
1615

1716
min_pressure = 8
1817
high_pressure = 20
19-
# sip/puff is "over" on keyup/pressure direction reversal
18+
# sip/puff is "over" on keyup/pressure polarity reversal
2019
# averaging code
2120

2221
lps.filter_enabled = True
23-
# print("Filter enabled:", lps.low_pass_enabled)
22+
# if CONSOLE: print("Filter enabled:", lps.low_pass_enabled)
2423

2524
lps.filter_config = True
26-
# print("Filter Config:", lps.low_pass_config)
25+
# if CONSOLE: print("Filter Config:", lps.low_pass_config)
2726
detector = PuffDetector(min_pressure=8, high_pressure=20)
2827
time.sleep(1)
29-
prev_direction = None
28+
prev_polarity = None
3029
pressure_list = []
3130
pressure_type = tuple()
3231
prev_pressure_type = tuple()
@@ -35,41 +34,48 @@
3534
prev_level = 0
3635
puff_end = puff_start
3736
prev_duration = 0
37+
start_polarity = 0
38+
prev_pressure = 0
39+
PRINT_FLOOR = 5
40+
if CONSOLE:
41+
print("CONSOLE?")
42+
if DEBUG and CONSOLE:
43+
print("Debug Console")
44+
counter = 0
3845
while True:
3946
current_pressure = lps.pressure
40-
# print((current_pressure,))
41-
42-
pressure_type = detector.catagorize_pressure(current_pressure)
43-
44-
if pressure_type != prev_pressure_type:
45-
puff_end = time.monotonic()
46-
puff_duration = puff_end - puff_start
47-
puff_start = puff_end
48-
# print("\tpressure type:", pressure_type)
49-
# print("duration:", puff_duration)
50-
direction, level = pressure_type
51-
# print("direction:", direction, "level:", level)
47+
if not CONSOLE:
48+
print((current_pressure,))
5249

53-
if (direction == 1) and (prev_level > level):
54-
print("Down")
55-
puff_duration += prev_duration
56-
level = prev_level
57-
if (direction == -1) and (prev_level < level):
58-
print("Up")
59-
puff_duration += prev_duration
60-
level = prev_level
50+
pressure_type = detector.catagorize_pressure(current_pressure, prev_pressure)
51+
polarity, level, direction = pressure_type
52+
# if (polarity != 0) or (level != 0):
53+
if abs(current_pressure) > PRINT_FLOOR:
54+
if counter % 4 == 0:
55+
if DEBUG and CONSOLE:
56+
print("\t\t\tpressure:", current_pressure)
6157

62-
# print("direction:", direction, "level:", level)
63-
if puff_duration > 0.2:
64-
print("direction:", direction, "level:", level)
58+
if level != 0 and start_polarity == 0: ###
59+
start_polarity = polarity
60+
puff_start = time.monotonic()
61+
if CONSOLE:
62+
print("START", end=" ")
63+
if start_polarity == 1:
64+
print("PUFF")
65+
if start_polarity == -1:
66+
print("SIP")
6567

66-
print("\tduration:", puff_duration)
67-
# print(current_pressure)
68-
label = detector.pressure_string((direction, level))
69-
label = detector.pressure_string(pressure_type)
70-
print("\t\t\t\t", label)
71-
print("____________________")
72-
prev_pressure_type = pressure_type
73-
prev_duration = puff_duration
68+
if (level == 0) and (start_polarity != 0):
69+
duration = time.monotonic() - puff_start
70+
if CONSOLE:
71+
print("END", end=" ")
72+
if start_polarity == 1:
73+
print("PUFF", "")
74+
if start_polarity == -1:
75+
print("SIP", "")
76+
print("Duration:", duration)
77+
start_polarity = 0
7478
prev_level = level
79+
prev_pressure = current_pressure
7580
time.sleep(0.01)
81+
counter += 1

SipNPyuff/puff_detector.py

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
class PuffDetector:
2-
32
def __init__(self, min_pressure=8, high_pressure=20):
4-
self.high_pressure=high_pressure
3+
self.high_pressure = high_pressure
54
self.min_pressure = min_pressure
5+
66
@classmethod
77
def rolling_average(cls, measurements, window_size=3):
88
# print("measurements", measurements)
@@ -37,10 +37,11 @@ def direction_changed(cls, measurements, prev_direction):
3737
direction = cls.direction(measurements)
3838
return prev_direction != direction
3939

40-
def catagorize_pressure(self, pressure):
40+
def catagorize_pressure(self, pressure, prev_pressure):
4141
"""determine the strength and polarity of the pressure reading"""
4242
level = 0
4343
direction = 0
44+
polarity = 0
4445
abs_pressure = abs(pressure)
4546

4647
if abs_pressure > self.min_pressure:
@@ -50,26 +51,67 @@ def catagorize_pressure(self, pressure):
5051

5152
if level != 0:
5253
if pressure > 0:
53-
direction = 1
54+
polarity = 1
5455
else:
55-
direction = -1
56+
polarity = -1
5657

57-
return (direction, level)
58+
if pressure > prev_pressure:
59+
direction = 1
60+
if pressure < prev_pressure:
61+
direction = -1
62+
63+
return (polarity, level, direction)
5864

5965
@staticmethod
6066
def pressure_string(pressure_type):
61-
direction, level = pressure_type
67+
polarity, level, direction = pressure_type # pylint:disable=unused-variable
6268
pressure_str = "HIGH"
63-
if level == 0 or direction == 0:
69+
if level == 0 or polarity == 0:
6470
return ""
6571
# print("pressure level:", level)
6672
if level == 1:
6773
pressure_str = "LOW"
6874
elif level == 2:
6975
pressure_str = "HIGH"
7076

71-
if direction == 1:
77+
if polarity == 1:
7278
pressure_str += "PUFF"
73-
elif direction == -1:
79+
elif polarity == -1:
7480
pressure_str += "SIP"
7581
return pressure_str
82+
83+
84+
# pylint:disable=pointless-string-statement
85+
"""
86+
def old_detect(self):
87+
if pressure_type != prev_pressure_type:
88+
puff_end = time.monotonic()
89+
puff_duration = puff_end - puff_start
90+
puff_start = puff_end
91+
if DEBUG and CONSOLE: print("\tpressure type:", pressure_type)
92+
if DEBUG and CONSOLE: print("duration:", puff_duration)
93+
if CONSOLE: print("polarity:", polarity, "level:", level)
94+
95+
# hack to handle triggering twice on the way up or down
96+
if (polarity == 1) and (prev_level > level):
97+
if CONSOLE: print("Down")
98+
puff_duration += prev_duration
99+
level = prev_level
100+
if (polarity == -1) and (prev_level < level):
101+
if CONSOLE: print("Up")
102+
puff_duration += prev_duration
103+
level = prev_level
104+
105+
if DEBUG and CONSOLE: print("polarity:", polarity, "level:", level)
106+
if puff_duration > 0.2:
107+
if CONSOLE: print("polarity:", polarity, "level:", level)
108+
109+
if CONSOLE: print("\tduration:", puff_duration)
110+
if DEBUG and CONSOLE: print(current_pressure)
111+
label = detector.pressure_string((polarity, level))
112+
label = detector.pressure_string(pressure_type)
113+
if CONSOLE: print("\t\t\t\t", label)
114+
if CONSOLE: print("____________________")
115+
prev_pressure_type = pressure_type
116+
prev_duration = puff_duration
117+
"""

0 commit comments

Comments
 (0)