文書の表示以前のリビジョンバックリンクPDF の出力全て展開する/折り畳むODT 出力文書の先頭へ この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。 ====== ミニ湿度スイッチ ====== ===== 概要 ===== 以前にも、湿度の値を表示する、簡易湿度計を製作しました。 今回は、単三電池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}} ===== ソースコード ===== <code c hygroSwitchV2.c> //********************************************************************** /* <湿度スイッチ> */ //********************************************************************** #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; } } } } //********************************************************************** </code> ===== 動作確認 ===== {{: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}} <callout type="warning" title="著作権表示 copyright notice"> このページは稲崎様の閉鎖した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]] </callout> elechobby/picdic/pic12f683/19.txt 最終更新: 2025/10/17 14:29by 127.0.0.1