Зуммер продолжает гудеть, хотя датчик ничего не обнаруживает.

В коде, который я привёл ниже, идея заключалась в том, чтобы создать датчик, обнаруживающий объекты на разных расстояниях . Если они находятся достаточно близко, светодиодная полоса загорается жёлтым цветом, но зуммер не включается. Если же объекты находятся очень близко, светодиодная полоса загорается красным цветом, а зуммер быстро вибрирует. Однако в нашем случае зуммер продолжает вибрировать непрерывно, даже если рядом с датчиком нет никаких объектов. Ниже представлен наш код для ввода:

#include <Adafruit_NeoPixel.h>

#define TRIGGER_PIN_LEFT 8
#define ECHO_PIN_LEFT 9
#define TRIGGER_PIN_RIGHT 4
#define ECHO_PIN_RIGHT 5
#define NUM_PIXELS 8
#define POTENTIOMETER_PIN A0
#define PIEZO_PIN 10
#define TILT_PIN 6

Adafruit_NeoPixel strip1(NUM_PIXELS, 3, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip2(NUM_PIXELS, 2, NEO_GRB + NEO_KHZ800);

void setup() {
  pinMode(TRIGGER_PIN_LEFT, OUTPUT);
  pinMode(ECHO_PIN_LEFT, INPUT);
  pinMode(TRIGGER_PIN_RIGHT, OUTPUT);
  pinMode(ECHO_PIN_RIGHT, INPUT);
  pinMode(PIEZO_PIN, OUTPUT);
  pinMode(TILT_PIN, INPUT);
  strip1.begin();
  strip1.show();
  strip2.begin();
  strip2.show();
  Serial.begin(9600);
}

void loop() {
  long duration1, distance1, duration2, distance2;
  int speed = analogRead(POTENTIOMETER_PIN);
  int tilt = digitalRead(TILT_PIN);

  digitalWrite(TRIGGER_PIN_LEFT, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGGER_PIN_LEFT, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN_LEFT, LOW);
  duration1 = pulseIn(ECHO_PIN_LEFT, HIGH);
  distance1 = (duration1/2) / 29.1;

  digitalWrite(TRIGGER_PIN_RIGHT, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGGER_PIN_RIGHT, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN_RIGHT, LOW);
  duration2 = pulseIn(ECHO_PIN_RIGHT, HIGH);
  distance2 = (duration2/2) / 29.1;

  if (distance1 < 200 && distance1 > 50 && tilt == LOW) {
    for(int i=0; i<NUM_PIXELS; i++) {
      strip1.setPixelColor(i, 255, 255, 0);
    }
    strip1.show();
  } else if (distance1 < 200 && distance1 > 50 && tilt == HIGH) {
    for(int i=0; i<NUM_PIXELS; i++) {
      strip1.setPixelColor(i, 255, 0, 0);
    }
    strip1.show();
    tone(PIEZO_PIN, 500);
    delay(100);
    noTone(PIEZO_PIN);
    delay(100);
  } else if (distance1 < 50 && speed > 100) {
    for(int i=0; i<NUM_PIXELS; i++) {
      strip1.setPixelColor(i, 255, 0, 0);
    }
    strip1.show();
    tone(PIEZO_PIN, 500);
    delay(100);
    noTone(PIEZO_PIN);
    delay(500);
  } else {
    for(int i=0; i<NUM_PIXELS; i++) {
      strip1.setPixelColor(i, 0, 0, 0);
    }
    strip1.show();
  }

  if (distance2 < 200 && distance2 > 50 && tilt == LOW) {
    for(int i=0; i<NUM_PIXELS; i++) {
      strip2.setPixelColor(i, 255, 255, 0);
    }
    strip2.show();
  } else if (distance2 < 200 && distance2 > 50&& tilt == HIGH) {
    for(int i=0; i<NUM_PIXELS; i++) {
      strip2.setPixelColor(i, 255, 0, 0);
    }
    strip2.show();
    tone(PIEZO_PIN, 500);
    delay(100);
    noTone(PIEZO_PIN);
    delay(100);
  } else if (distance2 < 50 && speed > 100) {
    for(int i=0; i<NUM_PIXELS; i++) {
      strip2.setPixelColor(i, 255, 0, 0);
    }
    strip2.show();
    tone(PIEZO_PIN, 500);
    delay(100);
    noTone(PIEZO_PIN);
    delay(500);
  } else {
    for(int i=0; i<NUM_PIXELS; i++) {
      strip2.setPixelColor(i, 0, 0, 0);
    }
    strip2.show();
  }
  Serial.print("Tilt=");
  Serial.println(tilt);
}

, 👍0

Обсуждение

Добавьте отладочный оператор Serial.print() после каждого оператора tone(), чтобы знать, какой из них выполняется неправильно. Или, возможно, вы уже знаете об этом по цвету светодиодного индикатора., @6v6gt


1 ответ


1

В нескольких операторах if/else есть зависимость от 'tilt', и код ожидает значения HIGH и LOW. И хотя TILT_PIN считывается в каждом цикле, он статичен, поскольку ничто не заставляет его меняться. Предложение: инициализировать его значение в 'void setup()' и предоставить код, который записывает данные в TILT_PIN в соответствии с условиями.

,

Это *может* быть решением, но что вы подразумеваете под «статичным»? tilt считывается и обновляется в каждом цикле. Однако, если вы имеете в виду ручную установку tilt в различные тестовые значения для корректной проверки кода, то вы, вероятно, на правильном пути. Пожалуйста, [отредактируйте] и уточните комментарий «статичный»., @Greenonline