Как считать положительные электрические импульсы?

У меня есть устройство с одним мигающим светодиодом.

Я хочу подсчитать количество морганий. Я планировал сделать это с помощью Arduino. Я подключу две клеммы светодиодного входа к цифровым входным контактам Arduino и посчитаю количество положительных импульсов напряжения

Я просто хочу знать, возможно ли это? и если да, то не могли бы вы подсказать код для того же самого?

, 👍3

Обсуждение

имейте в виду, что светодиод можно включить, подав на светодиод Vcc, но его также можно включить, подав 0 В ... все зависит от того, как светодиод подключен в цепи, @jsotola

Посмотрите в IDE Ардуино. Существует пример под названием «Пример изменения состояния». Это то, что вам нужно., @Delta_G

Попытка использовать напряжение на светодиоде может не сработать, потому что оно изменяется только от 0 В до прямого напряжения около 2 В (+/- какая-то десятая). Используйте комментарий jsotola и используйте сторону, которая переключается, это также может быть на токоограничивающем резисторе., @the busybee


2 ответа


1

Вы должны подсчитывать не количество импульсов, а количество переходов от 0 до VCC вольт или от VCC до 0 вольт (называется нарастающим или задним фронтом).

Если вы не хотите паять, вы также можете использовать светочувствительный резистор (LDR) рядом со светодиодом, чтобы измерить разницу в яркости. См. также замечание Крисла ниже.

Подсчет можно выполнять вручную (в цикле, проверяя как можно чаще или необходимо) или настроив таймер для проверки нарастания или спада фронтов.

Я приведу псевдокод, чтобы вы могли понять реальный код:

bool _ldrPin;
unsigned long int _counter;


setup()
{
   // Установить порт
   Serial.begin(9600);

   // Установить LDR
   setAnalogPin(X, INPUT);
   _ldrPin = readAnalog(X);
}

loop()
{
    if (!_ldrPin && readAnalog(X) == HIGH)
    {
        // Нарастающий фронт, увеличение счетчика
        _counter++;
        Serial.Write(_counter);
        _ldrPin = true;
    }
    else if (ldrPin && readAnalog(X) == LOW)
    {
       // Спадающий фронт, статус сброса
        _ldrPin = false;
    }
}
,

Там нет "светодиодного резистора". Я думаю, вы имеете в виду светочувствительный резистор. Хотя я бы не рекомендовал LDR для измерения моргания, они довольно медленные. В зависимости от частоты мигания это вполне может быть слишком медленным. Фототранзистор - лучший выбор (фототранзистор - это в основном диод в обратном направлении, который становится проводящим свет), он может работать очень быстро., @chrisl

Сэр, я планирую паять. Но я думаю, что мне придется припаять оба провода от светодиода. Я тонкая разница в напряжении является относительной, так как я могу сравнить разницу между напряжением (когда светодиод светится) с использованием цифровых контактов., @SSR

@chrisl Спасибо за уведомление (я имею в виду действительно светочувствительный резистор). Я никогда не пробовал фоторезистор (добавил ваше имя, проголосовал за ваш комментарий)., @Michel Keijzers

@SSR По крайней мере, оба провода должны быть к чему-то подключены, иначе у вас не будет (замкнутой) цепи, по крайней мере, со светодиодом в ней. Для сравнения вы можете использовать операционный усилитель, но это, вероятно, стоит другого вопроса., @Michel Keijzers


1

Обнаружение импульсов светодиода

Вы хотите обнаружить каждый импульс светодиода. Для этого вам понадобится код обнаружения границ. В среду IDE встроен пример Arduino, а информация о функции здесь: https://www.arduino.cc/ ru/Tutorial/BuiltInExamples/StateChangeDetection

Чтобы добавить к объяснению Arduino, вы можете определить либо нарастающий фронт (т. е. переход от НИЗКОГО к ВЫСОКОМУ), либо спадающий фронт (т. е. переход от ВЫСОКОГО к НИЗКОМУ). Я лично предпочитаю следующий код для обнаружения нарастающего фронта. Проще говоря, код можно перевести так:

if ( (lastLedState == LOW) && (ledState == HIGH) )

где ledState будет назначаться digitalRead, а lastLedState будет записывать значение ledState в конце функции цикла (т. е. непосредственно перед повторным считыванием состояния светодиода).

Полный код

Теперь, если мы оптимизируем приведенное выше утверждение и поместим его в контекст:

unsigned long int pulseCounter = 0;
const int LedInput = 3;    // Цифровой вход 3
bool ledState = 0;
bool lastLedState = 0;

void setup() {
    
}

void loop() {
    ledState = digitalRead(LedInput);
    
    // Если светодиод загорается
    if (ledState && !lastLedState)
    {
        // Увеличиваем ваш счетчик
        pulseCount++;
    }
    
    // Обновить флаг светодиода
    lastLedState = ledState;
}
,