Welcome to the Pycom forum Forum
    • \[\[global:header.categories\]\]
    • \[\[global:header.recent\]\]
    • \[\[global:header.tags\]\]
    • \[\[global:header.popular\]\]
    • Login

    Explore Pybytes | Official Documentation | Report a Firmware Bug/Issue | GitHub

    SI7021 I2C pin setup (SOLVED)

    Scheduled Pinned Locked Moved MicroPython
    micropythonsi7021i2c
    59 Posts 4 Posters 13.2k Views 4 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • robert-hhR Offline
      robert-hh @tttadam
      last edited by robert-hh

      @tttadam Don't care about the baud rate. Here is works well at the default baud rate (I purchased I device for testing). This is the class code which works:

      from time import sleep_ms
      from machine import Pin, I2C
      
      # Default Address
      SI7021_I2C_DEFAULT_ADDR = 0x40
      
      # Commands
      CMD_MEASURE_RELATIVE_HUMIDITY_HOLD_MASTER_MODE = 0xE5
      CMD_MEASURE_RELATIVE_HUMIDITY = 0xF5
      CMD_MEASURE_TEMPERATURE_HOLD_MASTER_MODE = 0xE3
      CMD_MEASURE_TEMPERATURE = 0xF3
      CMD_READ_TEMPERATURE_VALUE_FROM_PREVIOUS_RH_MEASUREMENT = 0xE0
      CMD_RESET = 0xFE
      CMD_WRITE_RH_T_USER_REGISTER_1 = 0xE6
      CMD_READ_RH_T_USER_REGISTER_1 = 0xE7
      CMD_WRITE_HEATER_CONTROL_REGISTER = 0x51
      CMD_READ_HEATER_CONTROL_REGISTER = 0x11
      
      class SI7021(object):
        def __init__(self, i2c=None):
          self.i2c = i2c
          self.addr = SI7021_I2C_DEFAULT_ADDR
          self.cbuffer = bytearray(2)
          self.cbuffer[1] = 0x00
          
        def write_command(self, command_byte):
          self.i2c.writeto(self.addr, command_byte)
      
        def readTemp(self):
          self.write_command(CMD_MEASURE_TEMPERATURE)
          sleep_ms(25)
          temp = self.i2c.readfrom(self.addr,3)
          temp2 = temp[0] << 8
          temp2 = temp2 | temp[1]
          return (175.72 * temp2 / 65536) - 46.85
      
        def readRH(self):
          self.write_command(CMD_MEASURE_RELATIVE_HUMIDITY)
          sleep_ms(25)
          rh = self.i2c.readfrom(self.addr, 3)
          rh2 = rh[0] << 8
          rh2 = rh2 | rh[1]
          return (125 * rh2 / 65536) - 6
      

      It is called with:

      from machine import I2C
      i2c=I2C(0, I2C.MASTER)
      
      from SI7021 import SI7021
      m = SI7021(i2c)
      print(m.readRH(), m.readTemp())
      

      Device connected at P9 = SDA and P10 = SCL, Vin at 3.3V

      T 1 Reply Last reply Reply Quote 1
      • T Offline
        tttadam @robert-hh
        last edited by

        @robert-hh

        Traceback (most recent call last):
          File "main.py", line 6, in <module>
          File "/flash/lib/SI7021.py", line 32, in readTemp
        OSError: I2C bus error
        

        still the same. If it's working on your side, than my sensor must be dead.

        robert-hhR 1 Reply Last reply Reply Quote 0
        • robert-hhR Offline
          robert-hh @tttadam
          last edited by robert-hh

          @tttadam Please check that there is only one copy of SI7021.py installed on your device. When working with pymakr, that may happen. Please use simple tools like ftp for the check. And yes, the version I posted works. No, I do not think that your device is defect. And it is well protected. Ans since it responds well to scan(), the wiring is also fine. So the code or code set-up is most probably the problem.

          T 1 Reply Last reply Reply Quote 1
          • T Offline
            tttadam @robert-hh
            last edited by

            @robert-hh Can I do a factory reset somehow? Delete everything from the device.

            robert-hhR 1 Reply Last reply Reply Quote 0
            • robert-hhR Offline
              robert-hh @tttadam
              last edited by

              @tttadam When you update the firmware, then you have in the advanced section the option to erase the file system. Other method from the REPL prompt:

              import uos
              uos.mkfs("/flash")
              

              And then reboot.

              T 1 Reply Last reply Reply Quote 1
              • T Offline
                tttadam @robert-hh
                last edited by

                @robert-hh Well I formatted the flash, then restarted the device.
                Than uploded SI7021.py, an empyt boot file, and a main.py with 6 line of code. But still no luck...

                Uploading project (main folder)...
                Not safe booting, disabled in settings
                Reading file status
                Failed to read project status, uploading all files
                Creating dir lib
                [1/3] Writing file boot.py
                [2/3] Writing file lib/SI7021.py
                [3/3] Writing file main.py
                Upload done, resetting board...
                OKets Jun  8 2016 00:22:57
                
                rst:0x7 (TG0WDT_SYS_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
                configsip: 0, SPIWP:0xee
                clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
                mode:DIO, clock div:1
                load:0x3fff8028,len:8
                load:0x3fff8030,len:1728
                load:0x4009fa00,len:0
                load:0x4009fa00,len:14584
                entry 0x400a059c
                [64]
                Traceback (most recent call last):
                  File "main.py", line 6, in <module>
                  File "/flash/lib/SI7021.py", line 32, in readTemp
                OSError: I2C bus error
                Pycom MicroPython 1.18.1.r1 [v1.8.6-849-b0520f1] on 2018-08-29; LoPy4 with ESP32
                Type "help()" for more information.
                

                my main.py:

                from machine import I2C
                from SI7021 import SI7021
                i2c=I2C(0, I2C.MASTER)
                print(i2c.scan())
                m = SI7021(i2c)
                print(m.readRH(), m.readTemp())
                

                my boot.py, is just comment

                and my SI7021 is like this:

                from time import sleep_ms
                from machine import Pin, I2C
                
                # Default Address
                SI7021_I2C_DEFAULT_ADDR = 0x40
                
                # Commands
                CMD_MEASURE_RELATIVE_HUMIDITY_HOLD_MASTER_MODE = 0xE5
                CMD_MEASURE_RELATIVE_HUMIDITY = 0xF5
                CMD_MEASURE_TEMPERATURE_HOLD_MASTER_MODE = 0xE3
                CMD_MEASURE_TEMPERATURE = 0xF3
                CMD_READ_TEMPERATURE_VALUE_FROM_PREVIOUS_RH_MEASUREMENT = 0xE0
                CMD_RESET = 0xFE
                CMD_WRITE_RH_T_USER_REGISTER_1 = 0xE6
                CMD_READ_RH_T_USER_REGISTER_1 = 0xE7
                CMD_WRITE_HEATER_CONTROL_REGISTER = 0x51
                CMD_READ_HEATER_CONTROL_REGISTER = 0x11
                
                class SI7021(object):
                  def __init__(self, i2c=None):
                    self.i2c = i2c
                    self.addr = SI7021_I2C_DEFAULT_ADDR
                    self.cbuffer = bytearray(2)
                    self.cbuffer[1] = 0x00
                    
                  def write_command(self, command_byte):
                    self.i2c.writeto(self.addr, command_byte)
                
                  def readTemp(self):
                    self.write_command(CMD_MEASURE_TEMPERATURE)
                    sleep_ms(25)
                    temp = self.i2c.readfrom(self.addr,3)
                    temp2 = temp[0] << 8
                    temp2 = temp2 | temp[1]
                    return (175.72 * temp2 / 65536) - 46.85
                
                  def readRH(self):
                    self.write_command(CMD_MEASURE_RELATIVE_HUMIDITY)
                    sleep_ms(25)
                    rh = self.i2c.readfrom(self.addr, 3)
                    rh2 = rh[0] << 8
                    rh2 = rh2 | rh[1]
                    return (125 * rh2 / 65536) - 6
                
                robert-hhR 1 Reply Last reply Reply Quote 0
                • robert-hhR Offline
                  robert-hh @tttadam
                  last edited by

                  @tttadam It is interesting that readRH() seemed to have worked, since the code fails at readTemp(). Try two things:
                  a) use only readRH
                  b) increase the sleep_ms(25) to sleep_ms(50).

                  T 1 Reply Last reply Reply Quote 1
                  • T Offline
                    tttadam @robert-hh
                    last edited by

                    @robert-hh

                    YAAAAAY!!! :D
                    Increasing the sleep_ms to 50 solved it!

                    [64]
                    42.83194 26.78852
                    
                    robert-hhR 2 Replies Last reply Reply Quote 0
                    • robert-hhR Offline
                      robert-hh @tttadam
                      last edited by

                      @tttadam That's very good. When trying to read before the conversion is done you get an I2C bus error. The strange thing is, that according to the data sheet 25ms is already a safe value. The maximum conversion time according to the data sheet is 12 ms for RH at 12 bit resolution.
                      I found no robust way to scan the device for a "conversion ready" state.

                      1 Reply Last reply Reply Quote 0
                      • robert-hhR Offline
                        robert-hh @tttadam
                        last edited by

                        @tttadam I extended the class SI7021 a little bit. It also waits now for max 100ms time for the device to return a value, but returns earlier if values are returned. A documentation is added too.
                        https://github.com/robert-hh/SI7021

                        T 1 Reply Last reply Reply Quote 1
                        • T Offline
                          tttadam @robert-hh
                          last edited by

                          @robert-hh Awsome! Thank you

                          1 Reply Last reply Reply Quote 0

                          Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                          Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                          With your input, this post could be even better 💗

                          Register Login
                          • 1
                          • 2
                          • 3
                          • 3 / 3
                          • First post
                            Last post

                          Pycom on Twitter

                          Pycom