Wifiでサボテンフレームの温度を自動計測するぞ!

【宣伝】instagramはじめました。



Instagram
※スマホが苦手なためインスタは基本的にコメント返せないかもしれませんm(_ _)m。
—–





というわけで!





時代はIoT(Internet of Things)だそうです。

サボテン・多肉植物栽培もIoTの出番なのです!




ということで、IoT(モノのインターネット)とはWikipediaによれば

モノのインターネット(Internet of Things、IoT)は、様々な「物」がインターネットに接続され、情報交換することにより相互に制御する仕組みである

とのことです。




簡単に言えば、世の中のあらゆるものをインターネットに繋げようということです(おそらく)




というわけで、今回は我が家のバルコニーの温度と、そこに置いてあるサボテン用フレームの温度を自動計測、そんでWifiでインターネットのクラウドサーバに保存していきたいと思います。

 



まだまだアナログの最高・最低温度計などを使用されている方もたくさんいらっしゃると思いますが、時代は進化したのです!スマホで外出先から温度を確認、一定の温度を超えたらメールで連絡、遠隔から換気扇を回すなんてことができる時代になったのです!おそらく!
(※今回やるのは温度のロギングだけですが・・・。)



・・・



実はこのようなことは2年ぐらい前にもやったのですが、そのときは実は有線でした。
具体的にいえば部屋の中のルーターからサボテンフレームまで線が繋がっていたのです。


詳しくはこの記事を参照のこと(いまや温度計測はしていませんが・・)。




この有線システムが困ったもので、まずコード自体が相当邪魔でした。


しかも、窓を超えるので、できるだけ細いコードを使ってサッシの僅かな隙間を通して外界と繋げていました。それでも窓の開け閉めするたびにコードに物理ダメージが蓄積し、常に断線の危険がつきまといました。


そして屋外では、このコードに枯葉だの砂だのが絡みつき掃除はとても面倒、コード自体も紫外線や水分で痛み、まぁもって2年という感じでした。(屋外用のコードを使えばよかったんですけどね。でも高いですしね。)



ということで、一念発起してこのシステムをwifiで作り変えようということです。


というわけで今回のシステムに必要なものは以下のものです。



メインボードとなるESP-WROOM-02というやつがとても優秀で、なんとwifiモジュールが搭載してあるにもかかわらず安くて、I/Oピンもついていて、ArduinoIDEでプログラムできるというやつなんですね。

ちなみに温度センサであるDS18B20(1-wired)は、バルコニーとフレームの温度の合計2箇所計測したいので、「パラサイトなんとか」という接続法で並列に2個使います。

温度センサーの写真です。

 

ということでややこしいことはすっぱ抜いて、作業工程と結果だけ書きます。主に自分の覚書です。

 


【作業工程】


まずメインの回路図はこちら。
抵抗はいろいろなページを読む限り4.7kΩらしいのですが、なかったので1.2kΩに。大きすぎても小さすぎてもダメなようです(経験談)。



外観はこちら。
タッパーに穴を開けて、エアコンの粘土とホットボンドで水が入らないように固定しています。
 






以下はプログラムを書き込むための手順です。


ArduinoIDE1.6.9  「ファイル」→「環境設定」のAdditional Boards Manager URLs:に 「http://arduino.esp8266.com/stable/package_esp8266com_index.json」と入力。


「ツール」→「ボード」→「Board Manager …」から一番下の「esp8266 by ESP8266 Community」をインストール 


ツール→ボードから「SparkFun ESP8266 Thing Dev」を選択。


下記のライブラリをZIPで落として、ZIPのままインストール。
 
ロギングは、以前はデータの保存も、ファイルサーバを立てて(PHPでGETするだけでしたが)グラフ表示していたのですが、面倒くさいので、今回は、既存のサービスを使います。こちらです。
 
 
 
無料でデータを保存してくれるすばらしいところです。
アカウントを取ってAPI keyなどを取得しておきます。
 

ということでESP-WROOM-02に書き込むメインコードです。


ESP8266(Arduino IDE) code


