前回の運転開始でようやく気付いた、Deep Sleepからの復帰時間によって設定時間内モードへの移行が最大1時間ズレる問題を修正しました。RTCを付けているのでアラーム発報からの復帰が簡単ですが、RTCのアラーム時間と設定開始時間の両方を同じ値にしないといけないですね。とりあえずそれは置いておいて、折角覚えたif文を使った時間判定で行こうと思います。
あと、運転開始後、日によっては27℃でファンが起動しても温度が下がらず、30℃位まで箱内温度が上昇してしまうことがありました。熱の制御をするのに、計算はしてこなかったので、簡単に計算してみました。してはみましたが、かなり怪しい、というか実態とかけ離れた結果なので、どこか間違っていると思います。詳しい方ご指摘頂けるとありがたいです。
復帰時間設定
夜間を想定した設定時間外では、12秒の起動中に温度測定、データ送信を行い、その後1時間-12秒のDeep Sleepに入ります。起動時間+Deep Sleep = interval(1時間 = 60分)とすることで、1時間に1回測定を行います。
翌日の設定時間内に入る直前の測定では、タイミングによってDeep Sleepの時間が設定時間内にずれ込む為、設定開始時間に設定時間内モードへ移行できない状態となっていました。
この現象の解消は、設定時間外のDeep Sleep時間の決定をif文を使った場合分けで行うことが出来そうです。millis()で起動時間からカウントする方法もいけそうですが、今回はRTCの現在時間を使って組んでみます。
・設定開始時間の時(hour)と最終時間外測定時間の時(hour)が同じ場合

上の図の例だと、設定開始時間が10時45分、最後の設定時間外測定時間が10時0分です。どちらも10時台なので、時(hour)が同じパターンです。設定時間外の測定間隔(interval)を1時間としているので、このパターンでは必ず、
$$ 開始設定時間の分(minute)> 最後の設定時間外測定時間の分(minute)$$
となります。上の例だと開始設定時間の分が45分、最終の設定時間外測定時間の分が0分です。最後のDeep Sleep時間(SLEEP1)は、開始設定時間の分(minute)と最終の設定時間外測定時間の分(minute)との差から時間外測定時間(12秒)を引くことで求めることができます。
・設定開始時間の時(hour)と最終時間外測定時間の時(hour)の差が1
+ 設定開始時間の分(minute)< 最終設定時間外測定時間の分(minute)の場合

設定開始時間と最後の設定時間外測定の時(hour)の差が1の場合、インターバルは1時間(60分)である為、最後の設定時間外測定の分(minute)は設定開始時間の分(minute)よりも大きくなります。上の図の例では、設定開始時間の分は45分、最後の設定時間外測定の分(minute)は50分です。
この場合、必要なDeep Sleep時間(SLEEP2)は、インターバル(60分)から、最後の設定時間外測定の分(minute)と設定開始時間の分(minute)の差を引いて、さらに時間外測定時間(12秒)を引くことで求めることが出来ます。
設定開始時間と最後の設定時間外測定の時(hour)の差が1でも、最後の設定時間外測定の分(minute)が設定開始時間の分(minute)よりも小さくなる場合は、インターバル(60分)を確保出来る為、考慮は不要です。

