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

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年2月24日水曜日

ESP-WROOM-02 + 空気質センサー


空気室なら知ってるけど、空気質ってあんまり聞かない / 使わない言葉ですね。意味わかるけど。


ずっと前にaitendoで衝動買いしてそのまま忘れていました(空気質センサモジュール [MQ135-4P])。それにしても空気質。指標はいろいろありますが、いったい何を測定してくれるのでしょうか。とりあえず、この手のものとしては秋月で売っているTGS2450が電子工作界ではおなじみだと思います。

秋月のサイトから

ただしTGS2450は結構気難しいというかヒーターの電圧や加圧時間を間違えるとすぐに焼損することで有名です。私も使ったことがあります(懐かしい記事はこちら)。

でも、こっちの空気質センサーは、モジュールになっていて電源5vをかければ0-4vで空気の質がわかる、というシロモノです。

ということで、使ってみました。

<追記 2016-03-18> 90mAも消費するだけあって、動作させたままだと結構暖かくなります。放射温度計で測ったところ、一番暖かい場所で51度でした(室温24度)。お使いになる時はこのことを覚えておいてください。

■構成■

毎度おなじみESP-WROOM-02のTOUTをアナログ入力として使います。TOUTは1v入力なので、空気質センサーの出力は分圧してから使います。

接続はこれだけです。空気質センサのDoutは使いません。なお、空気質センサーは100mA近い電流を消費するので、小さなUSBシリアルだと電流容量不足になります。

ESP-WROOM-02USBシリアル半固定抵抗空気質センサ
5vVcc
Vcc3.3v
GndGnd1Gnd
TxRx
RxTx
Tout2
3Aout

■調整方法など■

分圧には10kΩの半固定抵抗を使いました。

ぶっつけ本番でいきなりToutにつなぐとESP-WROOM-02をぶち壊す可能性が高いので、最初はブレッドボードの上で半固定抵抗の1を5v、3をGndに接続し、2とGndの間の電圧をテスターなどで測定しながら抵抗のツマミをまわし、約1.2vになるように調整します。

空気質センサーの出力が4vなのだから5vで調整するとしたらフルスケール1.25vなのですが、少し余裕を見ます。なお、半固定抵抗の1と3は対称なので、調整後に組み込む際に間違えないようにします。私の場合はツマミのついている側を1に決めています。

先日のSCL/SDA同様、こういう決め事を作っておくと事故を防ぐことができます。

…と、数多くの事故にまみれてきた私が言うのだから説得力があります。

…いや、無いのか。

■ソフトウェア■

毎度おなじみの秒単位簡易リングバッファで1分間の平均値を取ってThingSpeak.comへ送っています。


■計測結果■

計測結果ですが、ほぼ無臭のフロンガスのエアダスターに対しては1mぐらい離れたところで使っても反応があります。無水アルコールにもわりと敏感ですね。私が「ハーッ」て息を吐きかけると、てきめん、数字が上がるので心が傷つきます。

[19]で息を吹きかけました。

ThingSpeak.comでの計測値はこんな感じ。


さて。加齢臭にはどうなのか。知りたいような知りたくないような。明日、換気状態で出勤して値はどう変わるのか。追ってご報告申し上げたいと思います。

…私が寝ている間に62まで下がりました。04:15ごろ起床。

2016年1月24日日曜日

BME280とOLEDをESP-WROOM-02で使ってみた


■構成■

BME280はボッシュ製の気温湿度気圧センサー。ワンチップでこの3つが計測できてなかなか便利、しかも秋月で600円1080円。SPIかI2Cで接続できますが、今回はI2Cとします。しかし秋月さん、どのぐらいの単位で仕入れているんでしょうね。Mouser.jpとかでこのチップ取り寄せても700円以上するし基板は特殊形状なので普通ならかなり高価になるはずです。考えるだけで恐ろしい。

OLEDは今や電子工作標準品ともいうべき0.96インチサイズのアレ。作例もライブラリも豊富、I2Cと電源/GNDの合計4本だけで動いてしまいフレームバッファ(画像メモリ)も持っているので何かとラク。

できあがったあとで、WiFiついてるのにセンサーと表示器を同居させてどうすんだ?と自分自身に突っ込みました。

■製作■

