実験関連栽培環境構築関連

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

実験関連
スポンサーリンク

というわけで!


時代はIoT(Internet of Things)だそうです。
サボテン・多肉植物栽培もIoTの出番なのです!



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

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

とのことです。



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



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




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



・・・



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


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

サボテン用温室の温度・湿度・照度をリアルタイムで測定するぞ!
概要 マイコンでフレーム内の温度・湿度・照度をマイコンを用いてリアルタイムでロギングし、WEB上に表示させます。ちなみに、各日でプログラムを変えたり、センサの位置を移動したりしている関係で、それぞれの日、時間のデータを単純に比べることはでき...



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


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


そして屋外では、このコードに枯葉だの砂だのが絡みつき掃除はとても面倒、コード自体も紫外線や水分で痛み、まぁもって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



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


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


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



以下参考文献です。

コメント

タイトルとURLをコピーしました