…こんなグラフになりました。
2016年6月14日火曜日
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時間程度動いてくれると便利なのですが。
以下ソースです。初期化処理にbegin transmissionを追加して、データ受信のところを多少書き換えました。
■追記■
電池のさらなる長持ちを目指してプログラムを改良しました(風呂水温計 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, ラズパイなど幅広く対応可能です。とりあえず温度だけ測定したいという用途に向いてます。
| 秋月のサイトから |
| 秋月のサイトから |
Arduinoは標準のWireライブラリだと内部でプルアップするのでプルアップ抵抗外付けは不要です。チップは3.3v電源なのですが、SDA/SCLについては5.5vまで対応可能なので、Arduinoでも問題ありません。
![]() |
| 仕様書p27から |
Arduino nanoパチで試しました。
| Arduino nano | STTS751 |
| A4 | 6 SDA |
| A5 | 4 SCL |
| 3v3 | 3 Vdd |
| GND | 2 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*)で使えます。整数部最小桁数よりも小さい場合はスペースが入ります。
なお、浮動小数から文字列への変換にはdtostrfが使いやすいです。dtostrf(浮動小数,整数部最小桁数,小数部桁数,char*)で使えます。整数部最小桁数よりも小さい場合はスペースが入ります。
登録:
投稿 (Atom)







