2016-10-17 6 views
0

Я делаю эту машину (используя ардуино), которая использует ультразвуковой датчик для обнаружения, если вы близко к нему, а затем он начинает кипящую воду (я взломал в этот чайник для этой функции и подключить его к реле), и как только температура достигает определенной степени (с использованием температурного датчика), она останавливает реле (которое контролирует мощность чайника) и наклоняет чайник с помощью сервопривода двигатель в отдельную чашку.Кипящая вода (взламывание в чайник) с использованием Arduino UNO и ультразвукового датчика и датчика температуры

В настоящее время мой код легко включает реле и чайник, когда он обнаруживает, что температура воды недостаточно высокая, но после того, как температура достигла определенной величины (я использовал 35 в этом случае, как попытку) серво не перестанет вращаться. Код заставляет его вращаться на трех градусах, а затем он должен остановиться (справа?), Но затем он продолжает вращаться. Есть ли способ исправить это? Кроме того, как мне закончить часть вращения и снова включить программу, чтобы снова использовать ультразвуковой датчик и начать процесс?

(FYI я с помощью робота DF или датчик и датчик температуры Ультразвуковой Seeed Studio в и серводвигатель 5 кг)

Я использую библиотеку 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

Пересмотренный код:

(примечание:.. Спасибо за ваш ответ, Джозеф, так что я в конечном итоге изменения кода и каким-то образом сделал его запустить, как я хотел, чтобы она, в какой-то степени я использовал переменную счетчика чтобы закончить цикл, но мне было интересно, есть ли способ снова войти в цикл после выхода из цикла? В идеале я бы хотел, чтобы он запускался каждый раз, когда кто-то приближался, а затем повторял процесс, когда кто-то снова приближался к нему. задержка и фиксированное, и то же самое я знаю о функции loop().)

#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; 
}