Светодиод с ультразвуковым датчиком расстояния. Заставить светодиод мигать быстрее, когда он приближается на определенное расстояние
у меня уже есть этот код, но я не знаю, как заставить светодиод мигать.
КОД:
const int ledPin = 6; // Вывод вашего светодиода, D06
const int trigPin = 5; // Вывод, к которому подключен ТРИГГЕР, D05
const int echoPin = 4; // Вывод, к которому подключен ЭХО, D04
const int ledOnTime = 1000;
// Время, в течение которого светодиод остается включенным после обнаружения движения (в миллисекундах, 1000 мс = 1 с)
const int trigDistance = 40;
// Расстояние (и меньше его), на котором срабатывает датчик (в сантиметрах)
//
int duration;
int distance;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
digitalWrite(trigPin, LOW);
digitalWrite(trigPin, HIGH);
delay(1);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034/2;
if (distance <= trigDistance) {
digitalWrite(ledPin, HIGH);
delay(ledOnTime);
digitalWrite(ledPin, LOW);
}
delay(100);
}
@rickderchef, 👍1
Обсуждение2 ответа
Я бы сказал, что лучше всего использовать неблокирующий код с помощью millis()
. Посмотрите на пример BlinkWithoutDelay, который поставляется с Arduino IDE. Он не использует
функцию delay()
, что считается плохой практикой кодирования, так как он просто занят ожиданием. Во время задержки больше ничего не может произойти, кроме прерываний. Вместо того, чтобы ждать, лучше регулярно проверять часы, если пришло время что-то делать (так же, как вы бы сделали в реальной жизни, например, для выпечки пиццы).
Часы предоставляются функцией millis()
, которая возвращает количество миллисекунд с момента запуска. Ниже вы видите пример BlinkWithoutDelay. Переменный
интервал
управляет частотой мигания. Если вы удалите ключевое слово const перед ним и измените его в соответствии с измерениями ультразвукового датчика, вы получите изменяющуюся частоту мигания с изменением расстояния.
Попробуйте объединить коды в один. Удалите все вызовы с задержкой ()
, за исключением задержки(1)
(она необходима для срабатывания ультразвукового датчика, и она достаточно мала, чтобы не иметь большого значения).
const int ledPin = LED_BUILTIN;// номер вывода светодиода
// Переменные изменятся:
int ledState = LOW; // используется для установки светодиода
// Как правило, вы должны использовать "unsigned long" для переменных, которые удерживают время
// Значение быстро станет слишком большим для int, чтобы хранить
unsigned long previousMillis = 0; // сохранит, когда индикатор был обновлен последний раз
// константы не изменятся:
const long interval = 1000; // интервал, в течение которого нужно мигать (миллисекунды)
void setup() {
// установите цифровой вывод в качестве выходного:
pinMode(ledPin, OUTPUT);
}
void loop() {
// вот где вы бы поместили код, который должен выполняться все время.
// проверьте, не пора ли мигнуть светодиодом; то есть, если разница
// между текущим временем и последним миганием светодиод больше, чем
// интервал, с которым вы хотите мигать светодиодом.
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// сохраните время, когда вы в последний раз мигали светодиодом
previousMillis = currentMillis;
// если индикатор выключен, включите его и наоборот:
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
// установите индикатор со значением состояния переменной:
digitalWrite(ledPin, ledState);
}
}
Остальное зависит от вас. Если вам нужна дополнительная информация о примере BlinkWithoutDelay, вам следует погуглить его. Существует множество учебных пособий. Это отличный отрывок из кода, так что получайте удовольствие :)
шаг 1: определите свое МИНИМАЛЬНОЕ РАССТОЯНИЕ, МАКСИМАЛЬНОЕ РАССТОЯНИЕ
шаг 2: определите расстояние от датчика
шаг 3: измените значение расстояния до значения от 0 до 255
шаг 4: индикатор затухания в соответствии с масштабированным значением.
Обратите внимание, что: вы не должны использовать функцию задержки() для мигания светодиода. Вместо этого используйте analogWrite (). См. Пример. Мы можем изменить частоту ШИМ, чтобы светодиод перешел от затухания к миганию, используя функцию setPwmFrequency()
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Я исправил форматирование, а также добавил отступ. Вы действительно должны использовать отступ. Это делает код более читаемым. Arduino IDE даже имеет функцию автоформатирования для введения правильного отступа, @chrisl