2017-12-26 5 views
0

내 그룹과 저는 프로젝트를 위해 스마트 한 Arduino 구동 병을 만들려고합니다.이 병은 사용자가 정기적으로 물을 마시도록 상기시켜줍니다.Arduino - powered water bottle code가 예상대로 작동하지 않습니다.

내가하려는 것은 초음파 센서와 수위 사이의 거리를 확인하는 것입니다. 거리가 한 시간 이상 동일하게 유지되면 직렬 모니터에 "bad"라는 단어가 표시됩니다. 그렇지 않으면 단어 "good"을 반환합니다. 그러나이 코드를 실행하면 5000 밀리 초 이상 거리가 동일해도 "양호"라는 단어가 출력됩니다.

참고 : 코드에서 빠른 결과를 얻으려면 간격 변수에 시간 대신 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

개념 : 대상물 10 cm 거리 센서이고, 상기 소리의 속도가 340m/초 또는 0.034 cm 인 경우, 예를 들어/음파는 약 294 U 초 여행 필요 μs의 . 그러나 사운드 웨이브가 앞으로 나아가고 뒤쪽으로 튀어 나와야하기 때문에 에코 핀에서 얻을 수있는 것은 그 두 배입니다. 따라서 거리를 cm로 얻으려면 에코 핀의 수신 된 여행 시간 값에 0.034를 곱하고이를 2로 나눌 필요가 있습니다.

먼저 Trig 및 Echo 핀을 정의해야합니다. 이 경우 Arduino 보드의 핀 번호 9와 10이며 trigPin 및 echoPin이라고합니다. 그런 다음 센서에서 얻을 수있는 이동 시간과 거리에 대한 정수 변수에 대해 "duration"이라는 Long 변수가 필요합니다.

설정에서 trigPin을 출력으로 정의하고 echoPin을 입력으로 정의하고 직렬 모니터에서 결과를 표시하기 위해 직렬 통신을 시작해야합니다.

루프에서 먼저 trigPin이 해제되어 있는지 확인해야 해당 핀을 2μs 동안 로우 상태로 설정해야합니다. 이제 Ultra 음파를 생성하기 위해 trigPin을 HIGH 상태로 10μs 설정해야합니다. pulseIn() 함수를 사용하면 여행 시간을 읽고 해당 값을 "duration"변수에 저장해야합니다. 이 함수는 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

감사하지만 이미 개념을 이해했습니다. 이 부분에 대한 더 많은 도움이 필요합니다. ** 내가하려고하는 것은 초음파 센서와 수위 사이의 거리를 확인하는 것입니다. 거리가 한 시간 이상 동일하게 유지되면 직렬 모니터에 "bad"라는 단어가 표시됩니다. 그렇지 않으면 단어 "good"을 반환합니다. 그러나이 코드를 실행하면 거리가 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