回答編集履歴

1

追記

2022/08/25 07:07

投稿

TakaiY
TakaiY

スコア14307

test CHANGED
@@ -15,4 +15,49 @@
15
15
  Calibrateが終われば、正常に計測できるんじゃないでしょうか。
16
16
  できないようであれば、ReadRawDataあたりを動かしてみれば、センサの出力する生(Raw)のデータが見れるはずです。
17
17
 
18
+ ---
19
+ 気になったのでもう少しみてみました。
18
20
 
21
+ 値を主力しているところは、
22
+ ```c++
23
+ Serial.print(sensor.measureCO());
24
+ ```
25
+ こうなっていて、sensor.measureCO()はライブラリのソース(MiCS6814-I2C.cpp)にあって、
26
+ ```c ++
27
+ float MiCS6814::measure(gas_t gas) {
28
+ float ratio;
29
+ float c = 0;
30
+
31
+ switch (gas) {
32
+ case CO: //carbon monoxide
33
+ ratio = getCurrentRatio(CH_RED);
34
+ c = pow(ratio, -1.177) * 4.4638; //paulvha
35
+ break;
36
+ /* 省略 */
37
+ }
38
+
39
+ return isnan(c) ? -1 : c;
40
+ ```
41
+ こうなっています。 ここで、-1が返るということから、cが「nan」になっているようです。
42
+ cがnanになるのは、「pow(ratio, -1.177)」がnanになるときです。 powは第一引数(ここではratio)が負のときnanになります。
43
+ getCurrentRatio(CH_RED) が負の値をしているとすると、
44
+ ```c++
45
+ float MiCS6814::getCurrentRatio(channel_t channel) {
46
+ float baseResistance = (float) getBaseResistance(channel);
47
+ float resistance = (float) getResistance(channel);
48
+
49
+ if (1 == __version) {
50
+ return resistance / baseResistance;
51
+ }
52
+ if (2 == __version) {
53
+ return resistance / baseResistance * (1023.0 - baseResistance) / (1023.0 - resistance);
54
+ }
55
+
56
+ return -1.0;
57
+ }
58
+ ```
59
+
60
+ resistance が負だとか、 baseResistance が1024より大きいとかが原因になりそうです。
61
+ あと、`__version`が1でも2でもないとか(初期化でどちらかに設定されているので無いはず)
62
+
63
+ resistance や baseResistance がどのような値なのかは、サンプルの ReadRawData.ino を実行すればわかるはずなので、これ実行してみるといいんじゃないでしょうか。