2016-11-22 3 views
0

機能の後にHIGHからLOWにトグルしないであろう。アルドゥイーノモータファンは、遅延

LED光とmotorFANの状態を切り替えるためのIRセンサを使用してきました。したがって、トリガ距離の条件が満たされると、LEDライトとモータファンの両方の状態がLOWからHIGHに切り替わります。 5秒の遅延後、motorFANの状態はHIGHからLOWに切り替わりますが、トリガー距離の条件が満たされている限り、LEDライトの状態はHIGHのままです。トリガー距離がもはや満たされなくなるとLEDライトがLOWに切り替わります。

問題:トリガー距離条件が満たされる

、LEDライトとmotorFAN状態の両方がLOWからHIGHにトグルします。

しかし、motorFan状態は、5秒の遅延後にHIGHからLOWに切り替わらず、HIGHのままです。

2つ目の問題は、トリガー距離の条件が満たされなくなったときに、LEDライトとmotorFanの両方の状態がHIGHからLOWに切り替わった後です。再び条件が満たされると、LEDライトのみがLOWからHIGHにトグルされますが、モータファンの状態はトグルされずにLOWのままです。

したがって、問題を修正する際の助けを借りて、間違ったことを尋ねる必要があります。おかげさまで

コード:

const int signalPin = 1; //wire pin to analog for IR Sensor 
//Motor-Fan connected to arduino pin number 
//const int FanPin = 5; 

//Motor-Fan Relay 
byte FanRelay = 4; 
//const int FanRelay = 4; 
//Light Relay 
byte LightRelay = 6; 
//const int LightRelay = 5; 
int IRSignal; //variable signal, will hold the analog value read by Arduino 


long duration; 
int distance; 
unsigned long Timer; 
unsigned long Interval = 10000; //teh repeat Interval 
unsigned long SmellInterval = 10000; 

void setup() 
{ 
    //Execute only once at startup 

    //pinMode (FanPin , OUTPUT) ; // Set pinMode for FanPin as OUTPUT, display 
    pinMode (signalPin, INPUT); //infared sensor line will be an input to the Arduino 
    pinMode(FanRelay, OUTPUT); 
    pinMode(LightRelay, OUTPUT); 
    Serial.begin(9600); // Open serial port to communicate with the Ultrasaonic Sensor 
} 

void loop() 
{ 

    //execute multiple times in a loop 

    IRSignal = analogRead(signalPin); //arduino reads the value from the infared sensor 
    distance = 9462/(IRSignal -16.92); 
    Serial.println(distance); 
    if(distance < 30 && distance > 0) 
    { 
    Timer = millis(); 
    // Write a pin of HIGH 
    Serial.println("1"); 

    digitalWrite (FanRelay, HIGH); 
    digitalWrite (LightRelay, HIGH); 

    if (Timer > SmellInterval){ 
     //digitalWrite (FanPin, LOW); 
     digitalWrite (FanRelay, LOW); 
    } 
    } 
    else 
    { 
    Serial.println("0"); 
    //Check if Timer is longer than 10s 

    if ((millis()-Timer)>Interval){ 
     //digitalWrite (FanPin, LOW); 
     //digitalWrite (FanRelay, LOW); 
     digitalWrite (LightRelay, LOW); 
    } 
    } 
    delay(1000); 
} 

答えて

0

問題はここにある:

Timer = millis(); 
.... 
if (Timer > SmellInterval){ 
    //digitalWrite (FanPin, LOW); 
    digitalWrite (FanRelay, LOW); 
} 

Timer変数が最後にリセットからシステムの時間ですmillis()の現在の値を保持します。これは、プログラム実行の10秒後に常に条件が満たされることを意味します。

FanRelayは、条件が満たされていて十分な時間が経過したため、低い値を維持するため、電源を入れるとすぐにオフになります。

遅延後もオフになります(両方の遅延は10秒で、5秒ではありません)。最初の距離条件が満たされたときにのみ時間を保存し、その時差を確認する必要があります。

同様の例については、https://www.arduino.cc/en/Tutorial/BlinkWithoutDelayを参照してください。また、ステートマシンのコンセプトを使用すると、デザインがはるかに読みやすく、デバッグも簡単になります。 wikiStackOverflowについての読書ステートマシンでは、一連の状態(no_object_detected, object_just_detected, object_detected_a_while_agoなど)を定義し、それらの間で遷移します(発生したとき、発生時に何を行うべきか)。