・それ以外
上二つのパターン以外のDeep Sleep時間(SLEEP3)は、インターバル(60分)から時間外測定時間の12秒を引くことで計算できます。
スケッチ
上の検討から、インターバルを60分とした場合、Deep Sleepの時間を決めるパターンは以下の三つになりますね。
1.設定開始時間の時(hour)と最終時間外測定時間の時(hour)が同じ場合
2.設定開始時間の時(hour)と最終時間外測定時間の時(hour)の差が1 +
設定開始時間の分(minute)< 最終設定時間外測定時間の分(minute)の場合
3.上記1,2の状況以外
if文での判定は、この順番で行います。1の場合は1の計算式(SLEEP1)、1ではなく2の場合は2の計算式(SLEEP2)、それ以外は全て3の計算式(SLEEP3)という流れです。
設定時間外のDeep Sleep計算(SLEEP1,2,3)判定部分を抜き出すと下のような感じです。
#include <DFRobot_SD3031.h>
#include <Wire.h>
DFRobot_SD3031 rtc;
//略(他パラメータ設定)
const byte hourStart = 8; //Set start time in hour
const byte minuteStart = 10; //Set start time in minute
const byte hourEnd = 15; //Set End time in hour
const byte minuteEnd = 50; //Set End time in minute
const byte secondStart = 0; // fixed 0
const byte secondEnd = 0; // fixed 0
const byte interval = 60; //in minutes
void setup() {
//略
}
void loop() {
//略(時間判定、設定時間内処理、設定時間外処理)
if (hourStart == sTime.hour){
unsigned long SLEEP1 = ((minuteStart*60 + secondStart) - ((sTime.minute*60 + sTime.second) + 2 + 10)) *1000*1000;
delay(10000);
esp_deep_sleep(SLEEP1);
} else if (hourStart - sTime.hour == 1 && minuteStart <= sTime.minute){
unsigned long SLEEP2 = (interval*60 - ((sTime.minute*60+sTime.second)-(minuteStart*60+secondStart)) - 2 + 10) *1000*1000;
delay(10000);
esp_deep_sleep(SLEEP2);
} else {
unsigned long SLEEP3 = (interval*60 - (2 + 10)) *1000*1000;
delay(10000);
esp_deep_sleep(SLEEP3);
}
}
sTime.hour()でRTC現在時刻の時(hour)、sTime.minute()でRTC現在時刻の分(minute)を読み出します。
これでとりあえずいいかな。ただ、インターバルを60分以上取ろうと思うとこれじゃあダメですね。全部秒に換算すればいいんだけど。。。
熱計算
育苗箱は当然屋外に静置するわけで、様々な環境要因で箱の状態は変化します。その為、いくつかの因子を無視することになります。
一つは、育苗箱は外壁で接触する大気との熱交換をしないとする、ことです。実際は育苗箱は屋外にあって風を受けるので、空冷エンジン状態です。しかも風の有無、当たる風の温度、速度で熱交換の効率は大きく変動しそうです。ただ、一番温度が高くなる状態を回避することが育苗箱ベンチレータの目的なので、無風状態を想定し、大気と育苗箱は断熱状態にあると仮定します、、、(強引。。。)
もう一つは、給気ファンで導入した外気は、瞬時に育苗箱内で攪拌されて均一となる、ことです。実際は育苗箱内に空気の攪拌装置は無いので、給気された外気は対流、拡散で育苗箱内の空気と混合していきます。大いに局在化し、温度勾配が付いているでしょう。しかしこれも無視です。
あと、湿度の影響も無視です。計算する温度範囲は25~27℃と狭いため、湿度が少々変動しても大きな影響は出ないでしょう。(それぞれの温度、湿度での空気の比熱を確認しては無いけど。。。)
あとあと、育苗箱内のポットの熱容量、体積は無視です。熱容量はポットと育苗箱内の空気との熱交換には時間がかかることと、体積は計算が面倒になるからです。(”面倒”は理由なのか。。。)
これらを踏まえて計算してみましょう。目的は、給気ファンの風量が適切か、です。
・太陽光の影響がない場合
まずは空気の入れ替えだけで考えてみます。育苗箱の体積をV (m3)、育苗箱内の空気の温度を27℃とします。これに15℃の外気を入れて、育苗箱内の空気の温度を25℃へ降下させることとします。
図にするとこんな感じ。給気する外気の体積はVf (m3)、Vfは風量f (m3/min)と給気時間 t (min)との積になります。

これを25℃になるまでどれくらいの時間給気が必要か、という問題になります。考えやすいように下のように単純化します。

