SHT31-DIS Library
Dependents: HYBRYD2018_IZU_ROCKET
Diff: SHT3x.cpp
- Revision:
- 2:e87793cb9185
- Child:
- 3:16d45bca7580
diff -r a3e4dd500266 -r e87793cb9185 SHT3x.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SHT3x.cpp Sun Nov 19 13:16:35 2017 +0000 @@ -0,0 +1,125 @@ +#include"mbed.h" +#include"SHT3x.h" + +//Serial pc(USBTX, USBRX); //tx, rx + +mySHT3x::mySHT3x(I2C &i2cBus, AD0 celect){ + i2c = &i2cBus; + if(celect == AD0_HIGH) _addr = SLV_ADDR_HIGH; + else _addr = SLV_ADDR_LOW; + SLV_WRITE = _addr; + SLV_READ = _addr | 1; + i2c->frequency(400000); +} +/********** +ヒーターをセットする +i=0ならば、ヒーターOFF +i=1ならば、ヒーターON +セット直後は5msくらい待ってあげる +**********/ + +void mySHT3x::heater_set(int i) +{ + char cmd[2][2]; + cmd[0][0] = 0x30;cmd[0][1] = 0x66; + cmd[1][0] = 0x30;cmd[1][1] = 0x6D; + + i2c->write(SLV_WRITE, cmd[i], 3); +} +/************** +温度、湿度を取得する +このセンサーは温度、または湿度のデータを個別で送ることはできず +同時に送るので、一応個別に返す関数を作ったが、 +なるべくこっちでまとめて値を取得した方がいいのかも +**************/ +void mySHT3x::get_temp_hum(float *temp, float *hum) +{ + char cmd[2] = {0x24,0x00}; + char buff[6]; + unsigned int val[4]; + + i2c->write(SLV_WRITE, cmd, 2); + wait_ms(30); + i2c->read(SLV_READ, buff, 6); + + val[0] = (unsigned int)buff[0]<<8; + val[1] = (unsigned int)buff[1]; + val[2] = (unsigned int)buff[3]<<8; + val[3] = (unsigned int)buff[4]; + + *temp = (float)(val[0] | val[1]); + *hum = (float)(val[2] | val[3]); + + *temp = *temp*175.0/65535-45.0; + *hum = *hum*100.0/65535; +} +/*********** +温度を取得 +湿度が絶対にいらない場合はこっちで +************/ +float mySHT3x::get_temp() +{ + char cmd[2] = {0x24,0x00}; + char buff[6]; + unsigned int val[2]; + float temp; + + i2c->write(SLV_WRITE, cmd, 2); + wait_ms(30); + i2c->read(SLV_READ, buff, 6); + + val[0] = (unsigned int)buff[0]<<8; + val[1] = (unsigned int)buff[1]; + + temp = (float)(val[0] | val[1]); + temp = temp*175.0/65535-45.0; + + return temp; +} +/*************** +湿度を取得 +温度が絶対にいらない場合はこちらで +*****************/ +float mySHT3x::get_hum() +{ + char cmd[2] = {0x24,0x00}; + char buff[6]; + unsigned int val[2]; + float hum; + + i2c->write(SLV_WRITE, cmd, 2); + wait_ms(30); + i2c->read(SLV_READ, buff, 6); + + val[0] = (unsigned int)buff[3]<<8; + val[1] = (unsigned int)buff[4]; + + hum = (float)(val[0] | val[1]); + hum = hum*100.0/65535; + + return hum; +} +/************* +センサーの現在の状態を取得 +何bit目が何を表しているのかは +データシートを参照 +*************/ +int mySHT3x::get_state() +{ + char cmd[2] = {0xF3, 0x2D}; + char buff[2]; + unsigned int val[2]; + int state; + + i2c->write(SLV_WRITE, cmd, 2); + i2c->read(SLV_READ, buff, 2); + + val[0] = (unsigned int)buff[0]<<8; + val[1] = (unsigned int)buff[1]; + + state = (int)(val[0] | val[1]); + + return state; +} + +