貼り付けたせいで消えてしまった。
いつも同じ事をしているはずなのに、なぜなんだ?
仕方ないのでこのWebサービスを使わせていただいた。
ソースコード変換
本題に入ります。
ブログに乗せる頻度より更新の頻度が高くて前回と話がつながらないかもしれない。
あれから変えたところ。
1.強制給液ボタンを追加。
あると便利で手で溶剤を扱う必要が減る。
また何か問題が起きたときにこれが使えると咄嗟にリカバリできるかもしれない。
できないかもしれないが。
このボタンはNO(ノーマルOpen)。
リセットがでLED点滅サブルーチンに強制給液の動作を追加した。
リセットボタンと同時に強制ボタンを押していると給液する。
ボタンを離すと止まる。レベルセンサーでの停止はない。
その後に通常リセットと同じで待ち時間に入ると言う動作。
2.リセットスイッチはNC(ノーマルClose)にした。
機能的にはどっちでも良いけれど、
その方が誤動作が少なそうだから。
電池でやるわけでもないので消費電力を気にする事もないし。
3.リセットスイッチのチャタリング防止を止めた。
何か効かなそうだから。
割り込みのサブルーチンに時間管理関係の命令が入っていたので。
(他の人の例で見たので使っていたが...)
4.リセットスイッチは長押しでリセットになるようにした。
誤動作防止のため。
5.待ち時間の最後にLEDの鼓動が速くなるようにした。
作業する人がわかるように。
間違えたところ。
リセットした時にReset0のフラグを立てるが、
それをLEDの長点灯と強制給液のサブルーチンの最後のところで
キャンセルしなかったので
プログラムの2順目になると処理速度が2倍位になってしまった。
Reset0をキャンセルしておかないと余計なところに迷い込んでしまうのだった。
ノイズでArduinoが何か影響受けているか
壊れたかと思った。
どうしてわかったかと言うと以前に問題なかったスケッチを入れなおしたら
元に戻ったから。
//Timer setting
int TimeW = 1; //Waiting time in minutes (1 = 1min)
int TimeP = 120; //Max. pumping time to detect error (1 = 1sec)
//PUMP manual ON button is added (from Rev. 13)
//Push RESET first, then push PUMP button.
//Pumping starts. When button released, pump stops.
//---------no need to change-------------
//INPUT PIN number
int LVS = 2; //Level sensor pin number
int RSS = 3; //Reset switch number
int PUM = 8; //Pump (Relay) ON switch number (from Rev13)
//OUTPUT PIN number
int RUN = 4; //RUN indication LED
int ERR1 = 5; //ERROR indication LED1
int ERR2 = 6; //ERROR indication LED2
int Valve = 7; //Relay for air valve
//For interrupt (input)
volatile int Reset0 = LOW; //RSS switch initial status
int Reset = LOW; //Reset flug for main program
//For liquid level checking
int Level = LOW; //Valve initial status
//Anti-chattering function
volatile int bounceR = 100;
volatile int ctR;
volatile int ptR = 0;
void setup() {
//Debug only 1/9
//Serial.begin(9600);
//OUTPUT PIN
pinMode(RUN, OUTPUT); //RUN indication LED
pinMode(ERR1, OUTPUT); //ERROR indication LED1
pinMode(ERR2, OUTPUT); //ERROR indication LED2
pinMode(Valve, OUTPUT); //Relay for air valve
//INPUT PIN
pinMode(LVS, INPUT); //Low level is NC (Normal 0V)
pinMode(RSS, INPUT); //Switch is NC (Normal 0V)
pinMode(PUM, INPUT); //Switch is NO (Normal 5V)
//INTERRUPT
attachInterrupt(digitalPinToInterrupt(RSS), RESET, FALLING); //Switch is NC
}
void loop() {
//Debug only 2/9
//Serial.println("Start");
//Serial.print(" Reset=");
//Serial.println(Reset);
//Counting wating time to pump ON------------------
Reset = LOW; //Cancel reset flag to start
while(Reset == LOW) { //If Reset become 1, return to beginning
//Debug only 3/9
//Serial.println("Waiting start");
digitalWrite(Valve, LOW); //Valve close
digitalWrite(RUN, LOW); //RUN LED reset
digitalWrite(ERR1, LOW); //ERR1 LED reset
digitalWrite(ERR2, LOW); //ERR2 LED reset
int varW = 0;
while(varW < TimeW && Reset == LOW){ //time timer in min. If Reset pushed, stop waiting
int varW0 = 0;
while(varW0 <= 60 && Reset == LOW){ //1min timer. If Reset pushed, stop waiting
digitalWrite(RUN, HIGH); //Flash while waiting 0.5sec ON - 0.5sec OFF
delay(100);
digitalWrite(RUN, LOW);
delay(900);
if(Reset0 == HIGH){
RESFLASH(); //If Reset 3 LEDs Flash
}
varW0++;
}
varW++;
if(varW == TimeW && Reset == LOW){ //RUN LED flickering when time up
int flick = 0;
while(flick <= 10){
digitalWrite(RUN, HIGH);
delay(200);
digitalWrite(RUN, LOW);
delay(200);
flick++;
}
}
//Debug only 4/9
//Serial.print(varW);
//Serial.println("min");
}
//Start pumping------------------
//Debug only 5/9
//Serial.println("Pumping start");
//Serial.print("Level sensor =" );
//Serial.println(Level);
Level = 0; //Level initialize
int varP = 0; //Time initialize
int Lev0 = 0; //Level status1
int Lev1 = 0; //Level status2
int Lev2 = 0; //Level status3
int LStat = 0; //Total status
while(varP < TimeP && Level == 0 && Reset == LOW) { //Pumping when Low-level, Reset is LOW
Lev0 = digitalRead(LVS); //check liquid level HIGH or LOW
if(Lev0 == LOW){ //Liquid level High = LOW
LStat = 1;
delay(500);
Lev1 = digitalRead(LVS); //Chatering proof 2nd check
if(Lev1 == LOW){
LStat++;
}
delay(500);
Lev2 = digitalRead(LVS);
if(Lev2 == LOW){
LStat++;
}
if(LStat == 3 || Lev2 == HIGH){
Level = 1;
}
}else{
digitalWrite(Valve, HIGH); //Air valve OPEN
digitalWrite(RUN, HIGH); //RUN LED light
delay(1000);
}
if(Reset0 == HIGH){
RESFLASH(); //If Reset 3 LEDs Flash
}
varP++;
//Debug only 6/9
//Serial.println(varP);
//Serial.print("Level Sensor check = ");
//Serial.println(Level);
}
//Stop pumping-----------------------
//Debug only 7/9
//Serial.println("Stop pumping");
//Serial.print("Level Sensor = ");
//Serial.println(Level);
digitalWrite(Valve, LOW); //Pumping stop, reached on max time
digitalWrite(RUN, LOW); //RUN LED dark
delay(1000);
if(Level == 0 && Reset == LOW){
while(Reset == LOW){ //Error TimeUp, waiting for Manual RESET
digitalWrite(ERR1, HIGH); //LED1 ON-OFF
digitalWrite(ERR2, LOW); //LED2 ON-OFF
delay(500); //Waiting for RESET SWITCH
digitalWrite(ERR1, LOW);
digitalWrite(ERR2, HIGH);
delay(500);
if(Reset0 == HIGH){
RESFLASH(); //If Reset 3 LEDs Flash
}
//Debug only 8/9
//Serial.println("TimeUP");
}
digitalWrite(ERR1, LOW); //ERR LED1 Cancel
digitalWrite(ERR2, LOW); //ERR LED2 Cancel
//Debug only 9/9
//Serial.println("RESET");
}
} //If reset SW is ON, return to beginning
}
void RESET() { //Interrupt for RESET
Reset0 = HIGH; //When push RSS
}
void RESFLASH() { //RESET re-confirmation and Indication
int Reset1 = HIGH; //Switch is NC
int Reset2 = HIGH;
int Pump = LOW;
delay(1000);
Reset1 = digitalRead(RSS); //Long-push requred to confirm RESET
delay(1000);
Reset2 = digitalRead(RSS);
Pump = digitalRead(PUM); //Pump manual ON
while(Pump == HIGH){
digitalWrite(Valve, HIGH);
digitalWrite(RUN, HIGH);
Pump = digitalRead(PUM);
delay(500);
}
digitalWrite(Valve, LOW);
if(Reset1 == LOW && Reset2 == LOW){ //RESET indication
digitalWrite(ERR1, HIGH);
digitalWrite(ERR2, HIGH);
digitalWrite(RUN, HIGH);
delay(2000);
digitalWrite(ERR1, LOW);
digitalWrite(ERR2, LOW);
digitalWrite(RUN, LOW);
Reset = HIGH;
Reset0 = LOW; //RESET (1st signal) reset to initial
}
}
</code>