何かケースに入れて外に設置したいので、今回もユニバーサル基板で組みました。以前、「いつかきっと使う」という想いで買い集めたaitendoのFRISK大の変換基板を適当に折って使います。基板上にモジュールを挿したヘッダソケットを挿して見て、レイアウトに見当を付けます。ハンダ付けが終わったあとでおとなりと干渉して実装できない、なんてのは悲しすぎますので。

それから秋月の資料とOLEDの実物をみながら、簡単に配線メモを書きます。前回のLEDで懲りました。複数の資料をあたりながら裏側での配線を考えるのは私の脳ミソでは無理だ、と。ということで、裏側、配線面で各要素のピンがどうなっているかをメモにしておきます。



上の段からOLED、ESP基板、BME280基板I2Cでの接続(ユニバーサル基板上での位置、I2Cでの接続、BME280基板での名前)と並んでます。下の2つは作業過程のメモで使うのは上の3つです。上から4ピンヘッダソケット、9ピン足長ソケット(10ピンのを切断して使用)、6ピンヘッダソケットを使います。BME280のCSBは3.3v、SDOはGNDに接続しました。SDOはHIGHかLOWかでI2Cのアドレスを切り替えることができますが、GNDに接続するとデフォルトの0x76になり、今回使ったライブラリもそのままで動きます。



VDD、GND、SDA、SCLをそれぞれ接続します。ああ言葉で言うと簡単。朝っぱらから2時間かかったですよ、これ作るのにorz ヘッダソケットで3階建てになっているので、ヤケに高さがあります。

一番上で緑の背中を見せているのはBME280


■ソフトウェア■

BME280はこちらのライブラリを使い、サンプルを参考にさせていただきました(参考というかほぼ手直しが必要ないのですけども)。

OLEDはこちらです。今回、単純な文字表示にしか使わなかったのですが、uiクラスがあってそれを使うと複数画面を指定したアニメーションで入れ替えつつ任意の位置にミリ秒単位で別の画面をオーバーレイできる、という素晴らしい完成度です。また文字表示も素晴らしく、きれいなフォントはサイズが3種類あって右寄せ左寄せなども使えます。残念ながらクラスにラインを引っ張る命令がないので、そのうちDDAか何かで作って貢献したいですが…。

これら素晴らしいライブラリの作者に経緯を表し、感謝申し上げます。

さて、書いたプログラムはごく単純です。setupで各要素を初期化、loopでは1秒ごとに計測して表示を更新し、1分ごとにThingSpeak.comに送っています。

ご質問などはコメント欄にご遠慮なく。

2015年11月8日日曜日

「机ドン!」検出デバイス@ESP-WROOM版



■ESP版■

というわけで前回のArduino版をESP-WROOM-02でも動かしてみました。

AdafruitによるWS2811最新版ライブラリはESP8266にも対応しています。

ただ、うちのWS2811がNeoPixelではなく安物なのがいけないのか、指示した通りに光ってくれません。Greenだけは良い感じなんですが、Red/Blueについては意図した信号になっていません。トランジスタで3.3->5vへのレベルコンバータをはさんでみたのですが変わりませんでした。うーん。

400khzに切り替えても同じ。うーん。

光り方をみていると最上位ビットがズレているような感じ。

ということでLEDの点滅が意図したパターンとは違いますが、ESPでも動作させることができました。加速度センサーの値に応じてLEDを点滅させるところまではArduino版と同じですが、1分ごとにThingSpeak.comあてに各軸ごとの最大加速度を送信するようにしました。

■配線など■

相変わらずプルアップ/プルダウン/GND接続が多くて面倒くさい。

ESP-WROOM-02接続先
3V33V3
GND(すべて)GND
EN10kΩ経由で3V3
IO14ADXL345のSCL
IO12WS2811のDin
IO13N.C.
IO1510kΩ経由でGND
IO210kΩ経由で3V3
IO010kΩ経由で3V3 およびISPスイッチ※
IO16N.C.
TOUTN.C.
RST10kΩ経由で3V3 およびRSTスイッチ※
IO5N.C.
TxdFTDIのRxへ
RxdFTDIのTxへ
IO4ADXL345のSDAへ

※ISPスイッチ/RSTスイッチはノーマリーオープンのタクトスイッチで、他方をGNDにつないでください。これによりRSTとISPは常時Highレベルでスイッチを押した時にLowレベルになります。

