2017-12-26 8 views
0

私のグループと私は、定期的に水を飲むように思い出させる、プロジェクト用のスマートなArduino給水ボトルを作ろうとしています。Arduino給水ボトルコードが期待通りに機能しない

私がしようとしているのは、超音波センサーと水位の距離を確認することです。距離が1時間を超えて同じになると、シリアルモニタに「bad」という単語が表示されます。それ以外の場合は「良い」という単語を返します。しかし、このコードを実行すると、距離が5000ミリ秒以上同じ場合でも「良い」という単語が出力されます。

注:コードでは、迅速な結果を得るために1時間ではなく、間隔変数に5000ミリ秒を割り当てました。

注2:これはテストコードであり、完全ではありません。私はこの仕事をする必要があります。

// defines pins numbers 
const int trigPin = 8; 
const int echoPin = 7; 

// defines variables 
int maxrange = 20; 
int minrange = 0; 
long duration, distance; 

long previousmillis = 0; 
long interval = 5000; //1 hour = 3600000ms; 
unsigned long currentmillis = millis(); 

void setup() { 
    pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output 
    pinMode(echoPin, INPUT); // Sets the echoPin as an Input 
    Serial.begin(9600); // Starts the serial communication 
} 

void loop() { 
    // Clears the trigPin 
    digitalWrite(trigPin, LOW); 
    delayMicroseconds(2); 

    // Sets the trigPin on HIGH state for 10 micro seconds 
    digitalWrite(trigPin, HIGH); 
    delayMicroseconds(10); 
    digitalWrite(trigPin, LOW); 

    // Reads the echoPin, returns the sound wave travel time in microseconds 
    duration = pulseIn(echoPin, HIGH); 

    //Converting the distance to cm 
    distance = duration/29/2; 


    if (currentmillis > interval) { 
    if (distance == distance) { 
     Serial.println("Bad"); 
     Serial.println(distance); 
    } 
    } else { 
    Serial.println("Good"); 
    Serial.println(distance); 
    } 
} 

このコードで何が問題になっていますか?私にお知らせください。

+3

いつ 'distance == distance'が間違っていると思いますか? – jonrsharpe

+0

私は間違いをしたと確信しています。あなたが気にしないなら、あなたは訂正で私を助けてくれますか?ありがとうございました。 –

+0

https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – jonrsharpe

答えて

0

これを試してください。私はそれをテストしなかった。

// defines pin numbers 
    const int trigPin = 8; 
    const int echoPin = 7; 

    // defines variables 
    int maxrange = 20; 
    int minrange = 0; 
    long duration, distance; 

    long previousmillis = 0; 
    long interval = 5000; //1 hour = 3600000ms; 
    unsigned long currentmillis = millis(); 

    void setup() { 
     pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output 
     pinMode(echoPin, INPUT); // Sets the echoPin as an Input 
     Serial.begin(9600); // Starts the serial communication 
    } 

    void loop() { 
     int temp = 0; 
     // Clears the trigPin 
     digitalWrite(trigPin, LOW); 
     delayMicroseconds(2); 

     // Sets the trigPin on HIGH state for 10 micro seconds 
     digitalWrite(trigPin, HIGH); 
     delayMicroseconds(10); 
     digitalWrite(trigPin, LOW); 

     // Reads the echoPin, returns the sound wave travel time in microseconds 
     duration = pulseIn(echoPin, HIGH); 

     //Converting the distance to cm 
     distance = duration/29/2; 
     if (currentmillis > interval) { 
     temp = duration/29/2; 
     Serial.print("Temp:"); 
     Serial.println(temp); 
     if (temp == distance) { 
      temp = 0 ; 
      Serial.println("Bad"); 
      Serial.println(temp); 
     } 
     } else { 
     Serial.print("Good:"); 
     Serial.println(distance); 
     } 
    } 
+0

返信ありがとうございますが、まだ動作していません。 –

+0

このコードをチェックして、あなたがシリアルモニタで取得している距離が何であるか教えてください。 – vallabh

+0

私はちょうどエラーを取得します:_exit status 1 Arduino/Genuino Uno_のためにコンパイル中のエラー私は正しいボードとポートを選択したと確信しています。私はなぜこのエラーが来るのか分かりません –