育苗箱内に15℃の外気Vf (m3)を入れ、同じ体積の27℃箱内空気が外部に出ます。元々の27℃箱内空気は残りのV1 (m3)です。育苗箱の体積はV (m3)であるので、体積の関係は以下のようになります。
$$ V = V_{1} + V_{f} $$
変形して、
$$ V_{1} = V \ – \ V_{f} \qquad (1) $$
ここから熱の計算です。V1(m3)分の箱内空気が27℃から25℃へ冷却され、熱量Qを失います。この熱量Qを得て給気された外気Vf(m3)は15℃から25℃へ温度上昇します。空気の密度をd、比熱をcpとすると、
$$ Q = V_{1} \times d \times c_{p} \times (27-25) = V_{f} \times d \times c_{p} \times (25-15) $$
整理すると、
$$ 2V_{1} = 10V_{f}$$
式(1)のV1を代入すると
$$ 2 (V \ – \ V_{f}) = 10V_{f} $$
整理すると、
$$ V_{f} = \frac{1}{6} V \qquad (2) $$
次に箱外へ押し出される空気について考えます。押し出される空気量は給気される外気量と同じなので、Vfとなります。押し出される空気の組成は、最終的に
$$ 箱内空気 : 外気 = V_{1}: V_{f} $$
となります。押し出される空気(Vf)中の箱内空気の体積をV1‘、外気の体積をVf‘とすると、
$$ V_{f} = V_{1}’ + V_{f}’ \qquad (3) $$
V1‘、Vf‘は組成からそれぞれ、
$$ V_{1}’ = \cfrac{V_{1}}{V_{1} + V_{f}} \times V_{f} \qquad(4) $$
$$ V_{f}’ = \cfrac{V_{f}}{V_{1} + V_{f}} \times V_{f} \qquad(5) $$
となります。式(3)にそれぞれ代入すると、
$$ V_{f} = \cfrac{V_{1}}{V_{1} + V_{f}} \times V_{f} + \cfrac{V_{f}}{V_{1} + V_{f}} \times V_{f} \qquad (6) $$
ところで、給気される外気量=押し出される空気量、であるので、給気の風量をf(m3/min)、給気する時間をtとすると、
$$ V_{f} = f \times t $$
これを押し出される箱内空気の体積を表現する式(4)へ代入すると、
$$ V_{1}’ = \cfrac{V_{1}}{V_{1} + V_{f}} \times f \times t \qquad(7) $$
追い出される箱内空気の体積がVfに到達するまでの時間は、式(7)のV1‘がVfとなる時間です。その時間をtfとすると、式(7)は
$$ V_{f} = \cfrac{V_{1}}{V_{1} + V_{f}} \times f \times t_{f} $$
これを整理すると、
$$ t_{f} = \cfrac{V_{f} (V_{1} + V_{f})}{V_{1}} \times \cfrac{1}{f} $$
ここで式(1)を代入すると、
$$ t_{f} = \cfrac{V_{f} (V \ – \ V_{f} + V_{f})}{V \ – \ V_{f}} \times \cfrac{1}{f} $$
整理すると
$$ t_{f} = \cfrac{V_{f} V}{V \ – \ V_{f}} \times \cfrac{1}{f} $$
式(2)より、であるので、Vfを代入して整理すると、
$$ t_{f} = \cfrac{1}{5} \ V \times \cfrac{1}{f} \qquad(8) $$
ここでVは育苗箱の体積(m3)、fは給気ファンの風量(m3/min)です。それぞれ、
V = 0.037 m3
f = 0.11 m3/min (スペック)
である為、これらの数字を式(8)へ代入すると、育苗箱が27℃になった時、風量0.11m3/minで15℃の外気を給気して育苗箱内温度を25℃へ変化させるのに必要な時間tf (min)は、以下のように求められます。
$$\begin{eqnarray} t_{f} &=& \cfrac{1}{5} \times 0.037 \times \cfrac{1}{0.11} \\
&=& 0.067 \end{eqnarray}$$
ん? 0.067min?
秒に直しても4秒?
うーん、こんなに早いかなあ。
給気された外気が瞬時に攪拌、均一化される、という仮定に無理があったか、押し出される空気の組成が最初から最後までV1 : Vfという仮定に無理があったか。5Vファンのスペックも怪しいですね。3cm四方の5Vファンが一分間に110Lも送気できるかな。元々ファンのスペック表には風量4.07cfmとあるんですよね。cfmはcubic feet per minuteらしいので、換算すると0.11m3/minです。実際は風量がそこまで出ていないので、実感とずれが大きいのかもしれません。
ちょっと怪しいですが、太陽光の影響を考慮しない場合、今回の計算からは風量0.11m3/minの5Vファンで十分な能力がある、という結果です。
とりあえずこのまま計算を続けることにしますが、ちょっと長くなりすぎてしまいましたので、一旦ここで区切ります。次回は太陽光の影響を考慮した場合の計算ですね。ちなみに、余計怪しい計算結果になっています。









コメントを残す