Количество мигающих светодиодов с датчиком LDR
Как считать +1 все время, если светодиод мигает с датчиком LDR
Изображение:
Если я включаю светодиод, он должен засчитываться в последовательный монитор 1, а если я выключаю светодиод и включаю снова, то он засчитывается в 2.
Чтобы включить светодиод, я должен приложить руку к датчику LDR.
Он также зацикливает текст на последовательном мониторе "Первый датчик LDR темный".
int ledPin1 = 7;
int ledPin2 = 8;
int ledPin3 = 9;
int ldrPin1 = A0;
int ldrPin2 = A1;
int ledTest = 200;
int ldrStatus1 = 0;
int ldrStatus2 = 0;
int ledCheck1 = 0;
int ledCheck2 = 0;
int Count = 0;
void setup() {
Serial.begin(9600);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ldrPin1, INPUT);
pinMode(ldrPin2, INPUT);
}
void loop() {
ldrStatus1 = analogRead(ldrPin1);
ldrStatus2 = analogRead(ldrPin2);
if (ldrStatus1 <= ledTest) {
digitalWrite(ledPin1, HIGH);
Serial.println("First LDR is Dark");
ledCheck1 = 1;
Count++;
Serial.println(Count);
} else {
digitalWrite(ledPin1, LOW);
ledCheck1 = 0;
}
if (ldrStatus2 <= ledTest) {
digitalWrite(ledPin3, HIGH);
Serial.println("Second LDR is Dark");
ledCheck2 = 1;
Count++;
Serial.println(Count);
} else {
digitalWrite(ledPin3, LOW);
ledCheck2 = 0;
}
if ((ledCheck1 == 1) && (ledCheck2 == 1)) {
digitalWrite(ledPin2, HIGH);
Count++;
Serial.println(Count);
} else {
digitalWrite(ledPin2, LOW);
}
}
В данный момент он отсчитывает время, когда он включен, например, секунды.. Как исправить или заставить его работать правильно?
@Joe David, 👍0
Обсуждение1 ответ
Используйте обнаружение изменения состояния и гистерезис для подсчета импульсов в аналоговом сигнале.
const int lowerThreshold = 150;
const int upperThreshold = 200;
const uint8_t analogPin = A0;
const uint8_t ledPin = LED_BUILTIN;
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
}
void loop() {
static bool state = LOW;
static unsigned int counter = 0;
int analogValue = analogRead(analogPin);
if (state == HIGH) {
if (analogValue < lowerThreshold) {
state = LOW;
counter++;
Serial.println(counter);
digitalWrite(ledPin, LOW);
}
} else { // state == LOW
if (analogValue > upperThreshold) {
state = HIGH;
digitalWrite(ledPin, HIGH);
}
}
}
Этот скетч в основном применяет программный триггер Шмитта к аналоговому входному сигналу и увеличивает счетчик на каждом падающем фронте. (Растущий край интенсивности света, потому что ваша конфигурация LDR инвертирует сигнал.)
Красный сигнал - это аналоговый вход LDR. Серая прямоугольная волна - это состояние
(и состояние светодиода). Счетчик увеличивается на каждую черную вертикальную пунктирную линию.
Светодиод всегда горит.., @Joe David
Затем измените пороговые значения. Вы понимаете, как это работает? Это первый шаг., @tttapa
Я изменил нижний порог на 0, и светодиод все еще горел. Сменил ledPin на 7, где находится мой светодиод, и все еще светодиод включен., @Joe David
Этого и следовало ожидать, если вы установите нижний порог равным 0, выключить светодиод будет невозможно. Просмотрите скетч, попытайтесь понять логику. Сначала попробуйте использовать потенциометр (левая клемма заземлена, центральная клемма - A0, правая клемма - 5 В) и установите нижний порог на 256, а верхний порог - на 767. Поверните потенциометр и посмотрите, что происходит со светодиодом. Затем используйте пример analogReadSerial, чтобы увидеть, какие значения вы получаете из LDR. Соответствующим образом отрегулируйте пороговые значения., @tttapa
Отредактировал мой вопрос., @Joe David
@JoeDavid: Вы пробовали предложения из моего предыдущего комментария?, @tttapa
- KY-022 ИК-приемник, светодиод всегда горит, нет выхода
- Как установить таймеры, используя миллисекунды на 3 датчиках PIR?
- Одновременное использование двух датчиков с задержкой
- Затухание светодиода с помощью петли геркона
- Как я могу объединить эти два кода в одной программе? И используйте его в приложении javafx
- Почему светодиодное состояние ведет себя по-другому?
- Несколько условий оператора if
- Какова работа pulseIn?
Я действительно не знаю, о чем вы хотите спросить ... Что означает +1 все время? Должен ли он подсчитывать количество переходов (одного или обоих светодиодов?), Возможно, у вас неверные короткие значения (дешевые LDR), и вам нужно удалить короткие "всплески" / ложные срабатывания., @Michel Keijzers
@MichelKeijzers Когда я кладу руку на датчик LDR, он должен включить индикатор и сообщить на последовательном мониторе, что 1 раз включен, а затем, если я уберу руку, индикатор погаснет. и если я повторю это, сосчитайте до 2, а затем снова до 3..., @Joe David
Вы проверяли, какие значения вы получаете, когда кладете на него руку? И проанализировал их? Распечатайте каждое число (может быть много) и проверьте, ведет ли ваша программа себя так, как вы ожидаете, при использовании полученных вами значений. Возможно, вам придется отфильтровать некоторые из них или использовать среднее значение или другой способ, чтобы удалить некоторые значения, которые вы не ожидали (но датчик все равно отправляет)., @Michel Keijzers
@MichelKeijzers Датчик печатает "Первый LDR темный" и зацикливает его. Как я могу сделать так, чтобы это не было цикла и считалось +1?, @Joe David
Это означает, что если (ldrStatus1 <= ledTest) всегда истинно ... проверьте значение, чтобы увидеть, соответствует ли оно вашим ожиданиям., @Michel Keijzers
Пожалуйста, отредактируйте свой вопрос, чтобы было ясно, о чем вы спрашиваете., @per1234
@per1234 отредактировал мой вопрос., @Joe David