見出し画像

もんく [とある港街の住人]

液面維持システム その7 内蔵プルアップの罠(わな) ←記事に間違いあり注意

※追記 (2017年3月2日)
この記事には間違いがありますのでそう思って読んでください。
間違いの内容はできるだけ早めに別記事で案内いたします。




前回、完成と思った。
なぜならブレッドボード上では完全に機能したから。

が、実際取り付けるべき場所に取り付けると上手くいかない。
症状はポンピングに進まないと言う事。

テスターで当たってみると、
リセットスイッチ周りがおかしい。
テスターのプローブをスイッチの端子に当てると
それだけでリセットがかかる。
端子台がダメなのか、端子台を熱でダメにしてしまったのか?

GNDと入力で抵抗を測ってみると、
あれっ?
導通がある。
数百Ωから千ちょっとΩ。
どこかおかしいのか?
と思ったが、どのピンでもそうだった。
そう言うものらしい。

じゃ、何がダメなのか?
と、気付いたのは内蔵プルアップを使って回路を組んでいる事。
内蔵プルアップを使うとArduinoの外に抵抗を付ける必要が無い。
つまりスイッチとArduinoのピンが直結だ。
その時、ピンに何かが触ってちょっとだけ電流が逃げるとする。
スイッチまでの配線が長くなっていてArduino流す電流はちょっとだけ。
そこに流れる電流がどこかに逃げたらスイッチがONだかOFFだか
してる事になりはしないか?
OFFのスイッチを経由しないでどこかでリークしてGNDに入ったと同じになる。



スケッチで内蔵プルアップを使って配線を横着したのまずかったか?
なので、ちゃんと外部プルアップに変更した。
4.7kΩでリセットスイッチ、液面センサーともにやってみた。



プルアップの変更のためにスケッチも変更した。
リセットスイッチは内蔵プルアップでRISINGだった。
これは文字通り押した時に感知するのではなくて、
押したのを離した時に感知するものだった。
どっちでも良いのだ。

なのでこれはこのままにして、
外部プルアップは押した時に感知する事にした。


逆に液面センサーはちゃんと論理逆転でHIGHでなくて
LOWで液面が高いと認識するように変更。
(センサーが逆論理になっているから、液面低でHIGH)


せっかくなので別件でもう1つ変更。

待ち時間に青LEDを点滅させるようにした。
これまでは何もせず時間待ちだったけれども、
それだと10分間、正しく動いているのか止まっているのかがわからなかった為。


箱も用意。
アイスクリームの箱に配線用の穴を開けて入れる事にした。


マレーシア場合、1kgだか1リットルだか、
そんな単位で平気でアイスクリームが売られているのだ。
暑いから? 家族が多いから? それとも単に甘いものが好きだから?



-------以下が最新スケッチ-------
(そのまま貼り付けているので見難くなっています。)



//Timer setting
int TimeW = 10; //Waiting time in minutes (1 = 1min)
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 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 HIGH- Normal HIGH
pinMode(RSS, INPUT); //Push is HIGH - NoromalLOW

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

//Level sensor Normal-ON type

}

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); //ただの待ち時間だったところを点滅に変更。
delay(100);
digitalWrite(RUN, LOW);
delay(900);
if(Reset == HIGH){
RESFLASH(); //If Reset 3 LEDs Flash
}
varW0++;
}
varW++;

//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){ //液面センサーの検出論理変更
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(Reset == 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
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(Reset == 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() {
ctR = millis(); //Anti-chattering
if((ctR - ptR) > bounceR && ptR != 0){
Reset = HIGH; //When push RSS

}
ptR = ctR;
}


void RESFLASH() { //Indication for RESET
digitalWrite(ERR1, HIGH);
digitalWrite(ERR2, HIGH);
digitalWrite(RUN, HIGH);
delay(2000); //リセットでの点灯時間も1秒→2秒に変更。
digitalWrite(ERR1, LOW);
digitalWrite(ERR2, LOW);
digitalWrite(RUN, LOW);
}
名前:
コメント:

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

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

 

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

最新の画像もっと見る

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

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