Датчик удара не работает в файле
Я столкнулся с проблемой, когда датчик удара не работает в файле. Моя идея заключается в том, что когда ультразвуковой датчик почувствует, что когда он составляет 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();
}
}
}
@Sophia, 👍0
Обсуждение1 ответ
Я почти уверен, что проблема в вашем коде. Вы полагаетесь на время, а не на события. Использование задержек нормально, когда вы просто подключаетесь к одному датчику, но когда вы начинаете их смешивать, у вас возникают подобные проблемы.
Вы считываете показания датчика вибрации один раз в секунду, если расстояние равно 4. Таким образом, любая вибрация должна происходить более одной секунды или точно в нужное время. Я думаю, вам нужно найти лучший способ кодирования решения без использования операторов большой задержки, возможно, посмотрите на прерывания.
Я обновил код. Но я теряюсь в том, как сообщить прерыванию, что при расстоянии 4 см прерывание будет запущено. Спасибо, @Sophia
Все в порядке, я решил эту проблему., @Sophia
@София - Пожалуйста, не могли бы вы написать свой собственный ответ на вопрос на случай, если у кого-то еще когда-нибудь возникнет та же проблема?, @Code Gorilla
Зачем добавлять сюда сложность прерываний? Почему бы просто не избавиться от задержек вызовов и не написать неблокирующий код? Кажется глупым рекомендовать прерывание каждый раз, когда кто-то неправильно использует задержку., @Delta_G
- Как определить направление вращения с помощью датчика времени энкодера (фотоэлектрический датчик скорости)?
- Как устранить сообщение об ошибке "assignment of function 'void digitalWrite (uint8_t, uint_8)"?
- Как сохранить данные на SD-карту с помощью модуля защиты памяти SPI
- Требуются точные значения цвета RGB с помощью датчика цвета tcs3200 RGB
- Как запрограммировать 2 ультразвуковых датчика, один на серводвигателе и один прикрепленный на передней стороне автомобиля?
- Использование значения MAX30100 SpO2 для включения светодиода
- Приоритет одного датчика
- avrdude ser_open() can't set com-state
У вас есть марка и модель или техническое описание датчика удара?, @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