2016-10-17 8 views
0

超音波センサーを使用して近くにいるかどうかを検出して沸騰水を開始する(arduinoを使用して)この機能のためにこのケトルに接続してリレーに接続します)、ある程度の温度に達すると(温度センサを使用して)、リレーを停止し(ケトルの電力を制御します)、サーボを使ってケトルを傾けますモーターを別のカップに入れます。Arduino UNOと超音波センサーと温度センサーを使用した沸騰水(ケトルへのハッキング)

今のところ私のコードは、水の温度が十分に暑いのではなく、温度が一定量に達した後に、リレーとケトルを簡単にオンにします(この場合、 )サーボが回転を止めることはありません。コードを3度回転させて停止させる必要がありますが、それは回転し続けます。これを修正する方法はありますか?また、どのように回転部分を終え、プログラムを続けて超音波センサーを使用してプロセスを開始するのですか?

(FYI私はDFロボットやSeeed Studioの超音波センサーと温度センサーと5キロのサーボモータを使用しています)

私はリレー制御、超音波センサのpingライブラリ、および温度センサのためのArduinoのライブラリを使用しています

#include <Servo.h> 
#include <SoftwareSerial.h> 


int val; // 
int tempPin = 1; 
int relaypin = 13; 
Servo myservo; 
const int pingPin = 7; 
int ledpin = 10; 


void setup() 
{ 
    Serial.begin(9600); 
    pinMode(relaypin, OUTPUT);    // taking relay input 
myservo.attach(2); 
myservo.write(90);      // servo position 
    pinMode(ledpin, OUTPUT); 


} 
void loop() 
{ 
    long duration, cm;       //*following code is for ultrasonic sensor 
    pinMode (pingPin, OUTPUT); 
    digitalWrite(pingPin, LOW); 
    delayMicroseconds(1); 
    digitalWrite(pingPin, HIGH); 
    delayMicroseconds(2); 
    digitalWrite(pingPin, LOW); 

    pinMode (pingPin, INPUT); 
    duration = pulseIn (pingPin, HIGH); 

    cm= microsecondsToCentimeters(duration); 


val = analogRead(tempPin); 
float mv = (val/1024.0)*5000; 
float temp = mv/10; 
//float farh = (temp*9)/5 + 32;     *last line for ultrasonic sensor 
//digitalWrite(relaypin, HIGH);   //start the boiling 
//delay (10); 


if (cm <= 20) 
{ 
if (temp <= 27) 
    { 
    digitalWrite(relaypin, HIGH);   //start the machine 

// myservo.write(75);     //tilting the servo 
// delay (2000);     //pause for 2 seconds 
// myservo.write(65); 
// delay (2000);     //pause for 2 seconds 
// myservo.write(45); 
// delay (2000); 
// myservo.write(35); 
// delay (2000); 
// myservo.write(90); 
// delay(5000); 

    } 
else if(temp >= 35) 
    { 
    digitalWrite(relaypin, LOW);   //stops the machine 
    delay(5000); 
    myservo.write(75);     //tilting the servo 
    delay (2000);     //pause for 20 seconds 
    myservo.write(65); 
    delay (2000);     //pause for 20 seconds 
    myservo.write(45); 
    delay (2000); 
    myservo.write(35); 
    delay (2000); 
myservo.write(90); 
    delay(5000); 

    } 

} 

} 

long microsecondsToCentimeters(long microseconds) 
    { 
    // The speed of sound is 340 m/s or 29 microseconds per centimeter. 
    // The ping travels out and back, so to find the distance of the 
    // object we take half of the distance travelled. 
    return microseconds/29/2; 
    } 

答えて

0

サーボが回転した後でも温度はまだ35℃ですか?その場合、回転コードはtempが35を下回るまで何度も実行されます。

BTW:あなたのコードにはdelay(2000)がありますが、コメントには// pause for 20 secondsと書かれています。実際にはここで2秒間だけ遅延しています。おそらく予期しない行動を起こすもう一つの理由でしょうか?ケトルの電源を切った状態で長時間待つだけでは、温度が再び回転コードをトリガしないレベルに下がります。

