Added plugin for supporting MCP3008 ADC for analog sensors
This commit is contained in:
parent
40d1b7481a
commit
2186336bbc
2 changed files with 90 additions and 0 deletions
88
platypush/plugins/gpio/sensor/mcp3008/__init__.py
Normal file
88
platypush/plugins/gpio/sensor/mcp3008/__init__.py
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
import enum
|
||||||
|
import logging
|
||||||
|
import time
|
||||||
|
|
||||||
|
import Adafruit_GPIO.SPI as SPI
|
||||||
|
import Adafruit_MCP3008
|
||||||
|
|
||||||
|
from platypush.plugins.gpio.sensor import GpioSensorPlugin
|
||||||
|
from platypush.message.response import Response
|
||||||
|
|
||||||
|
|
||||||
|
class MCP3008Mode(enum.Enum):
|
||||||
|
SOFTWARE = 'software'
|
||||||
|
HARDWARE = 'hardware'
|
||||||
|
|
||||||
|
|
||||||
|
class GpioSensorMcp3008Plugin(GpioSensorPlugin):
|
||||||
|
"""
|
||||||
|
Plugin to read analog sensor values from an MCP3008 chipset,
|
||||||
|
see https://learn.adafruit.com/raspberry-pi-analog-to-digital-converters/mcp3008
|
||||||
|
Requires adafruit-mcp3008 Python package
|
||||||
|
"""
|
||||||
|
|
||||||
|
N_CHANNELS = 8
|
||||||
|
|
||||||
|
def __init__(self, CLK=None, MISO=None, MOSI=None, CS=None, spi_port=None,
|
||||||
|
spi_device=None, channels=None, Vdd=3.3, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
if CLK and MISO and MOSI and CS:
|
||||||
|
self.CLK = CLK
|
||||||
|
self.MISO = MISO
|
||||||
|
self.MOSI = MOSI
|
||||||
|
self.CS = CS
|
||||||
|
self.mode = MCP3008Mode.SOFTWARE
|
||||||
|
elif spi_port and spi_device:
|
||||||
|
self.spi_port = spi_port
|
||||||
|
self.spi_device = spi_device
|
||||||
|
self.mode = MCP3008Mode.HARDWARE
|
||||||
|
else:
|
||||||
|
raise RuntimeError("At least one mode must be specified.\n" +
|
||||||
|
"Software SPI: Specify CLK, MISO, MOSI and CS pins\n" +
|
||||||
|
"Hardware SPI: Specify spi_port and spi_device\n")
|
||||||
|
|
||||||
|
self.Vdd = Vdd
|
||||||
|
self.channels = channels if channels else {}
|
||||||
|
self.mcp = None
|
||||||
|
|
||||||
|
|
||||||
|
def _get_mcp(self):
|
||||||
|
if self.mode == MCP3008Mode.SOFTWARE:
|
||||||
|
self.mcp = Adafruit_MCP3008.MCP3008(clk=self.CLK, cs=self.CS,
|
||||||
|
miso=self.MISO, mosi=self.MOSI)
|
||||||
|
elif self.mode == MCP3008Mode.HARDWARE:
|
||||||
|
self.mcp = Adafruit_MCP3008.MCP3008(spi=SPI.SpiDev(self.spi_port, self.spi_device))
|
||||||
|
else:
|
||||||
|
raise RuntimeError('Unsupported MCP3008 mode: {}'.format(self.mode))
|
||||||
|
|
||||||
|
return self.mcp
|
||||||
|
|
||||||
|
|
||||||
|
def _convert_to_voltage(self, value):
|
||||||
|
return (value * self.Vdd) / 1023.0 if value is not None else None
|
||||||
|
|
||||||
|
|
||||||
|
def get_measurement(self):
|
||||||
|
mcp = self._get_mcp()
|
||||||
|
values = {}
|
||||||
|
|
||||||
|
for i in range(self.N_CHANNELS):
|
||||||
|
value = self._convert_to_voltage(mcp.read_adc(i))
|
||||||
|
|
||||||
|
if self.channels:
|
||||||
|
if i in self.channels:
|
||||||
|
channel = self.channels[i]
|
||||||
|
if 'conv_function' in channel:
|
||||||
|
x = value
|
||||||
|
value = eval(channel['conv_function'])
|
||||||
|
|
||||||
|
values[channel['name']] = value
|
||||||
|
else:
|
||||||
|
values[i] = value
|
||||||
|
|
||||||
|
return Response(output=values)
|
||||||
|
|
||||||
|
|
||||||
|
# vim:sw=4:ts=4:et:
|
||||||
|
|
2
setup.py
2
setup.py
|
@ -80,6 +80,8 @@ setup(
|
||||||
'Support for most of the HTTP poll backends': ['python-dateutil'],
|
'Support for most of the HTTP poll backends': ['python-dateutil'],
|
||||||
'Support for Last.FM scrobbler plugin': ['pylast'],
|
'Support for Last.FM scrobbler plugin': ['pylast'],
|
||||||
'Support for custom hotword detection': ['snowboy'],
|
'Support for custom hotword detection': ['snowboy'],
|
||||||
|
'Support for GPIO pins access': ['RPi.GPIO'],
|
||||||
|
'Support for MCP3008 analog-to-digital converter plugin': ['adafruit-mcp3008'],
|
||||||
# 'Support for Flic buttons': ['git+ssh://git@github.com/50ButtonsEach/fliclib-linux-hci']
|
# 'Support for Flic buttons': ['git+ssh://git@github.com/50ButtonsEach/fliclib-linux-hci']
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue