3.4 haas506开发教程-example-ads1115

Posted 智云服

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3.4 haas506开发教程-example-ads1115相关的知识,希望对你有一定的参考价值。

haas506开发教程-example-ads1115

1.ads1115

  • 案例说明
    使用ads1115模块获取电压值
  • main.py
# coding=utf-8
import utime as time
import usys
usys.path.append('/data/pyamp')
import  ADS1x15
adc = ADS1x15.ADS1115()
GAIN = 2/3
print('Reading ADS1x15 values, press Ctrl-C to quit...')
while True:
    values = [0]*4
    for i in range(4):
        values[i] = adc.read_adc(i, gain=GAIN)
        values[i]=values[i]*0.1875/1000
    print('-'*45)
    print('| 0:>7 | 1:>7 | 2:>7 | 3:>7 |'.format('IN0','IN1','IN2','IN3'))
    print('| 0:>6 | 1:>6 | 2:>6 | 3:>6 |'.format(*values))
    print('-'*45)
    time.sleep(2)
  • ADS1x15.py
# coding=utf-8
import utime as time
'''
# Choose a gain of 1 for reading voltages from 0 to 4.09V.
# Or pick a different gain to change the range of voltages that are read:
#  - 2/3 = +/-6.144V
#  -   1 = +/-4.096V
#  -   2 = +/-2.048V
#  -   4 = +/-1.024V
#  -   8 = +/-0.512V
#  -  16 = +/-0.256V
'''

# Register and other configuration values:
ADS1x15_DEFAULT_ADDRESS        = 0x48
ADS1x15_POINTER_CONVERSION     = 0x00
ADS1x15_POINTER_CONFIG         = 0x01
ADS1x15_POINTER_LOW_THRESHOLD  = 0x02
ADS1x15_POINTER_HIGH_THRESHOLD = 0x03
ADS1x15_CONFIG_OS_SINGLE       = 0x8000
ADS1x15_CONFIG_MUX_OFFSET      = 12
# Maping of gain values to config register values.
ADS1x15_CONFIG_GAIN = 
    2/3: 0x0000,
    1:   0x0200,
    2:   0x0400,
    4:   0x0600,
    8:   0x0800,
    16:  0x0A00

ADS1x15_CONFIG_MODE_CONTINUOUS  = 0x0000
ADS1x15_CONFIG_MODE_SINGLE      = 0x0100
# Mapping of data/sample rate to config register values for ADS1015 (faster).
ADS1015_CONFIG_DR = 
    128:   0x0000,
    250:   0x0020,
    490:   0x0040,
    920:   0x0060,
    1600:  0x0080,
    2400:  0x00A0,
    3300:  0x00C0

# Mapping of data/sample rate to config register values for ADS1115 (slower).
ADS1115_CONFIG_DR = 
    8:    0x0000,
    16:   0x0020,
    32:   0x0040,
    64:   0x0060,
    128:  0x0080,
    250:  0x00A0,
    475:  0x00C0,
    860:  0x00E0

ADS1x15_CONFIG_COMP_WINDOW      = 0x0010
ADS1x15_CONFIG_COMP_ACTIVE_HIGH = 0x0008
ADS1x15_CONFIG_COMP_LATCHING    = 0x0004
ADS1x15_CONFIG_COMP_QUE = 
    1: 0x0000,
    2: 0x0001,
    4: 0x0002

ADS1x15_CONFIG_COMP_QUE_DISABLE = 0x0003

