Source code for grove.adc

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# The MIT License (MIT)
# Copyright (C) 2018  Seeed Technology Co.,Ltd. 
#
# This is the ADC library for Grove Base Hat
# which used to connect grove sensors for raspberry pi.
# 
'''
This is the code for
    - `Grove Base Hat for RPi      <https://www.seeedstudio.com/Grove-WS2813-RGB-LED-Strip-Waterproof-60-LED-m-1m-p-3126.html>`_
    - `Grove Base Hat for RPi Zero <https://www.seeedstudio.com/Grove-Base-Hat-for-Raspberry-Pi-Zero-p-3187.html>`_

Grove Base Hat incorparates a micro controller STM32F030F4.

Raspberry Pi does not have ADC unit, so we use an external chip
to transmit analog data to raspberry pi.

Examples:
    .. code-block:: python

        import time
        from grove.adc import ADC

        adc = ADC()
        while True:
            # Read channel 0(Slot A0) voltage
            print(adc.read_voltage(0))
            time.sleep(1)

'''
import sys
import grove.i2c

__all__ = [
    "ADC",
    "RPI_HAT_NAME", "RPI_ZERO_HAT_NAME",
    "RPI_HAT_PID", "RPI_ZERO_HAT_PID"
]

RPI_HAT_PID      = 0x0004
RPI_ZERO_HAT_PID = 0x0005
RPI_HAT_NAME     = 'Grove Base Hat RPi'
""" The HAT name to compare with return value of :class:`ADC.name` """
RPI_ZERO_HAT_NAME= 'Grove Base Hat RPi Zero'
""" The HAT name to compare with return value of :class:`ADC.name` """


[docs] class ADC(object): ''' Class ADC for the ADC unit on Grove Base Hat for RPi. Args: address(int): optional, i2c address of the ADC unit, default 0x04 ''' def __init__(self, address = 0x08): self.address = address self.bus = grove.i2c.Bus()
[docs] def read_raw(self, channel): ''' Read the raw data of ADC unit, with 12 bits resolution. Args: channel (int): 0 - 7, specify the channel to read Returns: (int): the adc result, in [0 - 4095] ''' addr = 0x10 + channel return self.read_register(addr)
# read input voltage (mV)
[docs] def read_voltage(self, channel): ''' Read the voltage data of ADC unit. Args: channel (int): 0 - 7, specify the channel to read Returns: (int): the voltage result, in mV ''' addr = 0x20 + channel return self.read_register(addr)
# input voltage / output voltage (%)
[docs] def read(self, channel): ''' Read the ratio between channel input voltage and power voltage (most time it's 3.3V). Args: channel (int): 0 - 7, specify the channel to read Returns: (int): the ratio, in 0.1% ''' addr = 0x30 + channel return self.read_register(addr)
@property def name(self): ''' Get the Hat name. Returns: (string): could be :class:`RPI_HAT_NAME` or :class:`RPI_ZERO_HAT_NAME` ''' id = self.read_register(0x0) if id == RPI_HAT_PID: return RPI_HAT_NAME elif id == RPI_ZERO_HAT_PID: return RPI_ZERO_HAT_NAME @property def version(self): ''' Get the Hat firmware version. Returns: (int): firmware version ''' return self.read_register(0x2) # read 16 bits register
[docs] def read_register(self, n): ''' Read the ADC Core (through I2C) registers Grove Base Hat for RPI I2C Registers - 0x00 ~ 0x01: - 0x10 ~ 0x17: ADC raw data - 0x20 ~ 0x27: input voltage - 0x29: output voltage (Grove power supply voltage) - 0x30 ~ 0x37: input voltage / output voltage Args: n(int): register address. Returns: (int) : 16-bit register value. ''' try: self.bus.write_byte(self.address, n) return self.bus.read_word_data(self.address, n) except IOError: print("Check whether I2C enabled and {} or {} inserted".format \ (RPI_HAT_NAME, RPI_ZERO_HAT_NAME)) sys.exit(2) return 0
if __name__ == '__main__': import time adc = ADC() while True: print(adc.read_voltage(0)) time.sleep(1)