SHT35を使うためのライブラリ

Dependents:   Hybrid_IZU2019

SHT35.cpp

Committer:
Sigma884
Date:
2019-01-12
Revision:
0:98c15c12b1cb

File content as of revision 0:98c15c12b1cb:

#include"mbed.h"
#include"SHT35.h"

mySHT35::mySHT35(I2C &i2cBus, AD0 celect){
    i2c = &i2cBus;
    if(celect == AD0_HIGH){
        _addr = SLV_ADDR_HIGH;
    }
    else{
        _addr = SLV_ADDR_LOW;
    }
    SLV_WRITE_SHT = _addr;
    SLV_READ_SHT  = _addr | 1;    
    i2c -> frequency(400000);
}
/**********
ヒーターをセットする
i=0ならば、ヒーターOFF
i=1ならば、ヒーターON
セット直後は5msくらい待ってあげる
**********/

void mySHT35::heaterSet(int i)
{
    cmd[0] = 0x30;
    switch(i){
      case 0:
      cmd[1] = 0x66;
      break;
      
      case 1:
      cmd[1] = 0x6D;
      break;
      
      default:
      cmd[1] = 0x66;
    }
    
    i2c -> write(SLV_WRITE_SHT, cmd, 2);
}
/**************
温度、湿度を取得する
このセンサーは温度、または湿度のデータを個別で送ることはできず
同時に送るので、一応個別に返す関数を作ったが、
なるべくこっちでまとめて値を取得した方がいいのかも
**************/
void mySHT35::getTempHum(float *temp, float *hum)
{
    cmd[0] = 0x24;
    cmd[1] = 0x00;
    
    i2c -> write(SLV_WRITE_SHT, cmd, 2);
    wait_ms(30);
    i2c -> read(SLV_READ_SHT, 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_p = (float)(val[0] | val[1]);
    hum_p  = (float)(val[2] | val[3]);
    
    temp_p = temp_p * 175.0 / 65535 - 45.0;
    hum_p  = hum_p * 100.0 / 65535;
    
    if(temp_p > -273 && temp_p < 1000){
        *temp = temp_p;
    }
    if(hum_p > 0 && hum_p < 100){
        *hum = hum_p;
    }
}
/***********
温度を取得
湿度が絶対にいらない場合はこっちで
************/    
float mySHT35::getTemp()
{
    cmd[0] = 0x24;
    cmd[1] = 0x00;
    
    i2c -> write(SLV_WRITE_SHT, cmd, 2);
    wait_ms(30);
    i2c -> read(SLV_READ_SHT, buff, 6);

    val[0] = (unsigned int)buff[0] << 8;
    val[1] = (unsigned int)buff[1];
    
    temp_p = (float)(val[0] | val[1]);
    temp_p = temp_p * 175.0 / 65535 - 45.0;

    return temp_p;
}
/***************
湿度を取得
温度が絶対にいらない場合はこちらで
*****************/
float mySHT35::getHum()
{
    cmd[0] = 0x24;
    cmd[1] = 0x00;
    
    i2c -> write(SLV_WRITE_SHT, cmd, 2);
    wait_ms(30);
    i2c -> read(SLV_READ_SHT, buff, 6);

    val[0] = (unsigned int)buff[3] << 8;
    val[1] = (unsigned int)buff[4];
    
    hum_p = (float)(val[0] | val[1]);
    hum_p = hum_p * 100.0 / 65535;

    return hum_p;
}
/*************
センサーの現在の状態を取得
何bit目が何を表しているのかは
データシートを参照
*************/
int mySHT35::getState()
{
    cmd[0] = 0xF3;
    cmd[1] = 0x2D;
    
    i2c -> write(SLV_WRITE_SHT, cmd, 2);
    i2c -> read(SLV_READ_SHT, buff, 2);
    
    val[0] = (unsigned int)buff[0] << 8;
    val[1] = (unsigned int)buff[1];
    
    state_p = (int)(val[0] | val[1]);
    if(state_p & 0b1000000000010000){
        return 1;
    }
    else{
        return state_p;
        //return 0;
    }
}

/****************
連続計測モード開始
引数で繰り返し精度を決める
 1 : 低
 2 : 中
 3 : 高
****************/
void mySHT35::startContinueMeasure(int accuracy){
    cmd[0] = 0x27;
    
    switch(accuracy){
        case 1:
        cmd[1] = 0x2A;  //繰り返し精度:低
        break;
        
        case 2:
        cmd[1] = 0x21;  //繰り返し精度:中
        break;
        
        case 3:
        cmd[1] = 0x37;  //繰り返し精度:高
        break;
        
        default:
        cmd[1] = 0x2A;  //繰り返し精度:低
    }
    
    i2c -> write(SLV_WRITE_SHT, cmd, 2);
}

/*****************
連続計測モードデータ取得
*****************/
void mySHT35::getContinueTempHum(float *temp, float *hum){
    cmd[0] = 0xE0;
    cmd[1] = 0x00;
    
    i2c -> write(SLV_WRITE_SHT, cmd, 2);
    i2c -> read(SLV_READ_SHT, 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_p = (float)(val[0] | val[1]);
    hum_p  = (float)(val[2] | val[3]);
    
    temp_p = temp_p * 175.0 / 65535 - 45.0;
    hum_p  = hum_p * 100.0 / 65535;
    
    if(temp_p > -273 && temp_p < 1000){
        *temp = temp_p;
    }
    if(hum_p > 0 && hum_p < 100){
        *hum = hum_p;
    }
        
}

/****************
連続計測モード停止
****************/
void mySHT35::stopContinueMeasure(){
    cmd[0] = 0x30;
    cmd[1] = 0x93;
    
    i2c -> write(SLV_WRITE_SHT, cmd, 2);
}