プロセスの再開について:loop()のコードがArduinoをオフにするまで繰り返し実行されていることを認識しているかどうかはわかりません。したがって、温度が< = 27になるとすぐに、超音波センサーに十分に近づいているので、マシンを起動するためのコードがもう一度実行されます。

+0

Josefさん、ありがとうございました。 私はコードを変更してしまい、どういうわけか、ある程度それをしたいと思うようにしました。私はループを終了するためにカウンタ変数を使用しましたが、ループを終了した後に再びループに入る方法があるかどうか疑問に思っていましたか?理想的には、誰かが近くに来るたびに誰かがもう一度それに近づくときにプロセスを繰り返すたびに実行したいと思っています... – rp2402

0

改訂コード:

(注:。。私は、コードを変更することになったと何とかそれはある程度、私はそれが望んでいた方法を実行して作られた、あなたの応答のためのヨーゼフをいただきありがとうございます、私はカウンタ変数を使用ループを終了するが、私はループを終了した後に再びループに入る方法があるのだろうかと思っていたのだろうか?理想的には誰かが近くに来て、遅延とそれを固定し、ループ()関数についても知っています)。

#include <Servo.h> 
#include <SoftwareSerial.h> 
#define trigPin 8 
#define echoPin 7 


int val; 
int tempPin = A0; 
int relaypin = 13; 
Servo myservo; 
int ledpin = 10; 
boolean complete = false; 

void setup() 
{ 
    Serial.begin(9600); 
    pinMode(relaypin, OUTPUT);    // taking relay input 
    myservo.attach(12); 
    myservo.write(90);      // servo position 
    pinMode(ledpin, OUTPUT); 
    SensorSetup(); 


} 
void loop() 
{ 
    int actualDistance = MeasureDistance(); 
    Serial.print(actualDistance); 
    Serial.println(" cm"); 
    delay(500); 


    val = analogRead(tempPin); 
    float mv = (val/1024.0)*5000; 
    float temp = mv/10; 
    //float farh = (temp*9)/5 + 32;     *last line for   ultrasonic sensor 
    //digitalWrite(relaypin, HIGH);   //start the boiling 
    //delay (10); 
    Serial.println(temp); 

    if (actualDistance <= 25) 
    { 
    while (temp >= 20 && temp <=45) 
    { 
    digitalWrite(relaypin, HIGH);   //start the machine 
     Serial.println(actualDistance); 

    } 
    } 
    else if(actualDistance >= 20) 
{ 
    if (temp >= 55 && complete == false) 
    { 
     Serial.println(actualDistance); 
     digitalWrite(relaypin, LOW);   //stops the machine 
     delay(5000); 
     myservo.write(75);     //tilting the servo 
     delay (2000);     //pause for 2 seconds 
     myservo.write(65); 
     delay (2000);     //pause for 2 seconds 
     myservo.write(45); 
     delay (2000); 
     myservo.write(35); 
     delay (2000); 
     myservo.write(25); 
     delay (2000); 
     myservo.write(15); 
     delay (2000); 
     myservo.write(0); 
     delay (2000); 
     myservo.write(25); 
     delay (2000); 
     myservo.write(35); 
     delay (2000); 
     myservo.write(45); 
     delay (2000); 
     myservo.write(60); 
     delay (2000); 
     myservo.write(90); 
     delay(5000); 
     complete = true; 
    } 

    } 

} 


void SensorSetup(){ 
    pinMode(trigPin, OUTPUT); 
    pinMode(echoPin, INPUT); 
} 

int MeasureDistance(){  // a low pull on pin COMP/TRIG triggering a   sensor reading 
    long duration; 
    digitalWrite(trigPin, LOW); // Added this line 
    delayMicroseconds(2); // Added this line 
    digitalWrite(trigPin, HIGH); 
    delayMicroseconds(10); // Added this line 
    digitalWrite(trigPin, LOW); 
    duration = pulseIn(echoPin, HIGH); 
    long distance = (duration/2)/29.1; 
    return (int)distance; 
} 
関連する問題