Ультразвуковой датчик просто определяет такое же расстояние

int tPin = 11;
int ePin = 12;
long duration, inches, cm;

void setup()
{
    Serial.begin(9600);
    pinMode(tPin, OUTPUT);
    pinMode(ePin, INPUT);
    pinMode(2, OUTPUT);
}

void loop()
{
    digitalWrite(tPin, LOW);
    delayMicroseconds(5);
    digitalWrite(tPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(tPin, LOW);
    duration = pulseIn(ePin, HIGH);
    cm = (duration / 2) / 29.1;
    inches = (duration / 2) / 74;
    Serial.print(inches);
    Serial.print("in, ");
    Serial.print(cm);
    Serial.print("cm");
    Serial.println();
    delay(100);

    if (inches <= 10) {
        digitalWrite(2, HIGH);
        delay(50);
        digitalWrite(2, LOW);
        delay(50);
    }
    else {
        digitalWrite(2, HIGH);
        delay(500);
        digitalWrite(2, LOW);
        delay(500);
    }
}

Последовательная печать отображает то же расстояние, что и первое обнаружение. Как я могу это исправить?

, 👍0

Обсуждение

Какое число постоянно выдает? Также имейте в виду, что при делении / 2 и / 74 вы выполняете целочисленное деление, вы должны изменить их на значения с плавающей запятой, а также сделать cm и inches плавающими., @Maximilian Gerhardt

Вы уверены, что он определяет такое же расстояние? Как далеко вы пытались отодвинуть объект от датчика?, @AnT


1 ответ


1

Прежде всего вам нужно сделать так, чтобы см, дюймы и продолжительность плавали, чтобы быть более точным. Во-вторых, нужно сделать задержку между триггерами 2 и 10 микросекунд. В целом, если я не ошибаюсь, вы можете использовать приведенный ниже код, не меняя схему.

int tPin = 11;
int ePin = 12;
float duration, inches, cm; //числа с плавающей запятой, чтобы сделать результат более точным

void setup()
{
    Serial.begin(9600);
    pinMode(tPin, OUTPUT);
    pinMode(ePin, INPUT);
    pinMode(2, OUTPUT);
}

void loop()
{
    digitalWrite(tPin, LOW);
    delayMicroseconds(2);         // Задержка 2 микросекунды
    digitalWrite(tPin, HIGH);
    delayMicroseconds(10);        // Задержка 10 микросекунд
    digitalWrite(tPin, LOW);
    duration = pulseIn(ePin, HIGH);
    cm = duration / 58.2;          //Вместо продолжительности/2/28.1
    inches = cm / 2.54;            //Вы можете использовать cm, который был создан ранее для конвертации
    Serial.print(inches);
    Serial.print("in, ");
    Serial.print(cm);
    Serial.print("cm");
    Serial.println();
    delay(100);

    if (inches <= 10) {
        digitalWrite(2, HIGH);
        delay(50);
        digitalWrite(2, LOW);
        delay(50);
    }
    else {
        digitalWrite(2, HIGH);
        delay(500);
        digitalWrite(2, LOW);
        delay(500);
    }
}
,