オゾンセンサをポテンショスタット回路を使ってESP32につなげる

オゾンは除菌に威力を発します。この季節気になるインフルエンザやノロウイルスの空気感染にも大きな効果があり、今巷で問題のコロナウイルスの対策にもなりそうです。

しかしながらオゾンは

- すぐに分解して濃度が下がる
- 湿度によって効果が変わる
- 人体に悪影響がある

など扱いが難しいため、効果を発揮するには濃度を測りながらでないとうまくいかなさそうです。
しかしながらオゾン濃度測定装置は結構高価（ン万円）です。結局それがオゾン除菌が広く普及しないネックぽいです。

オゾン発生機自体は安く、またオゾン発生のために特別な薬剤などを補給する必要もありません。なのでそれを活かして、オゾン濃度測定も安く実現できないものでしょうか？

今回は、オゾンセンサを使ったオゾン濃度測定にチャレンジしてみます。


# オゾンセンサ

オゾンセンサで手に入るものはいくつかあります。2020年1月頃調べたものとして:

- Winsen ME2-O3  ME3-O3 ME4-O3  ME3M-O3 25〜100ドルぐらい http://style.winsensor.com/ME.html
- Winsen MQ131 15ドルぐらい SnO2センサーでヒーター加熱式  https://www.winsen-sensor.com/sensors/o3-gas-sensor/mq131-l.html
- Winsen ZE14-O3 縦型センサ＋基板 ZE25-O3 薄型センサ＋基板 25ドルぐらい
- Alphasense ozone sensor O3-B4  O3-A1 OX-B421  OX-A431 80ドル〜600ドルぐらい
- Membrapor  O3/C-1000 O3/C-5 O3/S-30000 400ドルぐらい
- SPEC electrochemical 3SP_O3_20 DIP 電気化学ガスセンサー 20ドルぐらい
- sgxsensortech MiCS-2614 25ドル 表面実装 MEMSセンサhttps://www.sgxsensortech.com/ メーカーサイトに掲載していない（ディスコン）？

今回は、このうちの SPEC electrochemical の 3SP_O3_20 DIPを使います。

# 3SP_O3_20 DIP
![IMG_20200128_190550.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f0438157-0be4-6ea0-10ae-f721f13ab22e.jpeg)

Spec electrochemical 社のセンサ。
https://www.spec-sensors.com/wp-content/uploads/2016/02/3SP_O3_20-P-Package-110-406.pdf

- 価格が安め
- 消費電力が低い
- エージングに時間がかかる
- 個体ごとの特性値データが付いてくる
- DigiKeyで買えるのがうれしい

https://www.digikey.jp/product-detail/ja/spec-sensors-llc/110-406/1684-1042-ND/7689223

性能

- Measurement Range 0 to >20 ppm
- Resolution** < 20 ppb (instrumentation dependent)
- Sensitivity nA/ppm @ 5ppm -60 +/- 10 nA/ppm
- Expected Operating Life > 5 years (10 years @ 23+/-3C; 40+/-10% RH)
- Operating Temperature Range -30 to 50 C (-20 to 40 C continuous)
- Power Consumption 10 to 50 uW (circuit & ambient O3 dependent)

# 原理

このセンサーは電気化学ガスセンサー。

## 一般的な電気化学計測

下図のようなセルが定番として使われる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/3b5421fb-4416-e95b-498d-03a063c80a63.png)
https://www.researchgate.net/publication/263751794_Preparation_of_polyanilineTiO


WE(Working Electrode)、RE(Reference Electrode)、CE(Counter Electrode)の3つの電極があり、反応液に漬けておく。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/269b5020-3e13-f7a7-fa14-9a01330cbdc6.png)

http://www.elcorel.org/files/Educational_Lecture_Leiden_Jan_2018_BANDARENKA.pdf


WEは計測電極。WE-CE間に流れる電流を計測することで、反応を調べることができる。

## ポテンショスタット回路

この計測には、ポテンショスタット回路を使う。


