2016-10-17 8 views
0

초음파 센서를 사용하여 가까운 곳에 있는지 감지하고 끓는 물을 시작하는이 기계 (arduino 사용)를 만들고 있습니다. 이 기능을 위해이 케틀에 연결하고 릴레이에 연결) 온도가 어느 정도 (온도 센서 사용) 도달하면 릴레이 (케틀의 전원을 제어)를 중지하고 서보를 사용하여 케틀을 기울입니다 모터를 별도의 컵에 넣습니다.Arduino UNO 및 초음파 센서 및 온도 센서를 사용하는 끓는 물 (주전자에 해킹)

현재 코드는 물의 온도가 충분히 뜨겁지는 않지만 온도가 특정 양에 도달하면 릴레이 및 주전자를 쉽게 켭니다 (이 경우에는 35 번을 시도로 사용함).) 서보가 회전을 멈추지 않을 것입니다. 코드는 3도 각도로 회전 한 다음 정지해야합니다 (그렇습니까?)하지만 계속 회전합니다. 이 문제를 해결할 방법이 있습니까? 또한, 어떻게 회전 부분을 마무리하고 프로그램을 계속해서 초음파 센서를 사용하고 프로세스를 시작합니까?

I 릴레이 제어, 초음파 센서 핑 라이브러리의 Arduino의 라이브러리를 사용하고

및 온도 센서 (FYI 난 DF 로봇 또는 Seeed Studio의 초음파 센서와 온도 센서와 5kg 서보 모터를 사용하고있다)

#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 초 동안 만 지연됩니다. 아마도 예상치 못한 행동을하는 또 다른 이유일까요? 주전자가 꺼진 상태로 오래 기다리면 온도가 다시 회전 코드를 트리거하지 않는 수준으로 떨어집니다.

다시 프로세스 시작 : 의 코드가 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; 
}