Датчик удара не работает в файле

Я столкнулся с проблемой, когда датчик удара не работает в файле. Моя идея заключается в том, что когда ультразвуковой датчик почувствует, что когда он составляет 4 см, дверь гаража откроется. Когда автомобиль поворачивает назад, датчик избегания препятствия проверит, есть ли препятствие позади. Эти два датчика работают нормально.

После этого будет активирован датчик удара, чтобы увидеть, ударился ли автомобиль о стену. Но от части датчика удара дальше, датчик удара не бежит. Я устраняю неполадки, помещая код датчика удара в другой скетч, и он работает.

Я понятия не имею, где я сделал что-то не так. Я ценю любую помощь

Обновление Я изменил код, чтобы аккоммадировать прерывания, которые советует CodeGorilla. Мне нужна помощь в том, как я могу сообщить прерыванию, что оно может быть выполнено, когда оно достигнет if (расстояние == 4).

 #include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // становите адрес ЖК-дисплея на 0x27 для 16 символов и 2-строчного дисплея


const int trigPin = 9;
const int echoPin = 10;

long duration;
int distance;

const int shockPin = 3; // Использовать вывод 3 в качестве входного сигнала


void setup() {

  Serial.begin(9600);

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Distance left:");


  // Ultrasonic Sensor
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);


  // Obstacle Avoidance Sensor
  pinMode(8, INPUT);// set pin as input

  // Shock Sensor
  pinMode (shockPin, INPUT) ; // input from the KY-002

  attachInterrupt(digitalPinToInterrupt(3), detectShock, CHANGE);
  attachInterrupt(digitalPinToInterrupt(8), senseObstacle, CHANGE);
}

void detectShock ()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Detection: ");
  if (digitalRead(shockPin) == LOW) // Если мы находимся в состоянии тревоги
  {
    lcd.setCursor(0, 1);
    lcd.print("Shock exists");
  }
  else
  {
    lcd.setCursor(0, 1);
    lcd.print("Shock is absent");
  }
}

void senseObstacle() {
  lcd.clear();
  lcd.setCursor(0, 0);
  //delay(300);
  lcd.print("Detection:");
  if (digitalRead(8) == LOW) {
    lcd.setCursor(0, 1);
    lcd.print("Obstacle Present");
  } else {
    lcd.setCursor(0, 1);
    lcd.print("No Obstacle");
  }


void loop() {

  // Очищает trigPin
  digitalWrite(trigPin , LOW);
  delayMicroseconds(2);

  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin , LOW);

  // Считывает эхопин, возвращает звуковую волну
  // время в пути в микросекундах
  duration = pulseIn( echoPin , HIGH);

  distance = duration * 0.034 / 2;

  lcd.setCursor(0, 0);
  lcd.print("Distance left: ");

  lcd.setCursor(0, 1);
  lcd.print(distance);
  lcd.print(" CM");


  if (distance == 4) {
    // Я заблудился здесь.
    lcd.setCursor(0, 1);
    lcd.print("Door Opens");
    delay(500);
    // Как только автомобиль въезжает, датчик избегания препятствий проверяет, есть ли препятствия на пути..
    delay(5000);
    lcd.clear();
  }

}



}

, 👍0

Обсуждение

У вас есть марка и модель или техническое описание датчика удара?, @Code Gorilla

Модель датчика удара-ky-002. Я еще не сохранил эти данные в базе данных. @CodeGorilla, @Sophia

какова цель выхода(0)?, @Juraj

@Juraj, чтобы пропустить петлю. Я гу его, чтобы он продолжал петлять., @Sophia

Ждать, пока машина врежется в стену, - это вообще странная концепция парковки., @Dmitry Grigoryev

@DmitryGrigoryev, просто имитация того, что когда датчик расстояния достигнет 4 см, дверь гаража откроется. Я обновил код, чтобы приспособить его к прерываниям. Был бы признателен, если бы вы могли дать какие-либо точки в блоке if (расстояние==4), потому что я не уверен, как я могу сказать прерыванию, чтобы оно выполнялось в блоке if. Этот проект очень прост., @Sophia

Первое, что я хотел бы попробовать, это [избавиться от delay()](https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay). Для этого используется [конечный автомат](https://hackingmajenkoblog.wordpress.com/2016/02/01/the-finite-state-machine/), вероятно, поможет., @Edgar Bonet

@EdgarBonet, сделал это! Работайте, как положено. Спасибо:), @Sophia


1 ответ


0

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

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

,

Я обновил код. Но я теряюсь в том, как сообщить прерыванию, что при расстоянии 4 см прерывание будет запущено. Спасибо, @Sophia

Все в порядке, я решил эту проблему., @Sophia

@София - Пожалуйста, не могли бы вы написать свой собственный ответ на вопрос на случай, если у кого-то еще когда-нибудь возникнет та же проблема?, @Code Gorilla

Зачем добавлять сюда сложность прерываний? Почему бы просто не избавиться от задержек вызовов и не написать неблокирующий код? Кажется глупым рекомендовать прерывание каждый раз, когда кто-то неправильно использует задержку., @Delta_G