Ошибка в программе, измеряющей расстояние от ультразвукового датчика

Я пытаюсь использовать ультразвуковой датчик в сочетании с различными устройствами, такими как датчик приближения, соленоид и сигнализация.

Вот как должен работать проект:

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

ниже приведен код:

/*Цель данного проекта

1. Уметь определять, когда контейнер помещается в неправильное положение, и при этом отключать подачу в пневматическую систему.
Для этого мы будем использовать следующие устройства

1. Ультразвуковой датчик для измерения разности расстояний с обеих сторон контейнера
2. ИК-датчик для измерения того, был ли установлен конатинер или нет (этот датчик активирует ультразвуковой датчик).
3. Soliend, который будет управляться выходом ультразвукового датчика. Соленоид будет контролировать поток воздуха.

*/

int trigPin = 7;
int echoPin = 8;
int contSig = 2;
int solSig = 12;
int errSig = 13;
void setup() {
  
  Serial.begin(9600);
  pinMode(trigPin,OUTPUT); 
  pinMode(contSig,INPUT_PULLUP); 
  pinMode(echoPin,INPUT);
  pinMode(solSig,OUTPUT);
  pinMode(errSig,OUTPUT);

  }

void loop() {
  if (digitalRead(contSig) == 0){
    Serial.println(digitalRead(contSig));
    digitalWrite(trigPin,LOW);
    delayMicroseconds(10);
    digitalWrite(trigPin,HIGH);
    delayMicroseconds(10);
    int duration = pulseIn(echoPin,HIGH);
    Serial.println(duration);
    float dist = (duration/2) * 0.034;
    Serial.println(dist);
    if (dist >=20 && dist <= 60){
      digitalWrite(solSig,HIGH);
      digitalWrite(errSig,LOW);
    }
    else{
      digitalWrite(solSig,LOW);
      digitalWrite(errSig,HIGH);
    }
  }
    
    
}

У меня есть несколько проблем.

1.Первый оператор If в самом начале, похоже, не работает должным образом.

2.Выходные данные на последовательном мониторе чередуются между нулями и фактическими значениями. Я не знаю точно, почему этот набор нулей продолжает появляться между ними, но это приведет к провалу проекта.

Ниже приведен вывод с последовательного монитора:

0

0

0.00

0

2892

49.16

I have been trying to simulate this on tinkercad

, 👍1

Обсуждение

pulseIn возвращает ноль, если в течение периода ожидания по умолчанию импульс не обнаружен. Другие нули-это те, которые вы печатаете явно., @Majenko

"Первое утверждение "Если" в начале, кажется, не работает должным образом", Почему вы так говорите?, @timemage

Я смоделировал эту программу на tinker cad, я не понимаю, почему нули все еще появляются. Согласно логике, у нас не должно быть нулей. Состояние if, похоже, не работает, потому что, когда я меняю значение contSig с 0 на 1, я все равно получаю показания ультразвукового датчика, чего не должно происходить, @Hussain Bhavnagarwala