Walter
Walter

Reputation: 1

Python: Can I read two bytes in one transaction with the smbus module?

I'm trying to read the temperature and humidity using a Texas Instruments HDC1008 from Adafruit, product 2635. I'm on a rasberry pi 2, using the smbus module. According to TI's PDF, when getting a reading, the number will be sent in two bytes that you put together. I found this code that does what I'm trying to do with micropython, where they have a recv function that seems to simply sends them back a list with two bytes. The SMBus module doesn't seem to have any equivalent for what I'm trying to do. Here's some of my code.

class HDC1008:

    I2C_BUS = 1

    #Registers
    REG_TEMP =   0
    REG_HUMID =  1
    REG_CONFIG = 2

    #Configuration bits
    CFG_RST = 1<<15
    CFG_MODE_SINGLE = 0 << 12
    CFG_MODE_BOTH = 1 << 12

    ADDRESS = 0x40

    def __init__(self, bus_num=I2C_BUS):
        self.bus=smbus.SMBus(bus_num)

    def readTemperature(self):
        #configure the HDC1008 for one reading
        config = 0
        config |= self.CFG_MODE_SINGLE
        self.bus.write_byte_data(self.ADDRESS, self.REG_CONFIG, config)

        #tell the thing to take a reading
        self.bus.write_byte(self.ADDRESS, self.REG_TEMP)
        time.sleep(0.015)

        #get the reading back from the thing
        raw = self.bus.read_byte(self.ADDRESS)
        raw = (raw<<8) + self.bus.read_byte(self.ADDRESS)

        #use TI's formula to turn it into people numbers
        temperature = (raw/65536.0)*165.0 - 40

        #convert temp to f
        temperature = temperature * (9.0/5.0) + 32
        return temperature

When I'm getting the value for raw from bus.read_byte, I'm able to get the first half of the temperature bits, but the second reading is just zeros, presumably because the first transaction is over. How do I get two bytes in one transaction?

Upvotes: 0

Views: 3719

Answers (1)

Romke
Romke

Reputation: 11

tnx a lot for sharing this code. I'm happy to get it working in Python.

I do not exactly understand the problem, I can read the Temperature and Humidity with our code (the only Python code I could find and works)

I did change it a little bit (make it a Class):

import smbus

class HDC: 
 #Registers
  REG_TEMP =   0
  REG_HUMID =  1
  REG_CONFIG = 2

  I2C_BUS = 2 #2 for PCDuino, 1 for PI

  #Configuration bits
  CFG_RST = 1<<15
  CFG_MODE_SINGLE = 0 << 12
  CFG_MODE_BOTH = 1 << 12

  ADDRESS = 0x40

  def __init__(self, bus_num=I2C_BUS):
     self.bus=smbus.SMBus(bus_num)

  def readTemperature(self):
    #configure the HDC1008 for one reading
    config = 0
    config |= self.CFG_MODE_SINGLE
    self.bus.write_byte_data(self.ADDRESS, self.REG_CONFIG, config)

    #tell the thing to take a reading
    self.bus.write_byte(self.ADDRESS, self.REG_TEMP)
    time.sleep(0.015)

    #get the reading back from the thing
    raw = self.bus.read_byte(self.ADDRESS)
    raw = (raw<<8) + self.bus.read_byte(self.ADDRESS)

    #use TI's formula to turn it into people numbers
    temperature = (raw/65536.0)* 165  - 40


    #convert temp to farenheid
    #temperature = temperature * (9.0/5.0) + 32
    return temperature

 def readHum(self):
    #configure the HDC1008 for one reading
    config = 0
    config |= self.CFG_MODE_SINGLE
    self.bus.write_byte_data(self.ADDRESS, self.REG_CONFIG, config)

    #tell the thing to take a reading
    self.bus.write_byte(self.ADDRESS, self.REG_HUMID)
    time.sleep(0.015)

    #get the reading back from the thing
    raw = self.bus.read_byte(self.ADDRESS)
    raw = (raw<<8) + self.bus.read_byte(self.ADDRESS)

    hum=(raw/(2.0**16))*100
    return hum

In the program:

from hdc1008 import HDC

HDC1008=HDC()

print HDC1008.readTemperature()
print HDC1008.readHum()

Upvotes: 1

Related Questions