Sensor module for temperature, air pressure, and humidity

Dependencies:   DHT11 LM75B mpl115a2

Dependents:   WeatherPredictor

Committer:
yukari_hinata
Date:
Thu Feb 19 19:18:34 2015 +0000
Revision:
4:f37a8d2673cc
Parent:
3:c1c2c7c5fe82
Add a error check

Who changed what in which revision?

UserRevisionLine numberNew 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 }