Количество мигающих светодиодов с датчиком 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);
   }

}

В данный момент он отсчитывает время, когда он включен, например, секунды.. Как исправить или заставить его работать правильно?

, 👍0

Обсуждение

Я действительно не знаю, о чем вы хотите спросить ... Что означает +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


1 ответ


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 инвертирует сигнал.) Schmitt Trigger Waveforms

Красный сигнал - это аналоговый вход LDR. Серая прямоугольная волна - это состояние (и состояние светодиода). Счетчик увеличивается на каждую черную вертикальную пунктирную линию.

,

Светодиод всегда горит.., @Joe David

Затем измените пороговые значения. Вы понимаете, как это работает? Это первый шаг., @tttapa

Я изменил нижний порог на 0, и светодиод все еще горел. Сменил ledPin на 7, где находится мой светодиод, и все еще светодиод включен., @Joe David

Этого и следовало ожидать, если вы установите нижний порог равным 0, выключить светодиод будет невозможно. Просмотрите скетч, попытайтесь понять логику. Сначала попробуйте использовать потенциометр (левая клемма заземлена, центральная клемма - A0, правая клемма - 5 В) и установите нижний порог на 256, а верхний порог - на 767. Поверните потенциометр и посмотрите, что происходит со светодиодом. Затем используйте пример analogReadSerial, чтобы увидеть, какие значения вы получаете из LDR. Соответствующим образом отрегулируйте пороговые значения., @tttapa

Отредактировал мой вопрос., @Joe David

@JoeDavid: Вы пробовали предложения из моего предыдущего комментария?, @tttapa