====== ミニ湿度スイッチ ======
===== 概要 =====
以前にも、湿度の値を表示する、簡易湿度計を製作しました。
今回は、単三電池2本で動作する、湿度スイッチを製作しました。
湿度スイッチとは、
* 現時点の湿度を閾値として設定することにより、
* 動作モード(高)の場合、\\ 設定された閾値よりも湿度が高くなった場合にスイッチ(LED、リレーなど)をONしたり、
* 動作モード(低)の場合、\\ 設定された閾値よりも湿度が低くなった場合にスイッチ(LED、リレーなど)をONしたり、
するものです。
これを応用すると、現湿度(閾値設定時の湿度)からの相対値によって、モーターやヒーター等をON/OFFする事が可能となります。
===== 動作原理 =====
今回の仕組みは、大きく、湿度データの取り込みと湿度スイッチとしての制御で構成されます。
<湿度データの取り込み>
- PICのPWMモジュールで、約1kHzの信号を発生させる。
- その信号をボリュームで、約1Vp-pにし、オペアンプの反転回路に加える。
- オペアンプの反転回路のフィードバック部分に、温度センサー(HS-15P)を接続する。
- HS-15Pは、湿度が高くなると抵抗が低くなり、湿度が低くなると抵抗が高くなるため、
- 湿度の状況によって、反転回路の増幅率が変化することになります。
- 増幅された信号を、抵抗とコンデンサで平滑します。
- 滑された信号を、PICのA/D変換で値を取り込みます。
<湿度スイッチとしての制御>
- SW1を押下することにより、現在の湿度値を閾値として設定します。
- SW2がOFFの状態では、測定した湿度値が、閾値よりも低くなる(湿度が高い)とスイッチをONします。
- SW2がONの状態では、測定した湿度値が、閾値よりも高くなる(湿度が低い)とスイッチをONします。\\ ※スイッチのONとは、LEDやリレーを駆動させることを意味します。\\ ※閾値と比較する場合には、ヒステリシスを持たせ、制御が、バタツクのを防いでいます。
<電源電圧>
PICのクロックを4MHzとし、単三電池2本(2V~3V)で駆動可能としました。
<閾値の保存>
閾値を毎回設定するのは、煩わしいので、PIC内臓のEEPROMへ保存し、起動時に自動で読み込みます。
===== 回路図 =====
{{:imgpaste:202004:htmikan-20200429-104648.png}}
===== ソースコード =====
//**********************************************************************
/*
<湿度スイッチ>
*/
//**********************************************************************
#define LED GPIO.F5
#define SET_SW GPIO.F4
#define MODE_SW GPIO.F3
#define ON 1
#define OFF 0
#define UPPER 1
#define LOWER 0
//**********************************************************************
void Pwm_Change_DutyEx(unsigned int duty_ratio)
{
CCPR1L = duty_ratio >> 2;
CCP1CON.F6 = duty_ratio & 0b00000001;
CCP1CON.F7 = (duty_ratio & 0b00000010) >> 1;
}
//**********************************************************************
void main()
{
static unsigned short cnt;
static unsigned int ad, threshold;
//
OSCCON = 0b01100000; // クロックは4Mhz
CMCON0 = 0b00000111; // コンパレータは使用しない。
ANSEL = 0b00000001; // A/D変換を使用する。
TRISIO = 0b00011011;
//
Pwm_Init(1000);
Pwm_Change_DutyEx((PR2 * 4) / 2);
Pwm_Start();
// 保存されている閾値の取り込み
threshold = Eeprom_Read(1);
threshold = threshold << 8;
threshold = threshold | Eeprom_Read(0);
//
while (1) {
ad = 0;
for (cnt = 0; cnt < 50; cnt++) {
ad += Adc_read(0);
}
ad = ad / 50;
//
if (SET_SW == 0) {
threshold = ad;
// 閾値の保存
Eeprom_Write(0, (threshold & 0xFF));
Delay_ms(20);
Eeprom_Write(1, ((threshold >> 8) & 0xFF));
Delay_ms(20);
}
//
if (MODE_SW == UPPER) {
if ((threshold + 5) > ad) { //閾値よりも湿度が高い時にLED→ON
LED = ON;
} else {
LED = OFF;
}
} else {
if ((threshold - 5) < ad) { //閾値よりも湿度が低い時にLED→ON
LED = ON;
} else {
LED = OFF;
}
}
}
}
//**********************************************************************
===== 動作確認 =====
{{:imgpaste:202004:htmikan-20200429-104742.png?500}}
左側:オペアンプ(LM358)
右側:PIC12F683
{{:imgpaste:202004:htmikan-20200429-104803.png?500}}
左側:湿度センサー(HS-15P)
右側:単三電池2本
{{:imgpaste:202004:htmikan-20200429-104827.png}}{{:imgpaste:202004:htmikan-20200429-104835.png}}
湿度スイッチがOFFの状態
{{:imgpaste:202004:htmikan-20200429-104853.png?500}}
湿度が閾値よりも高くなったため、湿度スイッチがONになった状態
{{:imgpaste:202004:htmikan-20200429-104914.png?500}}
湿度が閾値よりも低くなったため、湿度スイッチがONになった状態
{{:imgpaste:202004:htmikan-20200429-105007.png?500}}
(編者注:おそらくOFFになった写真を載せたかったらしいのですが、ONの写真が2個並んでいました)
如何ですか?
これを応用すると、例えば、屋外の湿度が低いとき(乾燥状態)に、家の床下に設置した床下ファンを回して、空気を循環させることにより、床下乾燥(シロアリ駆除等)に役立てることが出来ます。
<床下ファンの例>
{{:imgpaste:202004:htmikan-20200429-105134.png}}
このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。[[elechobby:picdic:picdic|詳細]]
This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.[[elechobby:picdic:picdic|Details]]