class ADS1x15(object):
    def __init__(self,**Kwargs):
        #导入I2c
        from driver import I2C
        #实例化
        self._i2c=I2C()
        #打开I2c
        self._i2c.open("ADS1115")


    def _data_rate_default(self):
        #子类需要实现 父类的方法,否则报错
        raise NotImplementedError("subclass must implemet _data_rate_default!")

    def _data_rate_config(self,data_rate):
        #子类需要实现 父类的方法,否则报错
        raise NotImplementedError("subclass must implemet _data_rate_default!")

    def _conversion_value(self, low, high):
        #子类需要实现 父类的方法,否则报错
        raise NotImplementedError('Subclass must implement _conversion_value function!')

    #mux, gain, data_rate, and mode 要在规定的范围内
    def _read(self, mux, gain, data_rate, mode):
        # Go out of power-down mode for conversion.
        config = ADS1x15_CONFIG_OS_SINGLE

        # Specify mux value.
        config |= (mux & 0x07) << ADS1x15_CONFIG_MUX_OFFSET

        #设置增益
        if gain not in ADS1x15_CONFIG_GAIN:
            raise ValueError('Gain must be one of: 2/3, 1, 2, 4, 8, 16')
        config |= ADS1x15_CONFIG_GAIN[gain]

        #设置模式(continuous or single shot)
        config |= mode

        #得到速率,默认128bps
        if data_rate is None:
            data_rate = self._data_rate_default()

        #设置速率
        config |= self._data_rate_config(data_rate)
        #disable 比较器模式
        config |= ADS1x15_CONFIG_COMP_QUE_DISABLE

        #I2C的写函数
        writeData=bytearray(3)
        writeData[0]=ADS1x15_POINTER_CONFIG
        writeData[1]=(config >> 8) & 0xFF
        writeData[2]=config & 0xFF
        self._i2c.write(writeData,3)

        #等待ADC采样(根据采样率加上一个很小的偏置,如0.1ms)
        time.sleep(1.0/data_rate+0.0001)

        #I2C的读函数
        readData=bytearray([ADS1x15_POINTER_CONVERSION,0x00])
        self._i2c.read(readData,2)

        #return 读取到的数据,包含高八位和低八位
        return self._conversion_value(readData[1],readData[0])

    def read_adc(self, channel, gain=1, data_rate=None):
        #读单个ADC通道,通道值取值范围为[0,3]
        assert 0 <= channel <= 3, 'Channel must be a value within 0-3!'
        # Perform a single shot read and set the mux value to the channel plus
        # the highest bit (bit 3) set.
        return self._read(channel + 0x04, gain, data_rate, ADS1x15_CONFIG_MODE_SINGLE)

#继承父类
class ADS1115(ADS1x15):
    """ADS1115 16-bit analog to digital converter instance."""
    def __init__(self, *args, **kwargs):
        super(ADS1115, self).__init__(*args, **kwargs)
    def _data_rate_default(self):
        #默认速率为128bps
        return 128
    def _data_rate_config(self, data_rate):
        if data_rate not in ADS1115_CONFIG_DR:
            raise ValueError('Data rate must be one of: 8, 16, 32, 64, 128, 250, 475, 860')
        return ADS1115_CONFIG_DR[data_rate]
    def _conversion_value(self, low, high):
        #转换16位数据
        value = ((high & 0xFF) << 8) | (low & 0xFF)
        if value & 0x8000 != 0:
            value -= 1 << 16
        return value
  • board.json

"name": "haas506",
"version": "1.0.0",
"io": 
    "ADS1115": 
        "type": "I2C",
        "port": 1,
        "addrWidth": 7,
        "freq": 400000,
        "mode": "master",
        "devAddr": 72
    ,
    "serial1":
        "type":"UART",
        "port":0,
        "dataWidth":8,
        "baudRate":115200,
        "stopBits":1,
        "flowControl":"disable",
        "parity":"none"
    ,
    "serial2":
        "type":"UART",
     "port":1,
        "dataWidth":8,
        "baudRate":115200,
        "stopBits":1,
        "flowControl":"disable",
        "parity":"none"
    ,
    "serial3":
        "type":"UART",
        "port":2,
        "dataWidth":8,
        "baudRate":115200,
        "stopBits":1,
        "flowControl":"disable",
        "parity":"none"
    
,
"debugLevel": "ERROR",
"repl":"disable"

2.实现步骤

(1)将asd1115模块的VDD、GND、SDA、SCL接入到haas506的I2C接口上,A0、A1、A2、A3接入3.3V以下电源

(2)复制代码到您的文件中
(3)确认端口号

(4)烧录
(5)查看日志
A0、A1接入GND,A2、A3接入3v3

都不接电源的情况下,输出默认值

3.总结

 本节介绍了如何使用ADS1115模块来获取电压值。需要注意的有2点:

  1. 当前gain是2/3,可以测6.144V以内的电压值,可以根据需要更改gain的值
  2. ads1115模块的所测量的电压值不能超过所接入到ads1115的VDD引脚的电压值

以上是关于3.4 haas506开发教程-example-ads1115的主要内容,如果未能解决你的问题,请参考以下文章

HaaS506硬件规格

物联网轻松上云实践 之 HaaS样板间

HaaS轻应用(JavaScript)快速开始 @HaaS100

内置HaaS轻应用的HaaS610 Kit 4G开发板即将上线

HaaS学习笔记 | 阿里云物联网平台的产品和设备创建明细教程

HaaS100开发调试系列 之 定位AliOS Things内存及Crash问题