画像をクリックすると拡大表示されます。(全部ではありません。)
拡大画像からはブラウザの「←戻る」ボタンで戻ってください。
私は趣味で富貴蘭を栽培していますが、鉢の乾き具合を監視出来るか実験してみました。
これは今のところ単なる実験で、うまくいったら実用化しようとかは特に考えていません。
入手したばかりのPIC12F1822で、とにかく何かを作ってみようとして、思いついたものです。
富貴蘭の用土(水苔)に2本の電極を挿します。
電極に電圧を加えると、湿っている時は電流が流れ易いはずです。
ただし、直流電圧を加えた場合、電極の表面の酸化や汚れの影響を受けるし、電極自体が電食で傷みます。
今回は電極間に1MHzの方形波を加えて、電流の流れ具合で灌水状態をチェックします。
上の図が電極の形状です。
この寸法に特に根拠があるわけではありません。
長さは使用するとき扱いやすい寸法に、ピッチはユニバーサル基板の3ピッチ分(2ピッチでは取り付け困難)としました。
材質は3mmのアルミ丸棒で、片方は水苔に突き刺す為に尖らせ、片方は取り付けの為のネジを切りました。
回路図をクリックすると拡大表示されます。
拡大図から本文に戻るにはブラウザの←戻る釦を使用してください。
電源は単三アルカリ電池4本を使用し、1年程度、連続使用出来る事を目標にしています。
PチャンネルMOSは電池の逆接続に対する保護回路です。
PIC12F1822は3.3V、8MHzで動作させています。
このCPUにはクロックを分周して端子から出力する回路が内蔵されているので、ピン3から1MHzの方形波を出力し、
電極に加えています。
もう一方の電極から受け取った電圧を半波整流し、OPアンプで増幅し、A/D変換します。
OPアンプは3.3Vで動作するレールtoレールのもので、秋月で扱っていました。
当初は、もっと大きなゲインを考えていたのですが、思ったより電流が流れる為、現在はゲイン2倍になっています。
結果により、3色のLEDを点滅させます。
水分が多ければ緑、乾くに従って黄、赤に変わります。
切り換えポイントを調整し、緑 → 緑と黄 → 黄 → 黄と赤 → 赤 のように5段階で区別出来ます。
OPアンプの半分は電池電圧のチェックに使用しています。
電池電圧が4V以下になると点滅周期を長くして、電池電圧低下を知らせると共に、消費電流を減らします。
MikroCは12F1822に対応したバージョンにアップしました。
出来上がったHexファイルをMPLABにインポートします。
当然MPLABも12F1822に対応したバージョンでなければなりません。
MPLABからICD2を使って書き込みます。
前回、12F1822用書き込みアダプタの記事をアップしてありますので参考にしてください。
PIC12F1822は書き込みパルス電圧9Vですが、ICD2の最低出力電圧は12Vとなっています。
従って電圧制限回路を付加してあります。
以下にソースファイルを示します。
///////////////////////////////////////////////
// 植木鉢水分センサー w_sensor.c //
// 2011/10/02 PIC12F1822 MikroC Ver4.60 //
///////////////////////////////////////////////
// CLOCK 8MHz
// Oscillator INTOSC, Watchdog controlled by SWDTEN bit, Power-up Timer ON,
// MCLR Pin OFF, Code Protection OFF, Data Protection OFF,
// Brown-out Reset ON, Clock Out OFF, Int/Ext Switchover OFF,
// Fail-safe Clock Monitor OFF, F-Memory Self W-protection OFF, Pll OFF
// Stack Of/Uf Reset ON, Brown-out Reset 1.9V, LVP OFF
typedef union{
int adw;
char adb[2];
}ADDATA;
int vout; //検出電圧
void ad_init(void){
ADCON0 = 0x9; //CH2,AD ON
ADCON1 = 0xd0; //右詰め、FOSC/16 No_Vref
}
void ad_conv(void){
ADDATA addata;
int i;
int buff;
long BUFF;
buff = 0;
BUFF = 0;
for(i = 0; i < 16; i++){
Delay_ms(5);
ADCON0.GO = 1;
while(ADCON0.GO);
addata.adb[0] = ADRESL;
addata.adb[1] = ADRESH;
buff += addata.adw;
}
buff = buff >> 4; //1/16
BUFF = 3300L * (long)buff / 1024L;
vout = (int)BUFF;
}
void output(void){
if(vout < 1000) PORTA.B5 = 0; //LED_R ON
else PORTA.B5 = 1;
if(vout > 700 && vout < 1800) PORTA.B1 = 0; //LED_Y ON
else PORTA.B1 = 1;
if(vout > 1500) PORTA.B0 = 0; //LED_GR ON
else PORTA.B0 = 1;
Delay_ms(250); //点灯時間
PORTA = 0x33; //消灯
}
void main(){
OSCCON = 0x72; //内部 8MHz
OPTION_REG = 0xcf; //
ANSELA = 0x4; //AN2
PORTA = 0x33; //LED OFF
TRISA = 0xc;
WPUA = 0; //PULL UP OFF
CLKRCON = 0xf3; //CLOCK OUT 1MHz
Delay_ms(100); //検出系の安定を待つ
ad_init();
ad_conv();
output();
if(!PORTA.B3) WDTCON = 0x19; //ウオッチドッグ8秒
else WDTCON = 0x15; //ウオッチドッグ2秒
asm SLEEP;
asm NOP;
}
CPUは起動後、初期化設定をし、1MHzの方形波を出力します。
回路が安定に動作するのを待ちます。(100mS)
検出電圧をA/D変換し、LEDを250mS点灯して消灯します。
電池電圧をチェックし、ウオッチドッグタイマーのタイムアップ時間を設定します。
ウオッチドッグタイマーをスタートしスリープします。
ウオッチドッグのタイムアップで動作を繰り返します。

実験はこれで完了ですが、実用は考えていません。
実用するには、センサー部をもっと小さく作って、防水加工しなければいけません。
長期間の使用で電極が腐食しないか、あるいは特性が変化しないか確認するひつようがあります。
周波数は1MHzで良いのかとか、植物に影響は出ないかとか、いろいろ確認する必要があります。
今回の1MHzは方形波ですので、電極は回路の直ぐ近くに取り付けなければなりません。
電極を離して単独に設置するために同軸ケーブルで信号を送受したりすると、反射の影響で誤動作するかもしれません。
信号を正弦波にすれば同軸ケーブルで回路と電極を離すことが可能ですが、回路が複雑になり、コストが上がります。
この内容は、灌水センサー以外にも使い道があると思います。