Sensor module for temperature, air pressure, and humidity
Dependencies: DHT11 LM75B mpl115a2
SensorModule.cpp@3:c1c2c7c5fe82, 2015-02-18 (annotated)
- Committer:
- yukari_hinata
- Date:
- Wed Feb 18 15:01:36 2015 +0000
- Revision:
- 3:c1c2c7c5fe82
- Parent:
- 2:d1f55b26ccac
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yukari_hinata | 0:98946a466ef8 | 1 | #include "SensorModule.hpp" |
yukari_hinata | 0:98946a466ef8 | 2 | |
yukari_hinata | 0:98946a466ef8 | 3 | // コンストラクタ |
yukari_hinata | 0:98946a466ef8 | 4 | SensorModule::SensorModule(int n_sample) |
yukari_hinata | 0:98946a466ef8 | 5 | { |
yukari_hinata | 1:3d6d2ff7ff8a | 6 | // サンプリング回数, インスタンス初期化 |
yukari_hinata | 0:98946a466ef8 | 7 | this->n_sample = n_sample; |
yukari_hinata | 0:98946a466ef8 | 8 | this->temperture_sensor = new AnalogIn(p15); |
yukari_hinata | 1:3d6d2ff7ff8a | 9 | this->humidity_sensor = new DHT11(p11); |
yukari_hinata | 1:3d6d2ff7ff8a | 10 | this->pressure_i2c = new I2C(p9, p10); |
yukari_hinata | 1:3d6d2ff7ff8a | 11 | this->pressure_sensor = new MPL115A2(pressure_i2c); |
yukari_hinata | 1:3d6d2ff7ff8a | 12 | pressure_sensor->begin(); |
yukari_hinata | 3:c1c2c7c5fe82 | 13 | |
yukari_hinata | 3:c1c2c7c5fe82 | 14 | // デフォルト値をセットしとく |
yukari_hinata | 3:c1c2c7c5fe82 | 15 | new_temperture = 10; |
yukari_hinata | 3:c1c2c7c5fe82 | 16 | new_pressure = 1000; |
yukari_hinata | 3:c1c2c7c5fe82 | 17 | new_humidity = 40; |
yukari_hinata | 0:98946a466ef8 | 18 | |
yukari_hinata | 0:98946a466ef8 | 19 | } |
yukari_hinata | 0:98946a466ef8 | 20 | |
yukari_hinata | 0:98946a466ef8 | 21 | // デストラクタ |
yukari_hinata | 0:98946a466ef8 | 22 | SensorModule::~SensorModule(void) |
yukari_hinata | 0:98946a466ef8 | 23 | { |
yukari_hinata | 0:98946a466ef8 | 24 | delete temperture_sensor; |
yukari_hinata | 0:98946a466ef8 | 25 | delete humidity_sensor; |
yukari_hinata | 1:3d6d2ff7ff8a | 26 | delete pressure_i2c; |
yukari_hinata | 1:3d6d2ff7ff8a | 27 | delete pressure_sensor; |
yukari_hinata | 0:98946a466ef8 | 28 | } |
yukari_hinata | 0:98946a466ef8 | 29 | |
yukari_hinata | 0:98946a466ef8 | 30 | // 全センサーからn_sample回読み出し, 平均値で更新する. |
yukari_hinata | 0:98946a466ef8 | 31 | void SensorModule::read_all_sensor(void) |
yukari_hinata | 0:98946a466ef8 | 32 | { |
yukari_hinata | 2:d1f55b26ccac | 33 | int fail_count; |
yukari_hinata | 0:98946a466ef8 | 34 | register float sum_temp = 0, sum_humid = 0, sum_pres = 0; |
yukari_hinata | 2:d1f55b26ccac | 35 | // float sum_temp2 = 0; 気圧センサ, 実は温度も測れる(<-LEDで明らかに熱そうなので廃止.) |
yukari_hinata | 0:98946a466ef8 | 36 | |
yukari_hinata | 1:3d6d2ff7ff8a | 37 | pressure_sensor->ReadSensor(); |
yukari_hinata | 2:d1f55b26ccac | 38 | |
yukari_hinata | 2:d1f55b26ccac | 39 | fail_count = 0; |
yukari_hinata | 2:d1f55b26ccac | 40 | while(1) { |
yukari_hinata | 2:d1f55b26ccac | 41 | if (fail_count >= 5) { |
yukari_hinata | 3:c1c2c7c5fe82 | 42 | fprintf( stderr, "Error in Temperaure / Pressure Sensor \r\n"); |
yukari_hinata | 2:d1f55b26ccac | 43 | exit(1); |
yukari_hinata | 2:d1f55b26ccac | 44 | } |
yukari_hinata | 1:3d6d2ff7ff8a | 45 | // AnalogInを用いる場合は,n_samle回センサーから読み出す. |
yukari_hinata | 3:c1c2c7c5fe82 | 46 | sum_temp = sum_pres = 0; |
yukari_hinata | 1:3d6d2ff7ff8a | 47 | for (int count = 0; count < n_sample; count++ ) { |
yukari_hinata | 1:3d6d2ff7ff8a | 48 | // LM61CIZの温度読み取り |
yukari_hinata | 1:3d6d2ff7ff8a | 49 | sum_temp += (temperture_sensor->read()-(0.6/3.3))/(0.01/3.3); |
yukari_hinata | 1:3d6d2ff7ff8a | 50 | // MPL115A2の気圧読み取り |
yukari_hinata | 1:3d6d2ff7ff8a | 51 | pressure_sensor->ReadSensor(); |
yukari_hinata | 1:3d6d2ff7ff8a | 52 | sum_pres += pressure_sensor->GetPressure(); |
yukari_hinata | 1:3d6d2ff7ff8a | 53 | // sum_temp2 += pressure_sensor->GetTemperature(); |
yukari_hinata | 3:c1c2c7c5fe82 | 54 | wait(0.05); |
yukari_hinata | 1:3d6d2ff7ff8a | 55 | } |
yukari_hinata | 2:d1f55b26ccac | 56 | if ( fabsf(new_temperture - (sum_temp / n_sample)) < 40 |
yukari_hinata | 2:d1f55b26ccac | 57 | && fabsf(new_pressure - (sum_pres / n_sample)) < 40 ) { |
yukari_hinata | 2:d1f55b26ccac | 58 | break; |
yukari_hinata | 2:d1f55b26ccac | 59 | } else { |
yukari_hinata | 2:d1f55b26ccac | 60 | // 異常値ならばやり直し(たま〜に異常値をとる...) |
yukari_hinata | 2:d1f55b26ccac | 61 | fail_count++; |
yukari_hinata | 2:d1f55b26ccac | 62 | } |
yukari_hinata | 2:d1f55b26ccac | 63 | } |
yukari_hinata | 0:98946a466ef8 | 64 | |
yukari_hinata | 2:d1f55b26ccac | 65 | // 更新 |
yukari_hinata | 0:98946a466ef8 | 66 | new_temperture = sum_temp / n_sample; |
yukari_hinata | 0:98946a466ef8 | 67 | new_pressure = sum_pres / n_sample; |
yukari_hinata | 2:d1f55b26ccac | 68 | |
yukari_hinata | 1:3d6d2ff7ff8a | 69 | // printf("LM61CIZ : %f vs. MPL115A2 : %f \r\n", sum_temp / n_sample, sum_temp2 / n_sample); |
yukari_hinata | 0:98946a466ef8 | 70 | |
yukari_hinata | 3:c1c2c7c5fe82 | 71 | // DHT11の湿度読み取り : 一発読み込み成功すれば良し. |
yukari_hinata | 2:d1f55b26ccac | 72 | fail_count = 0; |
yukari_hinata | 2:d1f55b26ccac | 73 | while(1) { |
yukari_hinata | 2:d1f55b26ccac | 74 | if (fail_count >= 5) { |
yukari_hinata | 2:d1f55b26ccac | 75 | fprintf( stderr, "Error in Humidity Sensor \r\n"); |
yukari_hinata | 2:d1f55b26ccac | 76 | exit(1); |
yukari_hinata | 2:d1f55b26ccac | 77 | } |
yukari_hinata | 2:d1f55b26ccac | 78 | |
yukari_hinata | 3:c1c2c7c5fe82 | 79 | if (humidity_sensor->readData() == DHT11::DHT_OK) { |
yukari_hinata | 2:d1f55b26ccac | 80 | new_humidity = float(humidity_sensor->readHumidity()); |
yukari_hinata | 2:d1f55b26ccac | 81 | break; |
yukari_hinata | 2:d1f55b26ccac | 82 | } else { |
yukari_hinata | 2:d1f55b26ccac | 83 | fail_count++; |
yukari_hinata | 2:d1f55b26ccac | 84 | } |
yukari_hinata | 3:c1c2c7c5fe82 | 85 | wait(0.1); |
yukari_hinata | 0:98946a466ef8 | 86 | } |
yukari_hinata | 0:98946a466ef8 | 87 | |
yukari_hinata | 2:d1f55b26ccac | 88 | } |