107 lines
3 KiB
Python
107 lines
3 KiB
Python
import RPi.GPIO as GPIO
|
|
from datetime import datetime
|
|
|
|
|
|
class Sensors:
|
|
"""Class for communicate with sensors through MCP3008"""
|
|
|
|
def __init__(self, config):
|
|
self.mosi = int(config.get('adc', 'MOSI'))
|
|
self.miso = int(config.get('adc', 'MISO'))
|
|
self.clk = int(config.get('adc', 'CLK'))
|
|
self.cs = int(config.get('adc', 'CS'))
|
|
self.channel = 0
|
|
self.config = config
|
|
|
|
GPIO.setup(self.mosi, GPIO.OUT)
|
|
GPIO.setup(self.miso, GPIO.IN)
|
|
GPIO.setup(self.clk, GPIO.OUT)
|
|
GPIO.setup(self.cs, GPIO.OUT)
|
|
|
|
# read SPI data from MCP3008(or MCP3204) chip,8 possible adc's (0 thru 7)
|
|
def readadc(self):
|
|
adcnum = self.getChannel()
|
|
|
|
if ((adcnum > 7) or (adcnum < 0)):
|
|
return -1
|
|
|
|
GPIO.output(self.cs, True)
|
|
GPIO.output(self.clk, False) # start clock low
|
|
GPIO.output(self.cs, False) # bring CS low
|
|
|
|
commandout = adcnum
|
|
commandout |= 0x18 # start bit + single-ended bit
|
|
commandout <<= 3 # we only need to send 5 bits here
|
|
for i in range(5):
|
|
if (commandout & 0x80):
|
|
GPIO.output(self.mosi, True)
|
|
else:
|
|
GPIO.output(self.mosi, False)
|
|
|
|
commandout <<= 1
|
|
GPIO.output(self.clk, True)
|
|
GPIO.output(self.clk, False)
|
|
|
|
adcout = 0
|
|
|
|
# read in one empty bit, one null bit and 10 ADC bits
|
|
for i in range(12):
|
|
GPIO.output(self.clk, True)
|
|
GPIO.output(self.clk, False)
|
|
adcout <<= 1
|
|
if (GPIO.input(self.miso)):
|
|
adcout |= 0x1
|
|
|
|
GPIO.output(self.cs, True)
|
|
|
|
return adcout
|
|
|
|
# Convert value to volt
|
|
def convertToVoltage(self, value):
|
|
correction = 1
|
|
if (self.getChannelModel() == "arceli"):
|
|
correction = 2
|
|
|
|
return value * (3.3 / 1024) * 5 / correction
|
|
|
|
# Convert volt to celcius value
|
|
def convertToCelcius(self, value):
|
|
value /= 2
|
|
return (value * (3300.0/1024.0) - 100.0) / 10.0 - 40.0
|
|
|
|
def convertToPrintableValue(self, value):
|
|
if (self.getChannelType() == 'voltage'):
|
|
return self.convertToVoltage(value)
|
|
else:
|
|
return self.convertToCelcius(value)
|
|
|
|
def getChannelType(self):
|
|
return self.config.get(
|
|
'sensors',
|
|
'SENSOR_' + str(self.channel) + '_TYPE'
|
|
)
|
|
|
|
def getChannelModel(self):
|
|
return self.config.get(
|
|
'sensors',
|
|
'SENSOR_' + str(self.channel) + '_MODEL'
|
|
)
|
|
|
|
def getChannel(self):
|
|
return self.channel
|
|
|
|
def setChannel(self, channel):
|
|
self.channel = channel
|
|
|
|
def getValue(self):
|
|
if (self.channel == 8):
|
|
now = datetime.now()
|
|
return now.strftime("%H:%M")
|
|
else:
|
|
raw_value = self.readadc()
|
|
value = self.convertToPrintableValue(raw_value)
|
|
|
|
return f"{value:.02f}"
|
|
|
|
def main(self):
|
|
print('MAIN')
|