SHT35を使うためのライブラリ
SHT35.cpp@0:98c15c12b1cb, 2019-01-12 (annotated)
- 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?
User | Revision | Line number | New 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 | } |