- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
温度・湿度センサは多数ありますが、今回トライした IDT の HS3001 モジュールは
SDAH01 というセンサ評価キットに含まれているモジュールで、
私がこれまで試したモジュールの中では断トツに小さいものでした。
※センサ自体ではもっと小さなものもありそうですが。
今回の開発で、“ハマった”のは、Measurement_Request を発行してから
実際のデータを取りに行くまでに、少しディレイを挿入してやらないと
温度 125℃、湿度 100% という、住みにくそうな数字が返って来たことでした。
ハーフピッチのピンは通常のジャンパ線すら接続不能なので、
知人で変換基板を作ってもらい TSoC 基板に接続できるようにしました。
2.2KΩのプルアップ抵抗も変換基板に実装してもらったので
TSoC に直結できる形になりました。
回路図
Tera Term log
Serial Plot
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
- Labels:
-
PSoC 345 LP