Skip to content

Commit

Permalink
Update sensor value checking. (#24)
Browse files Browse the repository at this point in the history
* Update sensor value checking.
  • Loading branch information
JeetShetty committed Jun 27, 2016
1 parent f0690a8 commit a9f5355
Show file tree
Hide file tree
Showing 10 changed files with 25 additions and 63 deletions.
5 changes: 4 additions & 1 deletion greenpithumb/adc.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# TODO(mtlynch): Move these pin constants to a configuration file so they're not
# hardcoded in.

# ADC pin to which water pump is connected
# ADC pin to which each component is connected
PIN_PUMP = 0
PIN_LIGHT_SENSOR = 1
PIN_MOISTURE_SENSOR = 2
Expand All @@ -14,6 +14,9 @@
# Signal to turn an ADC pin on.
SIGNAL_ON = 1023

PIN_MIN_VALUE = 0
PIN_MAX_VALUE = 1023


class Adc(object):
"""Wrapper for an MCP3008 analog to digital converter (ADC).
Expand Down
6 changes: 2 additions & 4 deletions greenpithumb/light_sensor.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import adc

_LIGHT_SENSOR_MAX_VALUE = 1023.0
_LIGHT_SENSOR_MIN_VALUE = 290.0
_LIGHT_SENSOR_MAX_VALUE = adc.PIN_MAX_VALUE


class LightSensor(object):
Expand All @@ -18,11 +18,9 @@ def __init__(self, adc):

def get_light_level(self):
"""Returns light level as percentage."""

light_level = self._adc.read_pin(adc.PIN_LIGHT_SENSOR)

if light_level < _LIGHT_SENSOR_MIN_VALUE or \
light_level > _LIGHT_SENSOR_MAX_VALUE:
if light_level < _LIGHT_SENSOR_MIN_VALUE:
raise ValueError('Light sensor reading out of range')

light_level_as_pct = 100 * (
Expand Down
13 changes: 1 addition & 12 deletions greenpithumb/moisture_sensor.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
import adc

#placeholder values
_MIN_MOISTURE_LEVEL = 0.0
_MAX_MOISTURE_LEVEL = 1023.0


class MoistureSensor(object):
"""Wrapper for DHT11 moisture sensor."""
Expand All @@ -19,11 +15,4 @@ def __init__(self, adc):

def moisture(self):
"""Returns moisture level."""
moisture_level = self._adc.read_pin(adc.PIN_MOISTURE_SENSOR)

if moisture_level < _MIN_MOISTURE_LEVEL or \
moisture_level > _MAX_MOISTURE_LEVEL:
raise ValueError('moisture level out of range: %.1f' %
moisture_level)

return moisture_level
return self._adc.read_pin(adc.PIN_MOISTURE_SENSOR)
6 changes: 4 additions & 2 deletions greenpithumb/pump.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import adc

# Pump rate in mL/s (4.3 L/min)
_PUMP_RATE_ML_PER_SEC = 4300.0 / 60.0

Expand Down Expand Up @@ -28,11 +30,11 @@ def pump_water(self, amount_ml):
elif amount_ml < 0.0:
raise ValueError('Cannot pump a negative amount of water')
else:
self._adc.write_pin(0, 1023)
self._adc.write_pin(adc.PIN_PUMP, adc.SIGNAL_ON)

wait_time_seconds = amount_ml / _PUMP_RATE_ML_PER_SEC
self._clock.wait(wait_time_seconds)

self._adc.write_pin(0, 0)
self._adc.write_pin(adc.PIN_PUMP, adc.SIGNAL_OFF)

return
17 changes: 12 additions & 5 deletions greenpithumb/reservoir.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
import weight_sensor
class Error(Exception):
pass


class ReservoirUnderWeightError(Error):
pass


class Reservoir(object):
Expand All @@ -17,9 +22,11 @@ def __init__(self, weight_sensor, container_weight):
def reservoir_level(self):
"""Returns reservoir level in ml."""
reservoir_weight_grams = self._weight_sensor.weight()
water_weight_grams = reservoir_weight_grams - self._container_weight
if water_weight_grams < weight_sensor.MIN_WEIGHT:
raise ValueError('Water level out of range: %.1f' %
water_weight_grams)
if reservoir_weight_grams < self._container_weight:
raise ReservoirUnderWeightError(
('Unexpected weight measured for reservoir (%.1f g), as it is '
'less than the weight of an empty reservoir (%.1f g).') % (
reservoir_weight_grams, self._container_weight))

water_weight_grams = reservoir_weight_grams - self._container_weight
return water_weight_grams #1 gr water ~ 1 ml water
5 changes: 0 additions & 5 deletions greenpithumb/weight_sensor.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import adc

MIN_WEIGHT = 0.0
_MAX_WEIGHT = 1023.0


class WeightSensor(object):
"""Wrapper for a weight sensor."""
Expand All @@ -19,8 +16,6 @@ def __init__(self, adc):
def weight(self):
"""Returns weight in grams."""
weight = self._adc.read_pin(adc.PIN_WEIGHT_SENSOR)
if not MIN_WEIGHT <= weight <= _MAX_WEIGHT:
raise ValueError('reservoir weight out of range: %.1f' % weight)

# TODO(JeetShetty): Implement the actual conversion from weight to
# weight_grams
Expand Down
9 changes: 1 addition & 8 deletions tests/test_light_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ def setUp(self):

def test_light_50_pct(self):
"""Midpoint light sensor value should return 50.0."""
# Midpoint between LIGHT_SENSOR_MIN_VALUE and LIGHT_SENSOR_MAX_VALUE
# Midpoint between LIGHT_SENSOR_MIN_VALUE and PIN_MAX_VALUE
self.mock_adc.read_pin.return_value = 656.5

light_level = self.light_sensor.get_light_level()
Expand All @@ -27,10 +27,3 @@ def test_light_level_too_low(self):
self.mock_adc.read_pin.return_value = (
light_sensor._LIGHT_SENSOR_MIN_VALUE - 1)
self.light_sensor.get_light_level()

def test_light_level_too_high(self):
"""Light sensor value greater than max should raise a ValueError."""
with self.assertRaises(ValueError):
self.mock_adc.read_pin.return_value = (
light_sensor._LIGHT_SENSOR_MAX_VALUE + 1)
self.light_sensor.get_light_level()
15 changes: 0 additions & 15 deletions tests/test_moisture_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,6 @@ def setUp(self):

def test_moisture_50(self):
"""Moisture level read should be moisture level returned."""

self.mock_adc.read_pin.return_value = 50.0
moisture_level = self.moisture_sensor.moisture()
self.assertEqual(moisture_level, 50.0)

def test_moisture_too_low_raises_ValueError(self):

with self.assertRaises(ValueError):
self.mock_adc.read_pin.return_value = (
moisture_sensor._MIN_MOISTURE_LEVEL - 1)
self.moisture_sensor.moisture()

def test_moisture_too_high_raises_ValueError(self):

with self.assertRaises(ValueError):
self.mock_adc.read_pin.return_value = (
moisture_sensor._MAX_MOISTURE_LEVEL + 1)
self.moisture_sensor.moisture()
2 changes: 1 addition & 1 deletion tests/test_reservoir.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def test_water_level_in_range(self):
self.assertAlmostEqual(5.0, res.reservoir_level())

def test_water_level_out_of_range(self):
with self.assertRaises(ValueError):
with self.assertRaises(reservoir.ReservoirUnderWeightError):
container_weight = 50.0
res = reservoir.Reservoir(self.mock_weight_sensor, container_weight)
self.mock_weight_sensor.weight.return_value = container_weight - 1
Expand Down
10 changes: 0 additions & 10 deletions tests/test_weight_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,3 @@ def test_weight_500(self):
self.mock_adc.read_pin.return_value = 500.0
weight = self.weight_sensor.weight()
self.assertEqual(weight, 500.0)

def test_weight_too_low_raises_ValueError(self):
with self.assertRaises(ValueError):
self.mock_adc.read_pin.return_value = weight_sensor.MIN_WEIGHT - 1
self.weight_sensor.weight()

def test_weight_too_high_raises_ValueError(self):
with self.assertRaises(ValueError):
self.mock_adc.read_pin.return_value = weight_sensor._MAX_WEIGHT + 1
self.weight_sensor.weight()

0 comments on commit a9f5355

Please sign in to comment.