0 Replies Latest reply on May 17, 2019 1:56 AM by MoTa_728816

    TSoC I2C Humidity and Temperature Sensor IDT HS3001 Sample

    MoTa_728816

      温度・湿度センサは多数ありますが、今回トライした IDT の HS3001 モジュールは

      SDAH01 というセンサ評価キットに含まれているモジュールで、

      私がこれまで試したモジュールの中では断トツに小さいものでした。

      ※センサ自体ではもっと小さなものもありそうですが。

       

      今回の開発で、“ハマった”のは、Measurement_Request を発行してから

      実際のデータを取りに行くまでに、少しディレイを挿入してやらないと

      温度 125℃、湿度 100% という、住みにくそうな数字が返って来たことでした。

      IMG_3602.JPG

      ハーフピッチのピンは通常のジャンパ線すら接続不能なので、

      知人で変換基板を作ってもらい TSoC 基板に接続できるようにしました。

       

      2.2KΩのプルアップ抵抗も変換基板に実装してもらったので

      TSoC に直結できる形になりました。

      IMG_3600.JPG

      回路図

      schematic.JPG

      Tera Term log

      HS3001_TeraTerm_log.JPG

       

      Serial Plot

      HS3001_SerialPlot.JPG

       

      main.c

      ======================

      #include "project.h"

      #include "stdio.h"

      #include "i2c_utils.h"

      #include "hs3001.h"

       

      char str[128] ; /* print buffer */

       

      void print(char *str)

      {

          UART_UartPutString(str) ;

      }

       

      void splash(void)

      {

          sprintf(str, "TSoC HS3001(I2C) Test (%s %s)\n", __DATE__, __TIME__) ;

          print(str) ;

      }

       

      void init_hardware(void)

      {

          CyGlobalIntEnable; /* Enable global interrupts. */

       

          UART_Start() ;

          I2C_Start() ;

      }

       

      int main(void)

      {

          float humidity ;

          float temperature ;

          int status ;

          uint8_t data[4] ;

         

          init_hardware() ;

         

          splash() ;

         

          print("Temp(C),  Humidity(%)\n") ;

          for(;;)

          {

              HS3001_Measurement_Request() ;

              CyDelay(500) ;

              HS3001_Data_Fetch(data) ;

       

       

              status = (data[0] >> 6) & 0x03 ;

              if (status == 0) { /* valid data */

                  humidity = 100.0 * (float)(((data[0] & 0x3F) << 8) | data[1])/16383.0 ;

                  temperature = 165.0 * (float)((data[2] << 6) | (data[3] >> 2)) / 16383.0 - 40.0 ;

             

                  sprintf(str, " %3d.%02d,  %3d.%02d\n",

                      (int)(temperature + 0.005), (int)(100 * temperature + 0.5) % 100,

                      (int)(humidity + 0.005), (int)(100 * humidity + 0.5) % 100) ;

                  print(str) ;

              }

              CyDelay(1000) ;

          }

      }

      ======================

       

      hs3001.c

      ======================

      #include "project.h"

      #include "i2c_utils.h"

      #include "hs3001.h"

       

      #define HS3001_I2C_ADDRESS 0x44

      uint8_t HS3001_i2c_address = HS3001_I2C_ADDRESS ;

       

      int HS3001_Measurement_Request(void)

      {

          int result = 0 ;

          i2c_set_slave_address(HS3001_i2c_address) ;   

          i2c_SendStart(0) ; /* 0 for write */

          i2c_SendStop() ;

          return( result ) ;

      }

       

      int HS3001_Data_Fetch(uint8_t data[])

      {

          int result = 0 ;

          i2c_set_slave_address(HS3001_i2c_address) ;  

          i2c_SendStart(1) ; /* 1 for read */

          data[0] = i2c_readByte(I2C_I2C_ACK_DATA) ;

          data[1] = i2c_readByte(I2C_I2C_ACK_DATA) ;

          data[2] = i2c_readByte(I2C_I2C_ACK_DATA) ;

          data[3] = i2c_readByte(I2C_I2C_NAK_DATA) ;

          i2c_SendStop() ;

          return( result ) ;

      }

       

      int HS3001_Hume_Fetch(float *hume)

      {

          int result = 0 ;

          uint8_t data[2] ;

          i2c_set_slave_address(HS3001_i2c_address) ;  

          i2c_SendStart(1) ; /* 1 for read */

          data[0] = i2c_readByte(I2C_I2C_ACK_DATA) ;

          data[1] = i2c_readByte(I2C_I2C_NAK_DATA) ;

          i2c_SendStop() ;

          *hume  = 100.0 * (((data[0] & 0x3F) << 8) | data[1]) / 16383.0 ;

          return( result ) ;

      ======================

       

      moto