今回は熱中症になる危険度を知らせしてくれるシステムを作ります。
夏の暑さが尋常じゃなくなった近年、家の中でも熱中症で倒れてしまうことがあります。そして、危険な状態なのに甘く見て、節約のため、地球環境のためにクーラーをつけずに倒れる、なんてことも発生しています。
作成する熱中症危険度お知らせシステムでは、ぱっと見でわかるようにしたいと考えました。そこで、小型ですが旗揚げシステムにすることにしました。旗が一番上まで来ていると危険ということです。また、熱中症は気温と湿度の両方が関係するので、温湿度センサを使用し判定します。
完成した熱中症危険度お知らせ旗揚げシステムの写真を以下に示します。動作動画は本ページの最後に掲載します。
回路図およびプログラムに関する各種詳細は、以下の記事を参考にしてください。
1.今回使用するPICについて
今回使用するPICは「PIC12F1822」です。
2.回路
2.1 電子回路図
2.2 電子回路の写真
2.3 回路説明
2.3.1 今回使用するパーツ一覧
パーツ名 | 説明 | 数 |
---|---|---|
PIC12F1822 | PIC本体 | 1 |
ソケット | PICをつけるソケット | 1 |
コンデンサ(0.1[μF]) | バイパスコンデンサ | 2 |
温湿度センサ(DHT11) | 温度と湿度を取得するセンサ | 1 |
リードスイッチ(MKA-10110) | 旗の上限と下限を判断するため | 2 |
磁石 | リードスイッチの制御用 | 1 |
ラジコンサーボ(SG90) | 旗の昇降 | 1 |
ユニバーサルアーム | 旗のポール | 1 |
プーリ | サーボの回転を旗の昇降に変換 | 1 |
注:今回、PICとサーボを同じ電源で使用するため、念のためにバイパスコンデンサ(ウィキペディア)を入れています。
2.3.2 PICの配線
PIC | 接続先 | 補足 |
---|---|---|
VDD | 電源 | 5[V] |
RA0 | リードスイッチ(MKA-10110) | 旗の上限判断用 |
RA1 | リードスイッチ(MKA-10110) | 旗の下限判断用 |
RA2 | -未使用- | |
RA3 | -未使用- | |
RA4 | 温湿度センサ(DHT11) | 温度と湿度を取得 |
RA5 | ラジコンサーボ(SG90) | 旗の昇降用 |
VSS | グランド |
2.3.3 回路の構造
温湿度センサから受け取った温度と湿度から熱中症になる危険度を判定します。その危険度によりラジコンサーボの回転量を判定し旗の昇降を行います。本来ラジコンサーボは連続回転(通常の回転)できません。そこで以前行った連続回転を行う改造を行います。
旗が上限または下限に到達した際、すぐに回転を止めないといけません。そこで上限と下限にセンサを取り付け判定を行います。最初は接触センサを使用したのですが、構造上しっかりと押すことができず(プーリが滑ってしまう)うまくいきませんでした。そこで押す必要のない非接触センサであるリードスイッチを使用しました。旗と一緒に磁石をつけておくことで、上限と下限を判定することができるようになりました。
RA0につながっているリードスイッチが反応すると上限に到達、RA1につながっているリードスイッチが反応すると下限に到達となります。補足ですが、RA0とRA1はプルアップしているため、通常はハイになっています。リードスイッチが反応するとローになります。
3.プログラム
プログラムの基本的な部分は以下の記事を参考にしてください。
3.1 プログラムの説明
プログラムを見ながら以下の説明を見てください。ソースコードは次の節にあるので、そちらを参照してください。
3.1.1 ラジコンサーボの調整値の設定
#define SERVO_STOP_N 3180 // サーボの停止PLS値(下降時の基準) #define SERVO_STOP_P 3100 // サーボの停止PLS値(上昇時の基準)
ラジコンサーボを回転するように改造しました。そこで正転と逆転を行う際、ほぼ同じ速度で動作を行うようにここの数値で調整しています。ラジコンサーボによりここの値は変わるので、必要に応じて調整してください。
3.1.2 サーボの制御処理
void interrupt isr_ctrl( void ) { // タイマ1割り込み処理 if( TMR1IF ) { if( next != 0 ) SERVO_IO = SERVO_IO_ON; // コンペアマッチの時間を設定 CCPR1 = next; // タイマ1のカウンタを初期化 TMR1 = TMR1_OFFSET; TMR1IF = 0; } // CCP1割り込み処理 if( CCP1IF ) { SERVO_IO = SERVO_IO_OFF; CCP1IF = 0; } }
サーボの制御をするための割り込み処理です。
3.1.3 PICの初期設定
char aaa = 0; short level = 0,old_level = 0; short move = 0,wait; OSCCON = 0b01110000 ; // 内部クロック8MHz OPTION_REG = 0b00000000 ;// 7bit目が0でプルアップ抵抗が有効 ANSELA = 0b00000000 ; // すべてデジタルI/Oに割当てる TRISA = 0b00011011 ; // RA0,1,3,4を入力,他を出力に設定 PORTA = 0b00000000 ; // 出力ピンの初期化(全てLOWにする) WPUA = 0b00010011 ; // RA0,1,4をプルアップ抵抗に設定 CCP1CON = 0b00001010 ; // コンペアモード T1CON = 0b00100100 ; // 分周1/4 クロック同期有効 TMR1 = TMR1_OFFSET; TMR1IE = 1; // タイマ1割り込み有効 CCP1IE = 1; // コンペアマッチ割り込み有効 TMR1ON = 1; // タイマ1 開始 // 初期設定 next = 0; TRISA |= DHT11_IO; TMR1IF = 0; CCP1IF = 0; PEIE = 1; GIE = 1; // 全割り込み有効
各種初期設定です。
3.1.4 温湿度センサの稼働待ち
// 温度/湿度センサの稼働待ち __delay_ms(1000);
温湿度センサが稼働するまでの待ち時間です。
3.1.5 起動時に旗を降ろす
// 電源ON時、下限移動 for(;;) { if( LOWER_LIMIT_IO == 0 ) { // 停止指示 next = 0; break; } else { // 下降指示 next = TMR1_OFFSET + SERVO_STOP_N + 50; } __delay_ms(100); }
起動直後に旗を降ろします。下限のリードスイッチが反応するまでサーボを回し続けます。
3.1.6 温湿度センサの処理:138行目(206 ~ 270行目)
get_dht11();
温湿度センサから温度と湿度を取得します。取得方法は「温度・湿度センサ」を参考にしてください。
3.1.7 温度と湿度から危険度計算:140行目(273 ~ 456行目)
level = get_level( temperature, humidity);
温度と湿度から熱中症の危険度を求めます。(熱中症の危険度の温度と湿度は厚生労働省の資料を参考にしました)
3.1.8 旗の制御量計算
if( level != old_level ) { move = level - old_level; if( move < 0 ) wait = move*-1; else wait = move; // 移動時間作成 wait *= 13; }
取得した温度と湿度から算出した危険度のレベルにより旗の動作量を計算しています。危険度のレベルが高いほど上昇します。ラジコンサーボを止めるまでの待ち回数(動作量)であるwait変数に危険度のレベルに応じた値を設定します。
3.1.9 旗の制御
if( move < 0 ) { // 下降 while( wait > 0 ) { if( LOWER_LIMIT_IO == 0 ) { // 停止指示 next = 0; wait = 0; } else { // 下降指示 next = TMR1_OFFSET + SERVO_STOP_N + 50; } wait--; __delay_ms(100); } } else { // 上昇 while( wait > 0 ) { if( UPPER_LIMIT_IO == 0 ) { // 停止指示 next = 0; wait = 0; } else { // 上昇指示 next = TMR1_OFFSET + SERVO_STOP_P - 50; } wait--; __delay_ms(100); } }
上昇または下降が必要な場合、昇降を行います。リードスイッチが反応するか、指定された動作量を動作した場合に処理が完了します。動作量は「waitの回数 × 100ミリ秒」の時間になります。その時間の間ラジコンサーボを回転させます。
3.2 ソースコード
プログラムの全文を掲載します。
<注意>
ファイル名は必要に応じて変更し利用してください。
本サイトの注意事項を確認してください。
ソースコードや回路図などを使用する場合、上記注意とともに、自己責任でお願いします。
4.動作確認
- 電源を入れ約1秒後に旗が1番下に下降します
- 温度と湿度により必要に応じて旗が昇降します
- 約5秒毎に温度と湿度を取得し必要に応じて旗が昇降します
<更新履歴>
版 | 更新日 | 変更内容 |
1 | 2015年7月21日 | 新規作成 |
2 | 2015年7月23日 | バイパスコンデンサの容量を修正 0.01 -> 0.1[μF] |
3 | 2016年10月7日 | フォーマット変更 |