#include <esp8266wifi.h>
#include <onewire.h>
#include <dallastemperature.h>
#define ONE_WIRE_BUS  4     // データ線のポート番号
#define SENSOR_BIT    10      // 精度の設定bit

String apiKey = "*********";
const char* server = "api.thingspeak.com";

const char* ssid     = "*********";
const char* password = "**********";

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

WiFiClient client;

void setup(void) {

  Serial.begin(9600); //温度表示確認用
  delay(1000);
  sensors.begin();
  sensors.setResolution(SENSOR_BIT);
  /* debug */
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.println("Start to Loop");
  /* debug */
}
void loop(void) {

  sensors.requestTemperatures();              // 温度取得要求
  delay(2000);
  float t1 = sensors.getTempCByIndex(0);
  float t2 = sensors.getTempCByIndex(1);

  Serial.print(" %t");
  Serial.print("Temperature: ");
  Serial.print(t1);
  Serial.print(" *Cn");

   Serial.print(" %t");
  Serial.print("Temperature: ");
  Serial.print(t2);
  Serial.print(" *Cn");
  
    if (client.connect(server,80)) {
    String postStr = apiKey;
           postStr +="&field1=";
           postStr += String(t1);
           postStr +="&field2=";
           postStr += String(t2);
           postStr += "rnrn";

     client.print("POST /update HTTP/1.1n");
     client.print("Host: api.thingspeak.comn");
     client.print("Connection: closen");
     client.print("X-THINGSPEAKAPIKEY: "+apiKey+"n");
     client.print("Content-Type: application/x-www-form-urlencodedn");
     client.print("Content-Length: ");
     client.print(postStr.length());
     client.print("nn");
     client.print(postStr);
     Serial.println(postStr);        
  }
  client.stop();

  //DEEP SLEEPモード突入命令
  Serial.println("DEEP SLEEP START!!");
  //1:μ秒での復帰までのタイマー時間設定  2:復帰するきっかけの設定(モード設定)
  ESP.deepSleep(300 * 1000 * 1000 , WAKE_RF_DEFAULT);

  //deepsleepモード移行までのダミー命令
  delay(1000);

  Serial.println("jikkousarenaihazu");
}


そんで以下は、ThingSpeakのグラフコードです。

MATLAB Visualizations code

%Inspect the channel to see all available fields.

[~,~,channelInfo] = thingSpeakFetch(107993);

%Download the last 4 days of data on all fields of the channel.
[data,timestamps] = thingSpeakFetch(107993,'NumDays',2);

temperatureData1 = data(:,1);
temperatureData2 = data(:,2);

figure
hold on
grid on
%conver to Localtime(Tokyo)
plot(timestamps + (9/24),temperatureData1,'b')
plot(timestamps + (9/24),temperatureData2,'r')
ylim([0 50])
hold off
title('Temperature on Balcony and CactusGreenHouse (2days)')
xlabel('Date')
ylabel('Temperature')
legend('Balcony ','CactusGreenHouse ')
datetick



【結果】

こんな感じでフレーム内においています。


以下結果です。ThingSpeakのリアルタイムグラフです。


・Temperature1



・Temperature2



・同時表示



・Matlab Visualizationによるカスタムグラフ





まとめてみたい場合は以下のリンクをクリックしてください。
スーパーサボテンタイムのバルコニーとフレームの温度グラフ | Temperature with DS18B20_ESP8266 – ThingSpeak



赤い線(フレームの温度)が青い線(バルコニーの温度)より高いですね。


というわけで、なかなかいいものができたのではないでしょうか!
いつの日か、照度と湿度も付けたいですね。


というわけで、これで掃除が捗ります!



以下参考文献です。
読んでいただきありがとうございます!実はブログランキングに参加しておりますので、ぜひ下のボタンをワンクリックお願い致しますっす!
にほんブログ村 花・園芸ブログ サボテンへ
にほんブログ村

スーパーサボテンタイム管理者

2013年に知人宅にあった金鯱の美しさに一目惚れして、サボテン栽培を開始する。栽培場所はベランダとルーフバルコニー。好きなサボテンは海王丸。

シェアする

フォローする