UV除菌器のプログラム構築と机上デバック
こんにちは、くろべこです。
前回は、構想編という事でUV除菌器の仕様と必要材料の紹介を行いました。
今回はプログラム構築編という事で、Arduinoプログラムのコーディングとテスト環境をブレッドボード上で再現していきたいと思いますよ!
テスト環境を作るブレッドボードは比較的大きめなものがオススメですね。amazonで1000円ちょっとくらいで売っているので、1個持っていればだいぶデバックが捗ります。以前は80mm×50mm位のブレッドボードを使用ていましたが、特大サイズのを使用してからは使っていないですね。
テストプログラム
テストプログラムの紹介です。
紫外線ランプのACラインON/OFF用のリレーがまだ届いていないので、本テスト環境では使用できないですが、デジタルピンは割り当てて出力はできるようになっています。
また、紫外線ランプについてもブレッドボード上では扱えないので、青色LEDを仮として光らせるような内容となっています。
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 |
#include <Arduino.h> #include <TM1637Display.h> // LEDピン定義 #define CLK 11 #define DIO 10 #define Relay1 2 #define Relay2 3 #define SW 4 #define offLED 5 #define onLED 6 #define buzzer 9 #define SENSOR 0 #define door 700 static uint32_t analog=0; bool sw=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(Relay1, OUTPUT); pinMode(Relay2, OUTPUT); pinMode(offLED, OUTPUT); pinMode(onLED, OUTPUT); pinMode(buzzer, OUTPUT); ledState(1); Serial.begin(9600); display.clear(); } void analogConfig(){ analog=0; for(int i=0;i<100;i++){ analog+=analogRead(SENSOR); } 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() { //扉開閉常時監視 sense=analogRead(1); switch(state){ case 0://タイマー設定(待機) analogConfig(); swRead(); Serial.println("STATE①"); break; case 1://UVCランプ照射(LED状態:緑) digitalWrite(Relay1, HIGH); digitalWrite(Relay2, HIGH); ledState(2); cnt3=millis(); state=2; Serial.println("STATE②"); break; case 2://タイマー減算カウント countDown(); Serial.println("STATE③"); break; case 3://カウントアップ(UVC照射停止) digitalWrite(Relay1, LOW); digitalWrite(Relay2, LOW); state=4; Serial.println("STATE④"); break; case 4://照射停止報知(3secブザー, LED点滅) ledState(3); state=5; break; case 5://LED状態:赤 ledState(1); state=0; break; } } |
やたらと長くなっていますが、ちょっと解説。
まず、7セグメント表示機【TM1637】のライブラリを使用しています。そして、以下の機能を関数化して、その関数化したものをSwitch case分で条件分岐しているだけです。扉センサ(反射センサ)に関しては常時ポーリングで監視を行っています。
- アナログ読み取り&7セグタイマー表示(タイマー時間設定)
- デジタル読み取り&長押しカウント(起動スイッチ)
- LED状態分岐+ブザー機能も含む
- タイマーカウントダウン
あと、ブザーにこだわりがあります。このブザーは紫外線照射が完了したらお知らせするものなのですが音は3KHzに設定しています。
実は、人の耳というのは2kHz~4kHzが最も聞きやすいと言われています。なので間を取って3kHzとしているんですね~
テスト環境の紹介
テスト環境は冒頭でも話したようにブレッドボード上で構築しました。
ほぼ、実装時と同じ環境になる様に構築しています。
状態を表している緑/赤のLEDインジケータは以下のように状態を定義しています。
- 緑LED点灯:紫外線ランプ照射中
- 赤LED点灯:停止中
- 赤/緑交互点滅:紫外線照射タイマーカウントアップ。
動作テストを撮影してみました。イメージが付くと思いますのでご覧ください。
いかがでしょうか?起動スイッチがしょぼいですが、実際に実装する時はもう少し大きめのスイッチを使う予定です。
あとは、紫外線ランプとリレーモジュールが届けばパパっと作れそうな予感なのですが、心配なのが今回購入した紫外線ランプはおなじみの格安中華製なので日本のコンセントに入るかどうかドキドキです、、、
では、近いうちにまた会いましょー
コメント