REにあらかじめ想定したバイアスを入力し、なおかつRE-WE間に電流が流れないようにCEを調整する。その状態でWEに流れる電流を測定することで、セル内部における化学反応を測定することができる。

電流値は反応に非常に敏感に対応し、速度も速い。

## 電気化学センサー

このセンサー  3SP_O3_20 DIP は、上記の電気化学実験と同じように扱うことができ、ウラ面に C極、R極、W極が出ていてポテンショスタット回路をつなげて計測する。
![IMG_20200128_190601.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c90a12c8-e715-ab9d-bfb4-e82fceb5d0d9.jpeg)

W極から、ガスの体積割合に比例する電流を生成するのでそれを計測することになる。しかしながら電流は1ppmあたり60μA。微弱な電流を電圧に変換し、更にESP32で測定できるレベルの信号に増幅しなければならない。


# オペアンプの選定


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/edf1aba4-77b1-2423-4fb1-4a9b23690efb.png)

Unconventional Electrochemistry in Micro-/Nanofluidic Systems
Micromachines 2016, 7(5), 81; https://doi.org/10.3390/mi7050081
Creative Commons Attribution (CC-BY) license

CEの調整は上左図のように、RE電圧からのフィードバック制御をかける。そのためにはオペアンプを使う。
またWEの電流を電圧変換したり増幅するのにもオペアンプを使う。

オペアンプとは、アナログ信号を増幅するIC。増幅する電子パーツはトランジスタなどあるが、オペアンプは理想的な増幅ができるように工夫されている。

オペアンプは2本の入力の電圧差に比例した電圧が出力される。出力の一部をフィードバックすることによって、任意の倍率の増幅ができるようになる。

また、入力端子はハイインピーダンスであり、入力することで電流消費や電圧降下などを起こさないと考えることができる。

オペアンプには通常はプラスマイナスの電源が必要だが、今回は単電源のものを使用。
ピザ窯制御に使用して使い慣れた単電源高精度オペアンプNJM2119を使うことにした。
![https___qiita-image-store.s3.amazonaws.com_0_139524_833cb0fa-60c8-20b1-bd67-70d7b040993b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/523d12bc-0f29-6b12-a660-d246619e6ba2.png)
上はピザ窯制御回路。RaspberryPiの上にADコンバータ搭載のRASPBERRYHAB基板が乗り、その上にオペアンプ基板を孫乗せしていてK型熱電対で温度を計測している。

# 回路

![IMG_20200128_190805.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/9833ce07-5982-9046-32bf-48308fa62b1b.jpeg)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/49868a85-740b-64b0-8e5e-632fe47290e4.png)

R1,R2,R3の抵抗アレイで基準電圧を生成する。
オペアンプU1Bにより、RE(Reference極)は1.65-1.66Vに設定される。
オペアンプU1Bの6ピンはハイインピーダンスなのでREから出入りする電流は無い。
CE(Counter極)はオペアンプU1AによりREの電圧が設定電圧になるようにフィードバック制御される。


WE(Working極)につながったU2Bはカレントフォロワ回路。抵抗アレイで設定された1.62-1.63VにWEを設定。WEから出力される電流をR7で掛けた電圧に変換し、U2Bの7ピンに出力する。

U2Bの出力をそのまま測定をすると電圧が変動してしまうので、U2Aでボルテージフォロワ回路を組み、U2Aの1ピンにESP32を接続し計測することにする。

ESP32のADコンバータは誤差が大きかったりオフセットがかかったりしていて、オペアンプを濃度に比例した出力にするとうまく計測できない。したがってゼロ濃度のときは大体ADコンバーターの中点ぐらいにして、それからの変動で濃度を計算することにする。


# 校正

SPEC-AN-107-Characterization-and-Calibration.pdf によると、

> STANDARD CONDITIONS: SPEC Sensor calibrations are done under standard conditions of 23 ± 3 o C, 50 ±
15 %RH, and 0.9 - 1.1 atmospheres pressure. The air velocity in the calibration chamber is typically 0.01 -


