diff options
| author | Daniel Thompson <daniel@redfelineninja.org.uk> | 2020-01-30 21:46:35 (GMT) |
|---|---|---|
| committer | Daniel Thompson <daniel@redfelineninja.org.uk> | 2020-01-30 21:46:35 (GMT) |
| commit | a34d65d7fdfbbaaa3e6484dfebe914378f478ca2 (patch) | |
| tree | 1ccce90a51620a2a5d08b348c86f47ac7bd8c663 /wasp/drivers | |
| parent | ef5d805c51dd885bc69cc6f8d2deede75f28cd76 (diff) | |
wasp: Add battery support
Diffstat (limited to 'wasp/drivers')
| -rw-r--r-- | wasp/drivers/battery.py | 36 | ||||
| -rw-r--r-- | wasp/drivers/signal.py | 23 |
2 files changed, 59 insertions, 0 deletions
diff --git a/wasp/drivers/battery.py b/wasp/drivers/battery.py new file mode 100644 index 0000000..cc1eafb --- /dev/null +++ b/wasp/drivers/battery.py @@ -0,0 +1,36 @@ +# Generic lithium ion battery driver + +from machine import Pin, ADC + +class Battery(object): + def __init__(self, battery, charging, power=None): + self._battery = ADC(battery) + self._charging = charging + self._power = power + + def charging(self): + return self._charging.value() + + def power(self): + if self._power: + return self._power.value() + return self._charging.value() + + def voltage_mv(self): + # Assumes a 50/50 voltage divider and a 3.3v power supply + raw = self._battery.read_u16() + return (2 * 3300 * raw) // 65535 + + def level(self): + # This is a trivial battery level estimation approach. It is assumes + # the discharge from 4v to 3.5v is roughly linear and 4v is 100% and + # that 3.5v is 5%. Below 3.5v the voltage will start to drop pretty + # sharply to we will drop from 5% to 0% pretty fast... but we'll + # live with that for now. + mv = self.voltage_mv() + level = ((19 * mv) // 100) - 660 + if level > 100: + return 100 + if level < 0: + return 0 + return level diff --git a/wasp/drivers/signal.py b/wasp/drivers/signal.py new file mode 100644 index 0000000..18ce8bf --- /dev/null +++ b/wasp/drivers/signal.py @@ -0,0 +1,23 @@ +class Signal(object): + '''Simplified Signal class + + Note: The normal C implementation isn't working for the NRF port + ''' + + def __init__(self, pin, invert=False): + self.pin = pin + self.invert = invert + + def __call__(self, v=None): + return self.value(v) + + def value(self, v=None): + if v == None: + return self.invert ^ self.pin.value() + self.pin.value(self.invert ^ bool(v)) + + def on(self): + self.value(1) + + def off(self): + self.value(0) |
