-
Notifications
You must be signed in to change notification settings - Fork 0
/
flowmeter.py
142 lines (123 loc) · 4.15 KB
/
flowmeter.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# SPDX-FileCopyrightText: 2019 Anne Barela for Adafruit Industries
#
# SPDX-License-Identifier: MIT
# Modified by Chase Matthews for IST 402
import time
import random
class FlowMeter():
PINTS_IN_A_LITER = 2.11338
SECONDS_IN_A_MINUTE = 60
MS_IN_A_SECOND = 1000.0
displayFormat = 'metric'
beverage = 'beer'
enabled = True
clicks = 0
lastClick = 0
clickDelta = 0
hertz = 0.0
flow = 0 # in Liters per second
thisPour = 0.0 # in Liters
totalPour = 0.0 # in Liters
lastPour = 0.0 #in Liters
kegSize = 'quarter'
calibrationFactor = 0.0
def __init__(self, displayFormat, beverage, size):
self.displayFormat = displayFormat
self.beverage = beverage
self.clicks = 0
self.lastClick = int(time.time() * FlowMeter.MS_IN_A_SECOND)
self.clickDelta = 0
self.hertz = 0.0
self.flow = 0.0
self.thisPour = 0.0
self.totalPour = 0.0
lastPour = 0.0
self.enabled = True
self.kegSize = size
self.calibrationFactor = .22
def update(self, currentTime):
self.clicks += 1
# get the time delta
self.clickDelta = max((currentTime - self.lastClick), 1)
# calculate the instantaneous speed
if (self.enabled == True and self.clickDelta < 1000):
self.hertz = FlowMeter.MS_IN_A_SECOND / self.clickDelta
self.flow = self.hertz / (FlowMeter.SECONDS_IN_A_MINUTE * 7.5) # In Liters per second
instPour = self.flow * (self.clickDelta / FlowMeter.MS_IN_A_SECOND) * self.calibrationFactor #Offset added to hopefully correct the calibration on the system
self.thisPour += instPour
self.totalPour += instPour
self.lastPour = self.thisPour
# Update the last click
self.lastClick = currentTime
def getBeverage(self):
return self.beverage
def setBeverage(self, newBev):
self.beverage = newBev
def getKeg(self):
return self.kegSize
def setKeg(self, newKeg):
self.kegSize = newKeg.lower()
def getFormattedClickDelta(self):
return str(self.clickDelta) + ' ms'
def getFormattedHertz(self):
return str(round(self.hertz,3)) + ' Hz'
def getFormattedFlow(self):
if(self.displayFormat == 'metric'):
return str(round(self.flow,3)) + ' L/s'
else:
return str(round(self.flow * FlowMeter.PINTS_IN_A_LITER, 3)) + ' pints/s'
def setThisPour(self, newPour):
self.lastPour = float(newPour)
self.thisPour = self.lastPour
def getFormattedThisPour(self):
if(self.displayFormat == 'metric'):
return str(round(self.thisPour,3)) + ' L'
else:
return str(round(self.thisPour * FlowMeter.PINTS_IN_A_LITER, 3)) + ' pints'
def setTotalPour(self, newTot):
self.totalPour = float(newTot)
def getFormattedTotalPour(self):
if(self.displayFormat == 'metric'):
return str(round(self.totalPour,3)) + ' L'
else:
return str(round(self.totalPour * FlowMeter.PINTS_IN_A_LITER, 3)) + ' pints'
def getFormattedBeerLeft(self):
kegVol = 0
if (self.kegSize == "quarter"):
kegVol = 29.34
else:
kegVol = 19.55
if(self.displayFormat == 'metric'):
return str(round((kegVol-self.totalPour),3)) + ' L'
else:
return str(round((kegVol-self.totalPour) * FlowMeter.PINTS_IN_A_LITER, 3)) + ' pints'
def getPercentLeft(self):
kegVol = 0
if (self.kegSize == "quarter"):
kegVol = 29.34
else:
kegVol = 19.55
return(str(round(100*((kegVol-self.totalPour)/kegVol),3)))
def clear(self):
self.thisPour = 0
self.totalPour = 0
self.lastPour = 0
def calibrate(self, gBeer):
gBeer=float(gBeer)
if (self.lastPour>0):
#clean up last pour
self.totalPour = (self.totalPour-self.lastPour)
#calculate relative error
relError = ((self.lastPour-(gBeer/1000.0))/(gBeer/1000.0))
#undo total pour
self.lastPour = (self.lastPour/self.calibrationFactor)
#set new calibration factor
self.calibrationFactor= (self.calibrationFactor/(1+relError))
#set new pour data
self.lastPour = (self.lastPour*self.calibrationFactor)
self.totalPour = (self.totalPour+self.lastPour)
self.thisPour = self.lastPour
else:
self.calibrationFactor = gBeer
def getCali(self):
return str(self.calibrationFactor)