とある。ということで23℃で測定した値を変換パラメータに入れることにした。

# 温度補正

センサは濃度にかなり良くリニアに対応していて、オフセットと傾きで計算できる。しかしながら温度によりオフセット値、傾き両方ドリフトする。このセンサは使用環境が-20℃〜40℃ということで、23℃と38℃の2点校正値を使用する。



## 温度センサ

温度だけなら簡単なサーミスタでいいけれども、オゾンの効果は湿度も関係するので温湿度センサDHT11を使って測定することにした。

## プログラムコード

```

#include "DHTesp.h"
#define DHTPIN 32
#define DHTTYPE DHT11
DHTesp dht;

static float temp=0;
float ppms[100];
int samplenum=100;
int counter=0;

void setup() {
  Serial.begin(115200);
  dht.setup(DHTPIN,DHTesp::DHT11);
  delay(500);
  for ( int i = 0 ; i<100; i++ ){
    ppms[i]=0;
  }
}

void loop()
{
  int sensor1 = A6;
  int sensorValue1 = analogRead(sensor1);
  TempAndHumidity newValues = dht.getTempAndHumidity();
  if (dht.getStatus() != 0) {
    Serial.println("DHT11 error status: " + String(dht.getStatusString()));
  } else {
      temp = newValues.temperature;
  }
  Serial.print("  ");
  float ppm;
//  ppm = (float(sensorValue1)-1940.0)/-29.3;  //23C
//  ppm = (float(sensorValue1)-1965.0)/-18.0;  //38C
  int offset  =((1965.0-1940.0)/(38.0-23.0))*(temp-23.0)+1940.0;
  int multiple=((-18.0-(-29.3))/(38.0-23.0))*(temp-23.0)+(-29.3);
  
  ppm = (float(sensorValue1)-offset)/multiple;
  
  ppms[counter % samplenum] = ppm;
  float ppmsum=0;
  for ( int i = 0 ; i<samplenum; i++ ){
    ppmsum += ppms[i];
  }
  float ppmsumavg = ppmsum/samplenum;
  if ( ppmsumavg < 0 ){
    ppmsumavg = 0;  
  }
  Serial.print(ppmsumavg);
  Serial.print("  " );
  Serial.print(ppm);
  Serial.print("  " );
  Serial.println(temp);
  delay(100);
  counter++;
}
```

ノイズが大きいので100回の移動平均を取る。サンプリング時間は0.1秒毎。過去10秒の移動平均となる。
DHT11は2秒おきでないとうまくデータが取れないが、手を抜いて0.1秒毎に取得、エラー処理でつじつまを合わせている。

# テストベッド

上記のプログラムに更に液晶表示を加えてみたもの。

![IMG_20200128_190737.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e2d9716e-3b8b-b257-f9c3-b16cfa83abe1.jpeg)

# 成果

安いオゾン濃度測定ができたでしょうか？

センサー 20ドル
オペアンプ 4ドル
ESP32 5ドル
液晶 5ドル
その他 5ドル

部材費40ドルぐらいですね。これよりも安くするにはセンサーのコストダウンが必要ですが、 SPEC electrochemical の 3SP_O3_20 以外のありものを使ってもあまり安くならなそうです。3SP_O3_20 は精度・入手性・トレーサビリティ・消費電力などの観点から優れています。あまり値段が変わらなければあえて他のセンサーを選定するメリットも無さそう。
もし、その限界を超えて劇的に安くするにはセンサー自体を作る方向で。

# 今後の改良点

- ESP32 のADコンバーターは厳密さに欠けるので、外部ADコンバーターをつけるのが望ましい。
- 電源の中点を元に値を計算しているが、中点電圧をインプットするようにすべし。
- 消費電力はかなり抑えることができる。それを活かすためにはESP32ではないマイコンで電池駆動を行うようにしたい。
- NJM2119以外のオペアンプを使って精度を詰めたい所。
- 校正値を簡単に取得、保存できるようにするしくみを考える。