レベル変換回路はこちらのページ(3.3V 5V レベル変換)に記載されていた「3.FETによる3.3V 5Vレベル変換」と「4.トランジスタによる3.3V 5Vレベル変換」回路を試しました。このページ上の写真にうつっているのはトランジスタによる回路です。なお、WS2811の場合は流れ込む電流が多いのか5V側のプルアップ抵抗は10kΩでは電圧が上がらなかったので1kΩを使いました。出力側の回路に応じて使い分ける必要があります。

それとFTDIを接続する際には、GND同士の接続をお忘れなく。

ADXL345接続先
SCLESPのIO14
SDAESPのIO4
SDOGND
CS3.3v
Vs3.3v
GNDGND
Vdd3.3v

WS2811接続先
DinESPのIO12
Vcc5V
GNDGND
DoutN.C.

M78AR033-0.5接続先
Vin5V
GNDGND
Vout3V3ライン

この他、ESPの3V3近くとADXL345のVccに0.1μFのパスコン、WS2811のVccとGNDの間に470uFのアルミ電解コンデンサを入れてます。

■ADXL345ライブラリの修正■

Android Citiさんのライブラリは Wire.begin(); でI2Cを初期化しているので、これを接続したピンに合わせて Wire.begin(4, 14); に変えます。ただそのままだと後日このライブラリをArduinoで使った時に動かなくて苦しみそうなので、
#ifdef ESP8266
  Wire.begin(4,15);
#else
  Wire.begin();
#endif
と書いておきます。

■ソース■

Arduino版との違いはボリューム読み込みをしていないのとThingSpeak.comへの送信処理を行っている点です。ThingSpeakへは1分ごとにその間の最高値を送るようにしています。

ESPからThingSpeak.comへの送出には鳩退治デバイスに使ったsendなどの処理をほぼそのまま使ってます。楽だわー。


2015年10月24日土曜日

