Arduino制御紫外線除菌器作成
こんにちは、くろべこです。
今回は紫外線除菌器の完成編になります。
前回は机上でブレッドボードを使用したデバックを行いました。そのプログラム/電気回路から一部変更になりましたので変更点も含めて解説をしていきたいと思います。
紫外線除菌器電気回路(前回から一部変更)
■変更点
- 紫外線ランプON/OFFリレーを2個⇒1個
- メインスイッチ追加
- pin配変更
紫外線除菌器制御Arduinoプログラム
次はArduinoプログラムですね。基本的にはデバック時のプログラムからほとんど変えていません。大きく変わったところは、デバック時は紫外線ランプの代わりに青色LEDを使用していましたが、本番のコードからは削除しています。他はこまごまとしたpin配の調整などですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
#include <Arduino.h> #include <TM1637Display.h> // digitalPin定義 #define Relay1 2 #define SW 4 #define offLED 5 #define onLED 6 #define mainSW 8 #define buzzer 9 #define CLK 11 #define DIO 10 // digitalPin定義 #define Dsensor 1 #define volume 3 //閾値定義 #define door 300 static uint32_t analog=0;//volume読み取り値 bool mSW=1;//メインスイッチ ON:0,OFF:1 bool sw=1;//起動スイッチ ON:0,OFF:1 bool flag=0;//起動スイッチ検知フラグ uint8_t state=0;//メインループ条件分岐 uint32_t cnt1, cnt2;//タイマー設定用 uint32_t cnt3, cnt4;//カウントダウン用 static uint16_t sense;//ドア検知センサ読み取り値 TM1637Display display(CLK, DIO); void setup() { pinMode(SW, INPUT); pinMode(mainSW, INPUT); pinMode(Relay1, OUTPUT); pinMode(offLED, OUTPUT); pinMode(onLED, OUTPUT); pinMode(buzzer, OUTPUT); Serial.begin(9600); display.clear(); } //紫外線照射時間設定関数 void analogConfig(){ analog=0; for(int i=0;i<100;i++){ analog+=analogRead(volume); } analog/=100; analog=map(analog,0,1023,0,600); display.showNumberDec(analog, false); display.setBrightness(1, true); // Turn on } //起動スイッチ読み取り関数 void swRead(){ sw=digitalRead(SW); if(sw>0){ flag=0; cnt1=millis(); }else if(sw<1){ flag=1; } //sw長押しカウント if(flag>0){ cnt2=millis()-cnt1; Serial.println(cnt2); Serial.println(sense); if(sense>door){ cnt1=millis(); } } if(cnt2>3000){ Serial.println("カウントアップ"); cnt2=0; state=1; } } /* * 状態スイッチ関数 * 1:UVC照射停止 * 2:UVC照射中 * 3:照射終了報知 */ void ledState(uint8_t led){ bool ledFlag=0; bool loopFlag=1; uint32_t cnt=0; uint8_t t=0; switch(led){ case 1: digitalWrite(offLED, HIGH); digitalWrite(onLED, LOW); break; case 2: digitalWrite(offLED, LOW); digitalWrite(onLED, HIGH); break; case 3: cnt=millis(); while(loopFlag){ if(ledFlag>0){ digitalWrite(onLED, HIGH); digitalWrite(offLED, LOW); tone(buzzer, 3000, 50); if((millis()-cnt)>500){ ledFlag=0; cnt=millis(); t++; } }else{ digitalWrite(onLED, LOW); digitalWrite(offLED, HIGH); tone(buzzer, 0, 500); if((millis()-cnt)>500){ ledFlag=1; cnt=millis(); t++; } } if(t>10){ loopFlag=0; t=0; } } break; } } //紫外線照射時間カウントダウン void countDown(){ cnt4=millis()-cnt3; if(cnt4>1000){ analog--; display.showNumberDec(analog, false); display.setBrightness(1, true); // Turn on cnt3=millis(); } if(analog<1|sense>door){ state=3; } } //メインループ void loop() { //メインスイッチ常時監視 mSW=digitalRead(mainSW); while(mSW){ digitalWrite(offLED, LOW); digitalWrite(onLED, LOW); digitalWrite(buzzer, LOW); display.clear(); display.setBrightness(1, false); // Turn off mSW=digitalRead(mainSW); } //扉開閉常時監視 sense=analogRead(Dsensor); switch(state){ case 0://タイマー設定(待機) ledState(1); analogConfig(); swRead(); Serial.println("STATE①"); break; case 1://UVCランプ照射(LED状態:緑) digitalWrite(Relay1, HIGH); ledState(2); cnt3=millis(); state=2; Serial.println("STATE②"); break; case 2://タイマー減算カウント countDown(); Serial.println("STATE③"); break; case 3://カウントアップ(UVC照射停止) digitalWrite(Relay1, LOW); state=4; Serial.println("STATE④"); break; case 4://照射停止報知(3secブザー, LED点滅) ledState(3); state=5; break; case 5://LED状態:赤 ledState(1); state=0; break; } } |
ここまでが、前回からの変更点になります。次項からは実際の製作編という事で電子回路と紫外線ランプを収める箱を加工していきますね。
紫外線除菌器の筐体加工
紫外線ランプと電子回路を収める筐体は身近で購入できるようにホームセンターで購入できるようなものを選定しました。同じようなものなら何でもいいのですが、私はカインズホームで購入できる【スタックボックス キャリコ(S) シンプルホワイト】を選定しました。これがちょうどいいサイズで、今回使用する6Wの紫外線ランプを収めるにはぴったりのサイズなんですね。
では、このスタックボックスに電子部品を取り付けるように穴加工などを施しましょう。
■天板
天板は操作パネルのような形で機器を配置しましょう。配置の仕方はお好みでどうぞですが、穴寸法と紫外線ランプを取り付ける位置だけ気を付けましょう。かくいう私も紫外線ランプの取り付け位置をミスって天板を一枚ダメにしてしましました。。。
■裏面
裏面は紫外線ランプ用のACケーブルと、ON・OFF用のリレー用の穴を空けましょう。
(注意)AC100V剥き出しは非常に危険なのでリレーを保護するカバーは必須です。
■前面
前面には蓋検知用のセンサ用の切り欠きを作りましょう。穴径は現物合わせで構いません。
紫外線除菌器配線
配線はセンスです。私は正直センスが無いのでかなりぐちゃぐちゃになっているのであまり参考にはできませんが、何点かポイントを書いてみます。
POINT
- 信号線はツイストペアケーブルにする(ノイズ対策)
- 配線はループにしたり、ゆとりを持たせる(断線対策)
- ホットボンドで配線固定(見た目)
見た目をきれいにするように必要に応じて配線の経路に穴加工を施し、要所要所でホットボンドで固定しました。
あまり参考にはなりませんが、ケーブルを結束バンドでくくると見た目がすっきりします。結束バンドでくくるときはゆとりを持たせて締めるとよいです。
配線が長い場合はループにして結束バンドで括ったり、、、
プログラム書き込みと動作確認
筐体加工と配線が完了しましたらプログラムを書き込んでみましょう。この時はまだ紫外線ランプのACケーブルを接続しないでください。
まずは以下の確認ポイントを一つずつチェックしてみてください。
確認項目
- メインスイッチOFF時はすべての機器は消灯しているか
- メインスイッチONで停止LED, 表示機が点灯するか
- 可変抵抗で設定時間の調整が出来るか
- ボタン長押しでリレーをONできるか
- 蓋を開けた状態では起動しない事
- 紫外線照射開始で起動LEDが点灯するか
- 紫外線照射完了でLEDの交互点灯/ブザー発報されるか
すべて確認できましたらACケーブルを差し込み実際に動作確認をしてみましょう。
うまくいけば以下の動画のように紫外線線の照射時間をコントロールできているはずです。
追加予定
これで完成と言いたいところですが【リレー用のカバー取り付け】【内部にアルミホイル貼り付け】が残っています。アルミホイルの貼り付けについては任意ですが、リレー用のカバーについては実際に運用していくうえで必須です。もしも端子部分に触れてしまったら感電してしまいますからね。
では、今回はこんなところで失礼します!
コメント