Ультразвуковой датчик и проблема с цветом светодиодной ленты
Итак, я сделал датчик парковки с ультразвуковым датчиком и светодиодной полосой. Но светодиодная полоса не становится желтой или зеленой. Думаю, это связано с порогами. Может ли кто-нибудь помочь мне настроить это? Я также хочу более длинное расстояние больше, чем 1 метр. Это мой код:
#include "FastLED.h"
#include <math.h>
#define NUM_LEDS 32
#define BRIGHTNESS 10
#define DATA_PIN 4
// Определяем массив светодиодов
CRGB leds[NUM_LEDS];
// Пины модуля
#define trigPin 11
#define echoPin 12
// Пороги (в CM)
long SECTION_SIZE = 80;
long STOP_DISTANCE = 60;
long WARNING_THRESHOLD = 50;
long MAX_THRESHOLD = 375;
long RED_THRESHOLD = STOP_DISTANCE;
long YELLOW_THRESHOLD = RED_THRESHOLD + SECTION_SIZE;
long GREEN_THRESHOLD = YELLOW_THRESHOLD + SECTION_SIZE;
const int numReadings = 5;
int readings[numReadings]; // показания с аналогового входа
int readIndex = 0; // индекс текущего показания
int total = 0; // промежуточный итог
int average = 0; // среднее
void setup() {
Serial.begin (9600);
FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
FastLED.setBrightness(10);
// Настройка HC-SR04
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// инициализируем все показания равными 0:
for (int thisReading = 0; thisReading < numReadings; thisReading++) {
readings[thisReading] = 0;
}
}
void loop() {
long distance, lastRun;
bool red, yellow, green;
total = total - readings[readIndex];
readings[readIndex] = calculateDistance();
total = total + readings[readIndex];
readIndex++;
if (readIndex >= numReadings) readIndex = 0;
distance = abs(total / numReadings);
yellow = distance <= YELLOW_THRESHOLD && distance > RED_THRESHOLD;
red = distance <= RED_THRESHOLD;
green = distance > YELLOW_THRESHOLD && distance <= GREEN_THRESHOLD;
if (red) {
setRed();
} else if (yellow) {
setYellow(distance);
} else if (green) {
setGreen(distance);
} else {
setGreenStandby();
}
Serial.print(distance);
Serial.println(" cm");
FastLED.show();
delay(1);
}
void lightItUp(const CRGB& pColor, const CRGB& sColor, uint16_t travel) {
uint16_t travelFix = travel * (NUM_LEDS/SECTION_SIZE);
uint16_t leftStop = travelFix/2;
uint16_t rightStop = NUM_LEDS - leftStop;
for (int i = 0; i < NUM_LEDS; i++) {
if (i < leftStop || i > rightStop) {
leds[i] = pColor;
} else {
leds[i] = sColor;
}
}
FastLED.show();
}
long calculateDistance() {
long duration;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
return (duration/2) / 29.1;
}
void setGreenStandby() {
return fill_solid(leds, NUM_LEDS, CRGB::Black);
}
void setRed() {
return fill_solid(leds, NUM_LEDS, CRGB::Red);
}
void setGreen(long distance) {
long travel = GREEN_THRESHOLD - distance;
return lightItUp(CRGB::Yellow, CRGB::Green, travel);
}
void setYellow(long distance) {
long travel = YELLOW_THRESHOLD - distance;
return lightItUp(CRGB::Red, CRGB::Yellow, travel);
}
@Tnm Scht, 👍1
Обсуждение1 ответ
Я считаю, что ваша ошибка в этой части кода:
yellow = distance <= YELLOW_THRESHOLD && distance > RED_THRESHOLD;
red = distance <= RED_THRESHOLD;
green = distance > YELLOW_THRESHOLD && distance <= GREEN_THRESHOLD;
if (red) {
setRed();
} else if (yellow) {
setYellow(distance);
} else if (green) {
setGreen(distance);
} else {
setGreenStandby();
}
В частности, вы определяете три логические переменные независимо друг от друга, а затем переключаетесь на основе их значений.
Предполагая, что вы видите правильные значения, выводимые на последовательный монитор (например, 90 см
, 60 см
и т. д.), в чем я не уверен. так как я не понимаю, как вы определяете расстояние, то следующее должно быть легче следовать/понимать:
if (distance > GREEN_THRESHOLD) {
setGreenStandby();
} else if (distance > YELLOW_THRESHOLD) {
setGreen(distance);
} else if (distance > RED_THRESHOLD) {
setYellow(distance);
} else {
setRed();
}
У вас есть только одна переменная, определяющая конфигурацию светодиодной ленты, не нужно переходить к трем, а затем снова пытаться уменьшить ;-)
Обратите внимание, что ваш YELLOW_THRESHOLD
определяется как 140
. Если вы никогда не видите сообщение в последовательном мониторе, превышающее это значение, у вас нет шанс увидеть любой цвет, кроме красного.... Я спрашиваю, потому что вы упомянули Я также хочу большее расстояние, чем 1 метр, что может означать, что ваш датчик не может пройти дальше 1 метра. ..
С помощью приведенного выше кода я проверяю расстояние в порядке от большего к меньшему: активируется только первое совпадение, и переменная distance
не может соответствовать более чем одному условию. Вообще говоря, чем проще, тем лучше.
- Печать string and integer LCD
- Почему мои часы реального времени показывают неверное время с моего ПК?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Отправьте несколько значений int из Python в Arduino, используя pySerial
- Глобальные переменные занимают много места в динамической памяти.
- (Код ультразвукового датчика: такого файла или каталога нет)
- rfid_default_keys проверить с помощью RC522
- Команда strtok() с Serial связью
что такое «дальнее расстояние больше 1 метра»? .... пожалуйста, опишите, что именно вы хотите, чтобы код делал ..... также точно опишите, что он делает прямо сейчас ..... добавьте информацию к вопросу выше .... НЕ добавляйте информацию в комментарии, @jsotola