無事に「HS15P湿度センサの簡易動作実験」の追試ができたところで、これをArduinoに移植してみました。
回路図は・・・・省略。
- Analog0にLM35DZの出力を接続
- Analog1に湿度センサと0.022uFの間の端子を接続
- Analog2に湿度センサを接続(デジタル出力ポートとして使用)
という接続です。
ソフトウェアの方はほぼそのままの移植ですが、
- A/D変換はArduinoのライブラリを使用
- I/O端子制御もArduinoのライブラリを使用
- シリアル出力もArduinoのライブラリを使用
- ループで時間調整しているのを delayMicroseconds()に置き換え
- 変数名をちょっとそれっぽく、と思ったけど中途半端・・・
などの変更をしました。それ以外はそのまま移植しましたが、あっさりそれっぽく動きました・・・。ただ、校正のための道具がないので、そこまで・・・と思ったのですが、もうちょっと頑張ってみます。
まず、元のATTINY13でHS15Pの代わりに用意した1KΩ、10KΩ、100KΩ、1MΩの抵抗をつけてデバッグ用に出力されている抵抗の対数値を記録します。1KΩ時が219、10KΩ時が180、100KΩ時が140、1MΩ時が99と、ほぼ理論値通りになりました。
この抵抗をArduino版に接続すると、1KΩ時が226、10KΩ時が181、100KΩ時が141、1MΩ時が100といずれも少し大きめの値が出力されます。これは充電時間が長めになっているからだと思われます。
そこで、時間設定を0.1us単位で管理して、delayMicroseconds()に渡す際に10で割ってやると、1KΩ時が240、10KΩ時が209、100KΩ時が141、1MΩ時が99と、大きな誤差がでるようになってしまいました。おそらく除算を必要とするようになってしまったので、結果的にwaitが増えてしまったのでしょう。
結局、測定レンジを充電時間で指定するのではなく、インデックスで指定するようにしてwaitの時間はその中で swtich()~case で充電開始終了を含めたテーブル形式にして、待ち時間も調整することにしました。その結果、1KΩ時が219、10KΩ時が180、100KΩ時が139、1MΩ時が99と、ほぼ合うようになりました(当然ですが・・)。
これでセンサをHS-15Pに戻せば概ね正しい値を測定できるはずです。