ソフトウェア
ポート †
PA2 ~リモコン出力
PB8 屋外SHT71 sck
PB9 屋外SHT71 data
PB10 室内SHT71 sck
PB11 室内SHT71 data
PD0 ~外気FAN電源
PD1 ~弱運転
PA2 USART TX
アルゴリズム †
室温を25度〜35度に収める。
実測結果から
外気を使う場合は15度くらいの温度差が必要。
エアコンの設定温度+2度くらいになる。
アルゴリズム
室温35度以上
エアコン27度設定
室温32度以上
エアコン30度設定。27度設定だった場合は変更しない。
室温26度以上
外気が25度以下、湿度80%以下なら外気を使う。
エアコン27度設定なら、エアコン30度設定にする。
室温26度以下
全OFF
状態を変更したら、5分間は他の状態に遷移しない。
25度以上の外気を使わないのは、冷えないから。
80%の湿度は室内の湿度が上がってしまうため。(雨天の判断)
初期状態はOFF
基本は、26〜32度の間で落ち着き、エアコンと外気の切替を行う。
状態遷移図で書くと以下のような感じ。
ラベルは、室内温度の条件、*が付いているのは外気の状態が悪い場合。
使いながら検証中。
改良メモ
消費電力の計算 †
vvp? (2011-11-08 (火) 01:55:37)
計算します。
339mA, 32.9W, 力率 97.8% @99.1V
ファンが、309mA, 30.2W, 力率98.4% @99.3V
外気がすごく低いときの対処 †
vvp? (2011-11-08 (火) 01:54:57)
多分必要。
2つあるファンの途中で室内の空気を取り込むと
外気の取り込みが減って、送風される空気の温度も上がって良い。
室内の空気を循環させようとしたら、そういう結果になった。
25-32での外気の条件で切り替わり過ぎる †
vvp? (2011-11-05 (土) 19:52:59)
ヒステリシス特性をつけました。
30からOUTには、24度、78%
OUTから30には、26度、82%
- vvp 2011-11-07 (月) 22:51:12
全OFFを26度に変更。
外気導入の湿度条件を室温の相対湿度40%での絶対湿度以下にする
ARMで真面目に計算すると大変なので、計算済みのデータをテーブルとして持ちます。
26度の絶対湿度は0.216497 kg/kgで、湿度40%なら 0.00865988 kg/kg。
これが湿度100%となるのは 11.68度。これ以下の温度は無条件でいい。
26〜32度での湿度40%での絶対湿度
{{26, 0.00865988}, {27, 0.00920506}, {28, 0.00978135}, {29,
0.0103904}, {30, 0.011034}, {31, 0.011714}, {32, 0.0124323}}
11〜26度での飽和水蒸気量
{{11, 0.00827493}, {12, 0.00884942}, {13, 0.00945936}, {14,
0.0101067}, {15, 0.0107935}, {16, 0.0115219}, {17, 0.0122941}, {18, 0.0131125}, {19, 0.0139796}, {20, 0.0148979}, {21, 0.0158704}, {22, 0.0168997}, {23, 0.017989}, {24, 0.0191415}, {25, 0.0203606}, {26, 0.0216497}}
32bit演算で、湿度は0.01%単位で、[0,10000]にしているので、
Log[2,10000] = 13.2877だから、使えるのは18.7123bit = 429497
26度の0.0216497が一番大きいので、1.98385*10^7まで掛けられる。
わかりやすく10^7にしておきます。32bit符号ありだと少し足りない。
これを前の値に掛けると、
X10[] = // 11度〜32度の飽和水蒸気量*10^7
{82749, 88494, 94594, 101067, 107935, 115219, 122941, 131125, 139796, \
148979, 158704, 168997, 179890, 191415, 203606, 216497, 230126, \
244534, 259760, 275850, 292850, 310808}
これに湿度をかけて、以下の値を超えなければOK
X04LIMIT[] =
{865987655, 920505639, 978134516, 1039040742, 1103400047, 1171398068, \
1243231047}
使えそうだけど、いまいちスマートな感じがしない。
グラフだと以下のようになる。
線形補間でいい?
(2168.91 + 67.7851 T1 - 2.66035 T1^2 - 135.508 T0 + 2.90415 T1 T0) /
(38.1406 - 0.91605 T1)
くらい。意外と面倒。
79.69374317525043 - 4.4308324298173245 T0 + 2.90415 Ti
でいいか。これだと、完全に平面への近似。
マイコン内部では、0.01単位で整数化してるので、それにあわせて
(1020080 - 567 Tout + 372 Tin) / 128
ビットはフルに使っていません。20bitです。
-4%〜+10%くらいの誤差なので、これくらいで良さそう。
- vvp 2011-11-09 (水) 00:45:18
そろそろ固定小数点も面倒なので、ソフト浮動小数点でも使おうか・・・。なんか負けた感じがしてイヤだけど。
プログラム †
基本システムにFreeRTOSを使っています。
FreeRTOSメモ。
タスクは便利だけど、スタックをたくさん使う。
スタックが足りないと、動かなくなる。
スタックオーバーフローは検出できるけど、それなりに面倒。
(CPUの性能により)あまり細かい時間は使えない。
今はタスクを使っているけど、コルーチンの方が効率かも。
ただし、コルーチン切り替えでスタックが保証されない。
並列動作にはブロック状態を考慮しないといけない。
タスク
2つのタスクを使っています。
- USART送信するタスク
- SHT71のデータを取得するタスク(結局、ほぼすべての処理)