0

コンセプト:オブジェクトを10cm離れたセンサからなり、音の速度は340メートル/秒、または0.034センチメートルである場合、例えば、/音波が約294 U秒を移動する必要がμsの。しかし、Echoピンから得られるものは、音波が前方に進み、後方に跳ね返る必要があるため、その倍の数になります。したがって距離をcm単位で取得するには、エコー・ピンから受信した移動時間の値に0.034を掛け、それを2で割る必要があります。

最初に、トリグ・ピンとエコー・ピンを定義する必要があります。この場合、彼らはArduino Boardのピン番号9と10であり、trigPinとechoPinという名前が付けられています。次に、センサーから取得する移動時間と距離の整数変数に「duration」という名前のLong変数が必要です。

セットアップでは、trigPinを出力に、echoPinを入力として定義し、シリアル・モニタで結果を表示するためのシリアル通信を開始する必要があります。

まず、trigPinがクリアであることを確認して、そのピンをわずか2μsだけLOW状態に設定する必要があります。超音波を生成するためには、trigPinをHIGH状態に10μs設定する必要があります。 pulseIn()関数を使用すると、移動時間を読み取り、その値を変数 "duration"に入れなければなりません。この関数には2つのパラメータがあり、最初はエコー・ピンの名前、2番目のパラメータはHIGHまたはLOWに書き込むことができます。この場合、HIGHは、pulsIn()関数が、バウンスされた音波によってピンがHIGHになるのを待って、タイミングを開始することを意味し、音波が終了するとピンがLOWになるのを待ちます。タイミングを止める。最後に、関数はマイクロ秒単位でパルスの長さを返します。距離を取得するには、持続時間に0.034を掛けて2で割ってください。最後に、距離の値をシリアルモニタに表示します。

// defines pins numbers 
int desired_time_limit=5000; 
const int trigPin = 9; 
const int echoPin = 10; 
// defines variables 
long duration; 
int distance; 
void setup() { 
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output 
pinMode(echoPin, INPUT); // Sets the echoPin as an Input 
Serial.begin(9600); // Starts the serial communication 
} 

float distance(void) 
{ 
// Clears the trigPin 
digitalWrite(trigPin, LOW); 
delayMicroseconds(2); 
// Sets the trigPin on HIGH state for 10 micro seconds 
digitalWrite(trigPin, HIGH); 
delayMicroseconds(10); 
digitalWrite(trigPin, LOW); 
// Reads the echoPin, returns the sound wave travel time in microseconds 
duration = pulseIn(echoPin, HIGH); 
// Calculating the distance 
distance= duration*0.034/2; 
return distance; 
} 

void loop() { 
float a; 
a=distance(); 
if(millis()>desired_time_limit)&&(a!=distance()) 
    printf("Bad"); 
else 
    printf("Good"); 
} 
+0

ありがとうございますが、私はすでにそのコンセプトを理解しています。私はこの部分でさらに助けが必要です:**私がしようとしているのは、超音波センサーと水位の距離を確認することです。距離が1時間を超えて同じになると、シリアルモニタに「bad」という単語が表示されます。それ以外の場合は「良い」という単語を返します。しかし、このコードを実行すると、距離が5000ミリ秒を超えても「良い」という単語が出力されます。** –

+0

@ Devika.S動作するかどうかを確認します。 – anime

+0

私はこのエラーが発生します:終了ステータス1 'float distance()'が別の種類のシンボルとして再宣言されました –

0

currentmillisは決してループで設定またはリセットされません。開始時に初期化されるため、currentmillisの値は非常に低くなります。したがって、if (currentmillis > interval)は常に偽になり、「良い」分岐につながります。

アプローチは、各ループ反復の開始時にcurrentmillis = millis()を設定することです。 currentmillis - previousmillisintervalを比較してください。 「不良」ブランチがアクティブになったら、previousmillis=currentmillisをリセットします。

+0

@anime - ?あなたのコメントを明確にしてください。これは、コードがなぜ機能していないのかの答えです(OPの "distance == distance"コメントとともに、 – AJD

関連する問題