ラベル STTS751 の投稿を表示しています。 すべての投稿を表示
ラベル STTS751 の投稿を表示しています。 すべての投稿を表示

2016年6月14日火曜日

風呂水温計 ver 3.1

前回バージョンを少し改良。電池をもたせるために30度以下なら10分ごと、超えたら5分ごとに測定するようにしました。

…こんなグラフになりました。


沸くの早いな、ほんとに。

改良箇所は、void setup()の直前に次の行を追加し
int waitSec;
deepSleepの行を以下に入れ替えました。
waitSec = temperature > 30.0 ? 300 : 600;
ESP.deepSleep((waitSec - second()) * 1000 * 1000, WAKE_RF_DEFAULT);
さて、風呂に入ろうっと。

■追記 6/15■


前記のように「30度を下回ったら」って仕様に変更したんだけど、お湯に入れたままだと30度以下にならない件。これから暑くなるしなぁ。

2016年6月13日月曜日

100円温度センサー+ESP-WROOM-02でWiFi風呂水温計



ってことで、昨日試した100円温度センサーSTTS751をESP-WROOM-02と電池に接続し、100均のジャム瓶?に入れました。フタの発泡ウレタンを少し切り取ってアルミ地金をむき出し、そこに放熱グリースを塗ってセンサーを貼り付けました。

風呂の中でフタを下にして浮かんで欲しいので、重い電池がフタ側に来るようにするのがコツ?です。ただ、フタが下だとどうしても浸水してしまいます。内部の温度が下がるときに熱膨張(の逆)によって水を吸い込みますので、風呂が湧いたらお湯から出すようにするのが一番効果がありました(経験者は語る)。

対策としては膨張した空気の容積差を吸収すればいいので、もっと柔らかいボトルを使うか、ボトル側に穴をあけてビニールシートで空気室を作ってやるのが一番簡単かなと思います。

また、風呂のフタをしめていれば、それほど大きく温度がズレることもないので、電池をボトル側の底に入れても問題ないかと思います。その辺は使い方に応じて選択してください。


ESP-WROOM-02がdeep sleepから立ち上がった時にWiFi経由でThingSpeak.comへデータを送信します。風呂の温度はそれほど急激に変化するものでもありませんから、送信頻度は5分に1回にしました。以前1分間隔で動かした時には単4白エネループ3本で110時間動きました。今回黒エネループで何とか一ヶ月=720時間程度動いてくれると便利なのですが。

なおSTTS751とのやりとりは、こちらを参考にさせていただきました。ありがとうございます。

以下ソースです。初期化処理にbegin transmissionを追加して、データ受信のところを多少書き換えました。上記のサンプルコードには問題があるので後日修正します(6/24)。ThingSpeak.comへの送信は以前と同じというかほぼコピペです。


■追記■

電池のさらなる長持ちを目指してプログラムを改良しました(風呂水温計 ver 3.1)。

2016年6月12日日曜日

100円のデジタル温度センサー+Arduino


初めてこれを見つけた時には、あんまり安いので何かの間違いかと思いました。デジタル式の温度センサーで1個100円(高精度12ビットI2C接続デジタル温度センサ STTS751)。しかも5個買えば1個80円。ってんで、5個買いました。電源3.3vですが、I2Cピンは5vにも対応しているので3.3v電源ならばArduino, mbed, ESP8266, ラズパイなど幅広く対応可能です。とりあえず温度だけ測定したいという用途に向いてます。

秋月のサイトから
基板は以前買ったSOT23オペアンプ用がまだ手元に残っているのでそれ流用します。この基板にはオペアンプのピンに合わせてパスコンのパターンもついているのですが、STTS751とは合いません。普通に「SOT23変換基板 金フラッシュ」を使う方がいいと思います。

秋月のサイトから
で、これをホットプレートでリフロー。ピン間隔狭いので横一列にペーストを塗って乗せただけです。まとめて3個、作っておきました(基板の在庫が3枚しかなかった)。



Arduinoは標準のWireライブラリだと内部でプルアップするのでプルアップ抵抗外付けは不要です。チップは3.3v電源なのですが、SDA/SCLについては5.5vまで対応可能なので、Arduinoでも問題ありません。

仕様書p27から

Arduino nanoパチで試しました。

Arduino nanoSTTS751
A46 SDA
A54 SCL
3v33 Vdd
GND2 Gnd

余談ですが…うちにはつい衝動買いしたArduino nanoパチが大量にあるのですが、Arduino nanoパチは附属のピンヘッダよりもピンソケットの方が使いやすいのではないかと思います。少なくとも複数のArudino nanoパチをお持ちの場合は、1つをピンソケット仕様にしておくと実験の時にムダにブレッドボードを使わなくていいので、お手軽です。というよりも300円のnanoパチに150円のミニブレッドボードを専有されるのはもったいない、という貧乏心なのですが。



で、テスト。手っ取り早く、「arduino stts751」でぐぐったら、コードが出てきたのでさっくり動かします。動きました。

このコードには問題がありました。修正版を後日公開します。とりあえず風呂温度センサーについては修正版を公開しました。

今回これを引っ張りだしたのは、「風呂の水温計測」(ESP-WROOM-02で温度データ収集)に使うためです。以前、ESP-WROOM-02とアナログセンサーで作ったのですが、デジタルセンサーの方が校正などの手間が省けて便利なので。

追記:組み込みました。
100円温度センサー+ESP-WROOM-02でWiFi風呂水温計

追記:ライブラリ書きました。
https://github.com/TareObjects/STTS751

追記:とんでもなくダメなバグをfixしました
グラフがところどころおかしな動きを見せるので、センサーからデータを取り出すところに問題があるのかと大騒ぎしたのですが、浮動小数を文字列に変換する関数に致命的な間違いがありました。余りにもダメなバグなので、晒しておきます。

void ftoa(float f, char *buf) {    // wrong ftoa code
  float a = int(f);
  float b = int((f - a) * 100.0000);
  sprintf(buf, "%d.%d", (int)a, (int)b);
}

以上。codeで首を吊るべきレベルだ…。さすがに自分で書いたものだとは思いたくないけど、そうだとしても気づかない時点で同罪だ…。

なお、浮動小数から文字列への変換にはdtostrfが使いやすいです。dtostrf(浮動小数,整数部最小桁数,小数部桁数,char*)で使えます。整数部最小桁数よりも小さい場合はスペースが入ります。