Зуммер продолжает гудеть, хотя датчик ничего не обнаруживает.
В коде, который я привёл ниже, идея заключалась в том, чтобы создать датчик, обнаруживающий объекты на разных расстояниях . Если они находятся достаточно близко, светодиодная полоса загорается жёлтым цветом, но зуммер не включается. Если же объекты находятся очень близко, светодиодная полоса загорается красным цветом, а зуммер быстро вибрирует. Однако в нашем случае зуммер продолжает вибрировать непрерывно, даже если рядом с датчиком нет никаких объектов. Ниже представлен наш код для ввода:
#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);
}
@vanHellsing, 👍0
Обсуждение1 ответ
В нескольких операторах if/else есть зависимость от 'tilt', и код ожидает значения HIGH и LOW. И хотя TILT_PIN считывается в каждом цикле, он статичен, поскольку ничто не заставляет его меняться. Предложение: инициализировать его значение в 'void setup()' и предоставить код, который записывает данные в TILT_PIN в соответствии с условиями.
Это *может* быть решением, но что вы подразумеваете под «статичным»? tilt считывается и обновляется в каждом цикле. Однако, если вы имеете в виду ручную установку tilt в различные тестовые значения для корректной проверки кода, то вы, вероятно, на правильном пути. Пожалуйста, [отредактируйте] и уточните комментарий «статичный»., @Greenonline
- Может ли Arduino Uno работать со всеми этими компонентами?
- Какова работа pulseIn?
- Сколько датчиков может поддерживать один модуль Arduino?
- Как получить данные о весе с датчиков стеклянных электронных весов для ванной?
- Получение BPM из данного кода
- Датчик Arduino Uno DHT11 Не удалось прочитать данные с датчика DHT
- Цепь с зуммером не работает
- Как подключить более 10 датчиков к Arduino uno r3
Добавьте отладочный оператор Serial.print() после каждого оператора tone(), чтобы знать, какой из них выполняется неправильно. Или, возможно, вы уже знаете об этом по цвету светодиодного индикатора., @6v6gt