鳩対策2号機(動きモノ


学習能力のあるカラスは電撃一回で来なくなったようですが、鳩は電撃で対策した柵には寄りつかなくなったものの今度は室外機の上に来るようになりました。

ということで、今度は、光り物と動き物で脅かす作戦にしました。やつら「実害」がないとダメなので、当初は電極を振り回そうかと思ったのですが、製作中に私が「実害」を受ける未来しか浮かばないので保留。

■仕様■

まず使用機材:
  • 動作状況をモニタできるようにESP8266を使用
  • 動きモノはサーボモータSG90
  • 光りモノは赤色LEDを直接接続
  • 鳩検出はPIR
  • 動作状況の記録にはThingSpeakを使用
動作仕様:
  • PIRで何かを検出したら時計をセット
  • 時計がセットされていたらサーボ腕を振り回しつつLEDを点滅させる。5秒経ってもどかなければ、LEDの点滅を激しくする
  • 何かがいなくなったら、サーボとLEDを止めてから何秒とどまっていたかをThingSpeakに送信
  • それとは別に1分ごとに気温と湿度をThingSpeakに送信する

■ハードウェア制作■

ESP8266/ESP-WROOM-02の電源を甘く見てはいけません。最終的に毎度お馴染みの「超高効率DC-DCコンバーター(3.3V0.5A) M78AR033-0.5」を使い、アルミ電解コンデンサ470uF + タンタル4.7uF + 積層セラミック1uをブレッドボードの3.3v電源ラインに並べ、ESPモジュールの上、Vcc - GND間に直接積層セラミック0.1uをハンダ付けして、安定動作させることができました。VccとGNDが離れているのでパスコン付けにくいんですよね…。ロットでの差異や個体差もあると思いますが、ここまでやれば起動直後にドーンと電流食われてもだいたい安定します。

サーボモータはIOピン直結、LEDはVfの実測値1.8vだったのでESPのIO定格値12mAを超えないよう150Ωの抵抗を入れて制限します。

HDC1000は秋月のプルアップ抵抗内蔵モジュールを使いますので、電源とI2Cを接続するだけでOKです。

PIRはHC-SR501を使いました。アマゾンでも秋月でも入手できます。このPIRは4.5vから使うことができます。秋月では5-12vと書いてありますが、他サイトでは4.5-12vになっていて、実際に試しても5vで問題ないようです。SE-10のように5vって書いてあるけど5vで使うとしばらくして不安定になる、ということはありません。以下配線表です。


ESP-WROOM-02モジュール接続先
1Vcc3.3vライン
2EN10kΩを通して3.3vラインへ(プルアップ)
3IO14HDC1000のSCLへ
4IO12150Ωを介してLED1へ
5IO13150Ωを介してLED2へ
6IO15N.C.(無接続)
7IO2プルアップ
8IO0プルアップ
スイッチを通してGNDへ
9GNDGNDへ
10IO4HDC1000のSDAへ
11RxDFTDIのTxへ
12TxDFTDIのRxへ
13GNDGNDへ
14IO5N.C.
15RSTプルアップ
スイッチを通してGNDへ
16TOUTN.C.
17IO16SG90の信号線(オレンジ色)
18GNDGNDへ


この他、各モジュールには電源を接続します。HDC1000はモジュールに書いてある通り、PIRはここがわかりやすいです。サーボはこちらを参考にしました。

PIRは感度と出力秒数をボリュームで、ジャンパで出力モードを指定できます。感度ボリュームは検知範囲の指定ですが、人間よりも小さい鳩が対象なので最大(7m程度)にします。出力秒数は動きが検知されなくなった後何秒ぐらい出力HIGHをキープするかを設定します。よくある侵入警告灯などで使う機能ですね。これは居なくなったらできるだけ早く消えて欲しいので最小にします。ジャンパは信号出力中に動きを検知した場合に点灯時間を延長するか最初の検知から指定時間を経過したらその間動きがあってもOFFにするかを切り替えます。内側は動いている間はずっと出力、外側は指定時間でOFF。今回は鳩の滞在時間を調べたいので、内側にします。上記の通り出力が延長されてしまうので正確な記録にはならないのですが…まぁ傾向はわかるかなと。

■ThingSpeakすげえ■

今回、ThingSpeak初めて使ったのですが、こういうWebサービスの中では今までで一番簡単でした。開発中、「そろそろThingSpeakへの書き込みコードを用意しておこう」と思ってコピペしてAPI KEYや変数などを書き換えてそのまま放置していたんですが、画面の隅で何か動いているものがあるなと思ったらThingSpeakのグラフでした。これだけでグラフになっちゃったのは初めてです。いやー、恐ろしい。

なお、ThingSpeakへの書き込みコードはここからコピーしました。ありがとうございます。Particleも良いんだけどね…I2Cが動かないのと何よりも技適がないのでどうにもなりまへん。

■ESPをArduino IDEで使う場合のピン番号■

動かしたヒトならみんなご存じだと思うのですが、探しても明記しているページが出てこなかったので書いておきます。

Arduino IDEでpinmode, digitalOutなどを使い場合に指定するピン番号は、ESPのIO4, IO5などと書いてある数字を使います。物理的なピン番号ではありませんのでお間違いのないように。

■ハマり所■

  • 上にも書きましたが、ESP8266の電源はちゃんとインピーダンスを下げないと暴走します。それもArduino IDEが書き込み終わった直後に暴走(電解コンデンサ追加で改善)、動作するけど数分で止まる(タンタル4.7uF追加)、数十分で止まる(パスコンを基板上に直接ハンダ付けで改善)…と対策をすれば良くなりますので、安定して動作しないとお悩みの方はお試しあれ。
  • Arduino HDC1000ライブラリはそのままでは動きません。Wire.beginでSDL, SCLのピン番号を指定する必要があります。HDC1000.cppのコンストラクタでWire.begin(); を Wire.begin(4,14); にします。
  • 存在しないIO番号、例えば6を指定すると、Arduino IDEではエラーになりませんがpinmodeなどを実行した際にExceptionが出ます(シリアルコンソールにメッセージが出ます)。
  • サーボモータを使うのはこれが初めてです。サーボモータは0-180度で動作するとのことなんですが、激安サーボとして有名なSG90は45-135度ぐらいしか動作しませんでした。その範囲外を指定すると唸り始めます。5個買ったうちの2個が同じ状態だったのですが、そういうもの?
  • サーボモータをつないだままにしておくと信号が一定でもピクピクもぞもぞ動いていますが、これを止めるにはdetachします。使う時にまたatachします。消費電力の節減にもなります。

■ソース■

より高い威嚇効果を求めて複雑な動きをさせたら腕の動きが激しくなったときにサーボがモゲそうになったので、単純な動きにしていますが…RTOSあたりをつかって、ちゃんと加速度制御を考えた上で複雑な動きをさせたいものです。