見出し画像

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

液面維持システム その6 やっぱりポカミスあり

昨日のスケッチ、やはりミスあり。
割込のサブルーチンの中では時間を扱う事ができないのに
delay()を入れていた。

これが入っていてどうなるかと言うと、
スケッチに従ってLED3つが点灯するも
delay()の中に書き込んだ1000msec(1秒)は無視される。
ちょっと点灯したかと思うとすぐ消える。


対策はLEDの点灯-消灯は別のサブルーチンで作り、
このサブルーチンが呼び出されるように必要各所にばらまいた。

アップロードすると上手く動く。
(下記スケッチ)



さて、ここでもう1つ、小さな問題が発生。

PCからアップロードした瞬間は上手く動く。
が、アップロードせずに電源供給のつもりでUSBケーブルをつなぐと
動きがおかしい。
なぜかリレーがONしたままになってそこから動かない。
リセットスイッチ(大きなスイッチ)を押しても何も起きない。
Arduinoのリセットスイッチもダメ。

つまりアップロードしたままにしないと動かない。
これは困る。
常にPCを繋げておくわけにはいかない。


が、原因がわかった。
USBから電源を入れているために
USBを接続するとArduinoが通信待ちになるらしい。
今、別電源がここにないので実証しにくいが、
PC側のUSBプラグをちょっと浮かして接続すると上手く動く事がわかった。

USBプラグの端子は最初に脇の部分にある電源が先に接触するようになっていて
中央のデータ通信部分はその後だ。
だから脇の電源ラインだけ接触した状態にすると通信は期待されない。

電源は街の携帯電話ショップかDIYショップにある
スマホ・チャージャーを使う予定なので
たぶん実機に取り付けた時には動きそうだ。




ところで、
Arduino、多少の慣れがあれば誰にでも作れるしプログラミングも簡単。
初心者キットなども簡単に手に入る。
面倒な回路を組まなくても接続するだけで動くモジュールもたくさんある。
つまり誰もがゼロからでも始められる。
ちょっと前に同じ事をやろうとしたらけっこうなマニアか技術屋さんで
パーツを買える店を秋葉原などで知っている人しかできなかった。
今は通販で中国から飛んでくる。
かなり安い物でも送料無料だったりする。
本当に良い時代。

これを昔みたいに三菱とかオムロンとかのPLCと
(知らない人は工業用コントローラーだと思ってください)
キーエンスやオムロンとかのセンサーなんかを高いお金を出して
専門の技術を学んだ人にやってもらわないといけなかった。
もちろんそっちにもメリットが多いのでそれが無くなるわけはないけれど

今はちょっとした事ならこうして数百円のArduinoでも簡単にできる。
PLCなんか使うと金額が大きくなり人も動くから
できるかどうかわからない事やテストなんかには使いにくい。
失敗できないから。

失敗できると言うのは強い。
カメラがフィルムに写して現像するのからデジタルになったら
失敗した写真は単純に消せば良いことになった。
それと似ている。

作っているのか、それとも失敗に慣れる練習しているのか?






//Timer setting
int TimeW = 1; //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_PULLUP);
pinMode(RSS, INPUT_PULLUP);

//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
delay(1000);
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 == 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);
}

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(1000);
digitalWrite(ERR1, LOW);
digitalWrite(ERR2, LOW);
digitalWrite(RUN, LOW);
}
名前:
コメント:

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

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

 

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

最新の画像もっと見る

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

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