cancel
Showing results for 
Search instead for 
Did you mean: 

Code Examples

MotooTanaka
Esteemed Contributor

温度・湿度センサは多数ありますが、今回トライした 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) << 😎 | 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) << 😎 | data[1]) / 16383.0 ;

    return( result ) ;

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

moto

0 Replies