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

Dependents:   Hybrid_IZU2019

Committer:
Sigma884
Date:
Sat Jan 12 16:56:56 2019 +0000
Revision:
0:98c15c12b1cb
A continuous acquisition mode of data was mounted.; The connection confirmation command was mounted.; and other updated.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sigma884 0:98c15c12b1cb 1 #include"mbed.h"
Sigma884 0:98c15c12b1cb 2 #include"SHT35.h"
Sigma884 0:98c15c12b1cb 3
Sigma884 0:98c15c12b1cb 4 mySHT35::mySHT35(I2C &i2cBus, AD0 celect){
Sigma884 0:98c15c12b1cb 5 i2c = &i2cBus;
Sigma884 0:98c15c12b1cb 6 if(celect == AD0_HIGH){
Sigma884 0:98c15c12b1cb 7 _addr = SLV_ADDR_HIGH;
Sigma884 0:98c15c12b1cb 8 }
Sigma884 0:98c15c12b1cb 9 else{
Sigma884 0:98c15c12b1cb 10 _addr = SLV_ADDR_LOW;
Sigma884 0:98c15c12b1cb 11 }
Sigma884 0:98c15c12b1cb 12 SLV_WRITE_SHT = _addr;
Sigma884 0:98c15c12b1cb 13 SLV_READ_SHT = _addr | 1;
Sigma884 0:98c15c12b1cb 14 i2c -> frequency(400000);
Sigma884 0:98c15c12b1cb 15 }
Sigma884 0:98c15c12b1cb 16 /**********
Sigma884 0:98c15c12b1cb 17 ヒーターをセットする
Sigma884 0:98c15c12b1cb 18 i=0ならば、ヒーターOFF
Sigma884 0:98c15c12b1cb 19 i=1ならば、ヒーターON
Sigma884 0:98c15c12b1cb 20 セット直後は5msくらい待ってあげる
Sigma884 0:98c15c12b1cb 21 **********/
Sigma884 0:98c15c12b1cb 22
Sigma884 0:98c15c12b1cb 23 void mySHT35::heaterSet(int i)
Sigma884 0:98c15c12b1cb 24 {
Sigma884 0:98c15c12b1cb 25 cmd[0] = 0x30;
Sigma884 0:98c15c12b1cb 26 switch(i){
Sigma884 0:98c15c12b1cb 27 case 0:
Sigma884 0:98c15c12b1cb 28 cmd[1] = 0x66;
Sigma884 0:98c15c12b1cb 29 break;
Sigma884 0:98c15c12b1cb 30
Sigma884 0:98c15c12b1cb 31 case 1:
Sigma884 0:98c15c12b1cb 32 cmd[1] = 0x6D;
Sigma884 0:98c15c12b1cb 33 break;
Sigma884 0:98c15c12b1cb 34
Sigma884 0:98c15c12b1cb 35 default:
Sigma884 0:98c15c12b1cb 36 cmd[1] = 0x66;
Sigma884 0:98c15c12b1cb 37 }
Sigma884 0:98c15c12b1cb 38
Sigma884 0:98c15c12b1cb 39 i2c -> write(SLV_WRITE_SHT, cmd, 2);
Sigma884 0:98c15c12b1cb 40 }
Sigma884 0:98c15c12b1cb 41 /**************
Sigma884 0:98c15c12b1cb 42 温度、湿度を取得する
Sigma884 0:98c15c12b1cb 43 このセンサーは温度、または湿度のデータを個別で送ることはできず
Sigma884 0:98c15c12b1cb 44 同時に送るので、一応個別に返す関数を作ったが、
Sigma884 0:98c15c12b1cb 45 なるべくこっちでまとめて値を取得した方がいいのかも
Sigma884 0:98c15c12b1cb 46 **************/
Sigma884 0:98c15c12b1cb 47 void mySHT35::getTempHum(float *temp, float *hum)
Sigma884 0:98c15c12b1cb 48 {
Sigma884 0:98c15c12b1cb 49 cmd[0] = 0x24;
Sigma884 0:98c15c12b1cb 50 cmd[1] = 0x00;
Sigma884 0:98c15c12b1cb 51
Sigma884 0:98c15c12b1cb 52 i2c -> write(SLV_WRITE_SHT, cmd, 2);
Sigma884 0:98c15c12b1cb 53 wait_ms(30);
Sigma884 0:98c15c12b1cb 54 i2c -> read(SLV_READ_SHT, buff, 6);
Sigma884 0:98c15c12b1cb 55
Sigma884 0:98c15c12b1cb 56 val[0] = (unsigned int)buff[0] << 8;
Sigma884 0:98c15c12b1cb 57 val[1] = (unsigned int)buff[1];
Sigma884 0:98c15c12b1cb 58 val[2] = (unsigned int)buff[3] << 8;
Sigma884 0:98c15c12b1cb 59 val[3] = (unsigned int)buff[4];
Sigma884 0:98c15c12b1cb 60
Sigma884 0:98c15c12b1cb 61 temp_p = (float)(val[0] | val[1]);
Sigma884 0:98c15c12b1cb 62 hum_p = (float)(val[2] | val[3]);
Sigma884 0:98c15c12b1cb 63
Sigma884 0:98c15c12b1cb 64 temp_p = temp_p * 175.0 / 65535 - 45.0;
Sigma884 0:98c15c12b1cb 65 hum_p = hum_p * 100.0 / 65535;
Sigma884 0:98c15c12b1cb 66
Sigma884 0:98c15c12b1cb 67 if(temp_p > -273 && temp_p < 1000){
Sigma884 0:98c15c12b1cb 68 *temp = temp_p;
Sigma884 0:98c15c12b1cb 69 }
Sigma884 0:98c15c12b1cb 70 if(hum_p > 0 && hum_p < 100){
Sigma884 0:98c15c12b1cb 71 *hum = hum_p;
Sigma884 0:98c15c12b1cb 72 }
Sigma884 0:98c15c12b1cb 73 }
Sigma884 0:98c15c12b1cb 74 /***********
Sigma884 0:98c15c12b1cb 75 温度を取得
Sigma884 0:98c15c12b1cb 76 湿度が絶対にいらない場合はこっちで
Sigma884 0:98c15c12b1cb 77 ************/
Sigma884 0:98c15c12b1cb 78 float mySHT35::getTemp()
Sigma884 0:98c15c12b1cb 79 {
Sigma884 0:98c15c12b1cb 80 cmd[0] = 0x24;
Sigma884 0:98c15c12b1cb 81 cmd[1] = 0x00;
Sigma884 0:98c15c12b1cb 82
Sigma884 0:98c15c12b1cb 83 i2c -> write(SLV_WRITE_SHT, cmd, 2);
Sigma884 0:98c15c12b1cb 84 wait_ms(30);
Sigma884 0:98c15c12b1cb 85 i2c -> read(SLV_READ_SHT, buff, 6);
Sigma884 0:98c15c12b1cb 86
Sigma884 0:98c15c12b1cb 87 val[0] = (unsigned int)buff[0] << 8;
Sigma884 0:98c15c12b1cb 88 val[1] = (unsigned int)buff[1];
Sigma884 0:98c15c12b1cb 89
Sigma884 0:98c15c12b1cb 90 temp_p = (float)(val[0] | val[1]);
Sigma884 0:98c15c12b1cb 91 temp_p = temp_p * 175.0 / 65535 - 45.0;
Sigma884 0:98c15c12b1cb 92
Sigma884 0:98c15c12b1cb 93 return temp_p;
Sigma884 0:98c15c12b1cb 94 }
Sigma884 0:98c15c12b1cb 95 /***************
Sigma884 0:98c15c12b1cb 96 湿度を取得
Sigma884 0:98c15c12b1cb 97 温度が絶対にいらない場合はこちらで
Sigma884 0:98c15c12b1cb 98 *****************/
Sigma884 0:98c15c12b1cb 99 float mySHT35::getHum()
Sigma884 0:98c15c12b1cb 100 {
Sigma884 0:98c15c12b1cb 101 cmd[0] = 0x24;
Sigma884 0:98c15c12b1cb 102 cmd[1] = 0x00;
Sigma884 0:98c15c12b1cb 103
Sigma884 0:98c15c12b1cb 104 i2c -> write(SLV_WRITE_SHT, cmd, 2);
Sigma884 0:98c15c12b1cb 105 wait_ms(30);
Sigma884 0:98c15c12b1cb 106 i2c -> read(SLV_READ_SHT, buff, 6);
Sigma884 0:98c15c12b1cb 107
Sigma884 0:98c15c12b1cb 108 val[0] = (unsigned int)buff[3] << 8;
Sigma884 0:98c15c12b1cb 109 val[1] = (unsigned int)buff[4];
Sigma884 0:98c15c12b1cb 110
Sigma884 0:98c15c12b1cb 111 hum_p = (float)(val[0] | val[1]);
Sigma884 0:98c15c12b1cb 112 hum_p = hum_p * 100.0 / 65535;
Sigma884 0:98c15c12b1cb 113
Sigma884 0:98c15c12b1cb 114 return hum_p;
Sigma884 0:98c15c12b1cb 115 }
Sigma884 0:98c15c12b1cb 116 /*************
Sigma884 0:98c15c12b1cb 117 センサーの現在の状態を取得
Sigma884 0:98c15c12b1cb 118 何bit目が何を表しているのかは
Sigma884 0:98c15c12b1cb 119 データシートを参照
Sigma884 0:98c15c12b1cb 120 *************/
Sigma884 0:98c15c12b1cb 121 int mySHT35::getState()
Sigma884 0:98c15c12b1cb 122 {
Sigma884 0:98c15c12b1cb 123 cmd[0] = 0xF3;
Sigma884 0:98c15c12b1cb 124 cmd[1] = 0x2D;
Sigma884 0:98c15c12b1cb 125
Sigma884 0:98c15c12b1cb 126 i2c -> write(SLV_WRITE_SHT, cmd, 2);
Sigma884 0:98c15c12b1cb 127 i2c -> read(SLV_READ_SHT, buff, 2);
Sigma884 0:98c15c12b1cb 128
Sigma884 0:98c15c12b1cb 129 val[0] = (unsigned int)buff[0] << 8;
Sigma884 0:98c15c12b1cb 130 val[1] = (unsigned int)buff[1];
Sigma884 0:98c15c12b1cb 131
Sigma884 0:98c15c12b1cb 132 state_p = (int)(val[0] | val[1]);
Sigma884 0:98c15c12b1cb 133 if(state_p & 0b1000000000010000){
Sigma884 0:98c15c12b1cb 134 return 1;
Sigma884 0:98c15c12b1cb 135 }
Sigma884 0:98c15c12b1cb 136 else{
Sigma884 0:98c15c12b1cb 137 return state_p;
Sigma884 0:98c15c12b1cb 138 //return 0;
Sigma884 0:98c15c12b1cb 139 }
Sigma884 0:98c15c12b1cb 140 }
Sigma884 0:98c15c12b1cb 141
Sigma884 0:98c15c12b1cb 142 /****************
Sigma884 0:98c15c12b1cb 143 連続計測モード開始
Sigma884 0:98c15c12b1cb 144 引数で繰り返し精度を決める
Sigma884 0:98c15c12b1cb 145 1 : 低
Sigma884 0:98c15c12b1cb 146 2 : 中
Sigma884 0:98c15c12b1cb 147 3 : 高
Sigma884 0:98c15c12b1cb 148 ****************/
Sigma884 0:98c15c12b1cb 149 void mySHT35::startContinueMeasure(int accuracy){
Sigma884 0:98c15c12b1cb 150 cmd[0] = 0x27;
Sigma884 0:98c15c12b1cb 151
Sigma884 0:98c15c12b1cb 152 switch(accuracy){
Sigma884 0:98c15c12b1cb 153 case 1:
Sigma884 0:98c15c12b1cb 154 cmd[1] = 0x2A; //繰り返し精度:低
Sigma884 0:98c15c12b1cb 155 break;
Sigma884 0:98c15c12b1cb 156
Sigma884 0:98c15c12b1cb 157 case 2:
Sigma884 0:98c15c12b1cb 158 cmd[1] = 0x21; //繰り返し精度:中
Sigma884 0:98c15c12b1cb 159 break;
Sigma884 0:98c15c12b1cb 160
Sigma884 0:98c15c12b1cb 161 case 3:
Sigma884 0:98c15c12b1cb 162 cmd[1] = 0x37; //繰り返し精度:高
Sigma884 0:98c15c12b1cb 163 break;
Sigma884 0:98c15c12b1cb 164
Sigma884 0:98c15c12b1cb 165 default:
Sigma884 0:98c15c12b1cb 166 cmd[1] = 0x2A; //繰り返し精度:低
Sigma884 0:98c15c12b1cb 167 }
Sigma884 0:98c15c12b1cb 168
Sigma884 0:98c15c12b1cb 169 i2c -> write(SLV_WRITE_SHT, cmd, 2);
Sigma884 0:98c15c12b1cb 170 }
Sigma884 0:98c15c12b1cb 171
Sigma884 0:98c15c12b1cb 172 /*****************
Sigma884 0:98c15c12b1cb 173 連続計測モードデータ取得
Sigma884 0:98c15c12b1cb 174 *****************/
Sigma884 0:98c15c12b1cb 175 void mySHT35::getContinueTempHum(float *temp, float *hum){
Sigma884 0:98c15c12b1cb 176 cmd[0] = 0xE0;
Sigma884 0:98c15c12b1cb 177 cmd[1] = 0x00;
Sigma884 0:98c15c12b1cb 178
Sigma884 0:98c15c12b1cb 179 i2c -> write(SLV_WRITE_SHT, cmd, 2);
Sigma884 0:98c15c12b1cb 180 i2c -> read(SLV_READ_SHT, buff, 6);
Sigma884 0:98c15c12b1cb 181
Sigma884 0:98c15c12b1cb 182 val[0] = (unsigned int)buff[0] << 8;
Sigma884 0:98c15c12b1cb 183 val[1] = (unsigned int)buff[1];
Sigma884 0:98c15c12b1cb 184 val[2] = (unsigned int)buff[3] << 8;
Sigma884 0:98c15c12b1cb 185 val[3] = (unsigned int)buff[4];
Sigma884 0:98c15c12b1cb 186
Sigma884 0:98c15c12b1cb 187 temp_p = (float)(val[0] | val[1]);
Sigma884 0:98c15c12b1cb 188 hum_p = (float)(val[2] | val[3]);
Sigma884 0:98c15c12b1cb 189
Sigma884 0:98c15c12b1cb 190 temp_p = temp_p * 175.0 / 65535 - 45.0;
Sigma884 0:98c15c12b1cb 191 hum_p = hum_p * 100.0 / 65535;
Sigma884 0:98c15c12b1cb 192
Sigma884 0:98c15c12b1cb 193 if(temp_p > -273 && temp_p < 1000){
Sigma884 0:98c15c12b1cb 194 *temp = temp_p;
Sigma884 0:98c15c12b1cb 195 }
Sigma884 0:98c15c12b1cb 196 if(hum_p > 0 && hum_p < 100){
Sigma884 0:98c15c12b1cb 197 *hum = hum_p;
Sigma884 0:98c15c12b1cb 198 }
Sigma884 0:98c15c12b1cb 199
Sigma884 0:98c15c12b1cb 200 }
Sigma884 0:98c15c12b1cb 201
Sigma884 0:98c15c12b1cb 202 /****************
Sigma884 0:98c15c12b1cb 203 連続計測モード停止
Sigma884 0:98c15c12b1cb 204 ****************/
Sigma884 0:98c15c12b1cb 205 void mySHT35::stopContinueMeasure(){
Sigma884 0:98c15c12b1cb 206 cmd[0] = 0x30;
Sigma884 0:98c15c12b1cb 207 cmd[1] = 0x93;
Sigma884 0:98c15c12b1cb 208
Sigma884 0:98c15c12b1cb 209 i2c -> write(SLV_WRITE_SHT, cmd, 2);
Sigma884 0:98c15c12b1cb 210 }