見出し画像

もんく [とある南端港街の住人になった人]

液面維持システム その9 強制給液ボタン追加など

せっかく書いた記事(と言っても短い)がArduinoのスケッチを
貼り付けたせいで消えてしまった。
いつも同じ事をしているはずなのに、なぜなんだ?

仕方ないのでこの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>
名前:
コメント:

※文字化け等の原因になりますので顔文字の投稿はお控えください。

コメント利用規約に同意の上コメント投稿を行ってください。

 

  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最新の画像もっと見る

最近の「ABCのAはArduinoのA」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事