見出し画像

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

液面維持システム その5

昨日、Arduinoをアップデートして失敗し
結局元のバージョンに戻した。
それで確かにスケッチのアップロードは成功。

が、なぜか動きがダメ。
一体なぜなのか、と、いろいろ調べる。
あれっ、LEDの両端子が短絡している。
こっちのLEDもあっちのLEDも、
そして最後にはセンサーまで全部短絡していると判明。
どこかでハンダ付けを失敗しているのでは....???

1つ1つラインを外して見てみるが変わらず。
まさかと思い、基板上の関係無いはずの部分にテスターを当てる。
ここも短絡している!
なんだそりゃー?!
ハンダとも何の素子とも関係無いところがなぜ?

見た目は普通のユニバーサルPCBだが、
不良品なのか?
ちゃんとハンダ付け面にはドーナツがいくつもある。
わからん。
とりあえず全部短絡しているらしいが見た目はわからない。
中国製には時々こんなのがあるのか?
買い直さなければ。

それだけ買いに行くにも店は近くにない。
ここからPuduまではKLを抜けて行かないといけないので
ちょっと大変。

と言う事で、仕方なく以前に買った小さなユニバーサル基盤を使うことにした。
しかし半分程度の大きさなので面積が足りない。
なので2つ繋げて使う事にした。


写真左の黄色いLEDはダミーの負荷。
本来はここにエア用のソレノイドバルブ(200V仕様)が付く。


スケッチも少し改良。
1.リセットスイッチを押した時に3つのLEDが点灯して押した事がわかるようにした。
2.液面センサーのチャタリングを検知するようにした。
 最初に液面がセンサーのレベルまで来たら0.5秒毎にあと2回検出。
 3回ともONか、1回目と3回目がONとなっていたら液がそこにあるとした。

テストでは何となく思い通りに動いている感じがする。
(本当か?)

スケッチは以下。
(誰か間違っていると思ったら教えて下さい。)




//Timer setting
int TimeW = 1; //Waiting time in minutes (1 = 1min)本番は10分にする予定。
int TimeP = 120; //Max. pumping time to detect error (1 = 1sec)


//---------no need to change-------------

//INPUT PIN number
int LVS = 2; //Level sensor pin number
int RSS = 3; //Reset switch number

//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 Reset = LOW; //RSS switch initial status

//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
//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_PULLUP);
pinMode(RSS, INPUT_PULLUP);

//INTERRUPT
attachInterrupt(digitalPinToInterrupt(RSS), RESET, RISING);

//Level sensor Normal-ON type

}

void loop() {

//Debug only
//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
//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
delay(1000);
varW0++;
}
varW++;

//Debug only
//Serial.print(varW);
//Serial.println("min");
}

//Start pumping------------------

//Debug only
//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 == HIGH){
LStat = 1;
delay(500);
Lev1 = digitalRead(LVS);
if(Lev1 == HIGH){
LStat++;
}
delay(500);
Lev2 = digitalRead(LVS);
if(Lev2 == HIGH){
LStat++;
}
if(LStat == 3 || Lev2 == HIGH){
Level = 1;
}
}else{
digitalWrite(Valve, HIGH); //Air valve OPEN
digitalWrite(RUN, HIGH); //RUN LED light
LStat = 0; //LStat reset
delay(1000);
}

varP++;

//Debug only
//Serial.println(varP);
//Serial.print("Level Sensor check = ");
//Serial.println(Level);

}


//Stop pumping-----------------------

//Debug only
//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
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);

//Debug only
//Serial.println("TimeUP");
}
digitalWrite(ERR1, LOW); //ERR LED1 Cancel
digitalWrite(ERR2, LOW); //ERR LED2 Cancel

//Debug only
//Serial.println("RESET");
}

} //If reset SW is ON, return to beginning
}


void RESET() {
ctR = millis(); //Anti-chattering
if((ctR - ptR) > bounceR && ptR != 0){
Reset = HIGH; //When push RSS
digitalWrite(ERR1, HIGH);
digitalWrite(ERR2, HIGH);
digitalWrite(RUN, HIGH);
delay(1000);
digitalWrite(ERR1, LOW);
digitalWrite(ERR2, LOW);
digitalWrite(RUN, LOW);
}
ptR = ctR;
}
名前:
コメント:

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

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

 

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

最新の画像もっと見る

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

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