以前にも、湿度の値を表示する、簡易湿度計を製作しました。
今回は、単三電池2本で動作する、湿度スイッチを製作しました。
湿度スイッチとは、
するものです。
これを応用すると、現湿度(閾値設定時の湿度)からの相対値によって、モーターやヒーター等をON/OFFする事が可能となります。
今回の仕組みは、大きく、湿度データの取り込みと湿度スイッチとしての制御で構成されます。
<湿度データの取り込み>
<湿度スイッチとしての制御>
<電源電圧>
PICのクロックを4MHzとし、単三電池2本(2V~3V)で駆動可能としました。
<閾値の保存>
閾値を毎回設定するのは、煩わしいので、PIC内臓のEEPROMへ保存し、起動時に自動で読み込みます。
//********************************************************************** /* <湿度スイッチ> */ //********************************************************************** #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; } } } } //**********************************************************************