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

Dependents:   Hybrid_IZU2019

Revision:
0:98c15c12b1cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SHT35.cpp	Sat Jan 12 16:56:56 2019 +0000
@@ -0,0 +1,210 @@
+#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);
+}