Считайть конкретный диапазон выходных данных как 1 единичный выходной сигнал

Датчик LDR выдает диапазон значений, чтобы показать, выключен / включен светодиод, скажем, выше диапазона LDR 400 светодиод включен. Когда светодиод горит, после считывания значений датчика он показывает значение выше диапазона LDR 800, поскольку датчик LDR измеряет в мс, один мигающий светодиод показывает шесть значений LDR 800 +. Есть ли какой-нибудь способ подсчитать все шесть значений LDR 800 +, чтобы увеличить счетчик на 1?

Вот мой вывод в последовательном мониторе. от 314 до 322 светодиод выключен, а от 816 до 851 светодиод включен.

LED : 314
LED : 314
LED : 314
LED : 321
LED : 322
LED : 322
LED : 816
LED : 817
LED : 818
LED : 817
LED : 817
LED : 815
LED : 351
LED : 329
LED : 323
LED : 327
LED : 326
LED : 339

, 👍2

Обсуждение

в чем же проблема?, @Juraj

что вы наблюдаете, когда считаете вспышки света? ... напишите свою программу, чтобы сделать то же самое, @jsotola


3 ответа


0

Насколько я понимаю, вы хотите посчитать значения, при которых горит ваш светодиод (более 800 значений в вашем случае).

Для этого вы можете просто создать условие if, в котором вы говорите, что если значение больше 800, увеличьте счетчик на 1

int count = 0;

if(value>=800):
    count++

Здесь значение переменной - это данные, которые вы печатаете на своем последовательном мониторе, а количество - это ваш счетчик.

Также добавьте условие if внутри функции цикла и объявите переменную count = 0 вне функции цикла

,

Для одного мигания светодиода я получаю более 800 значений. Я хочу, чтобы они считались как одно значение, пока оно не упадет ниже 800. Таким образом, счетчик увеличится на 1, если значения превысят 800, пока он снова не опустится ниже 800. Итак, я хотел знать, есть ли какой-либо способ сделать это в виде кода диапазона, где все значения будут считаться равными 1., @Ihsan Ahmad Siddiquee

Точно то, что я сделал выше, если вы выведете количество на последовательный монитор, вы увидите, что количество увеличивается каждый раз, когда ваше значение превышает 800. Если вы хотите сбросить его, просто добавьте else: count = 0, и счетчик будет сброшен до нуля, как только ваше значение опустится ниже 800, @NOVA1323

смотрите, за одно мгновение я получаю более 800 значений. если я использую for (значения>800){counter++;}, мой счетчик увеличивается на 6-7 за одно мгновение. используя это условие из-за нескольких значений 800+, оно значительно увеличивает счетчик за одно мигание. а я этого не хочу. я хочу увеличить это значение на 1. я не мог думать ни о чем, что могло бы решить эту проблему. вы можете обратиться к моему вопросу. я добавил последовательный вывод на монитор., @Ihsan Ahmad Siddiquee


1

Я не уверен, для чего именно используется значение 400, но приведенный ниже код предназначен для увеличения счетчика при появлении как минимум 6 последовательных значений выше 800.

Ключ в том, чтобы использовать конечный автомат. У меня нет под рукой компилятора, поэтому простите возможные синтаксические ошибки. Сначала мы определяем состояние. В вашем случае есть только две возможности, поэтому используется логическое значение (bool), обычно используется перечисление.

bool _counting = FALSE; 

Нам также нужна константа (или define) и счетчик, чтобы увидеть, сколько значений ON требуется, прежде чем увеличивать счетчик, который ведет обратный отсчет до 0 (и может стать отрицательным, когда появится больше значений ON).

const int MIN_FLASH_LENGTH = 6;
int _onBeforeIncrementing = MIN_FLASH_LENGTH;

Однако мы можем использовать последнюю переменную, чтобы увидеть, происходит ли подсчет, поэтому нам не нужно использовать логическое значение выше.

Затем нам понадобится счетчик для самого количества вспышек:

int _amountOfFlashes = 0;

Обе эти переменные являются глобальными.

Кроме того, в цикле нам нужно проверить значение светодиода.

Таким образом, весь код будет выглядеть следующим образом:

const int MIN_FLASH_LENGTH = 6;

int _onBeforeIncrementing = MIN_FLASH_LENGTH;
int _amountOfFlashes = 0;

void loop()
{
    int ledValue = getLedValue(); // Используйте свой код здесь
    if (ledValue >= 800)
    {
        _onBeforeIncrementing --;
        if (_onBeforeIncrementing == 0)  // Произошла вспышка достаточной длины
        {
            _amountOfFlashes++;
        }
    }
    else // Перезапустить подсчет
    {
        _onBeforeIncrementing = MIN_FLASH_LENGTH;
    }
}

Фрагмент кода

if (_onBeforeIncrementing == 0)
{
    _amountOfFlashes++;
}

может быть сведен к:

 _amountOfFlashes += (_onBeforeIncrementing == 0) : 1 : 0;

Также обратите внимание, что если вам нужно добавить больше кода, используйте имя LED или LDR в глобальных переменных для большей ясности.

,

Для одного мигания светодиода я получаю более 800 значений. Я хочу, чтобы они считались как одно значение, пока оно не упадет ниже 800. Таким образом, счетчик увеличится на 1, если значения превысят 800, пока он снова не опустится ниже 800. Итак, я хотел знать, есть ли какой-либо способ сделать это в виде кода диапазона, где все значения будут считаться равными 1., @Ihsan Ahmad Siddiquee

Я ценю вашу помощь, хотя у меня есть несколько LDR и светодиодов для подсчета, поэтому я хотел иметь что-то унифицированное., @Ihsan Ahmad Siddiquee

В этом случае используйте массивы для каждого светодиода (глобальная переменная). Это будет стоить 800 байт, если вы сделаете это одним (подписанным) байтом., @Michel Keijzers


2

Здесь есть две отдельные проблемы.

Первая проблема заключается в преобразовании аналоговых показаний в двоичное значение. Вы измеряете значение между 314 и 856 и хотите узнать , включен или выключен светодиод. Самое простое решение - сравнить показания с пороговым значением, которое находится примерно в середине диапазона, который вы измеряете. Вы могли бы сказать, например, что индикатор ВЫКЛЮЧЕН, если показания ниже 580, и горит в противном случае:

bool led_is_on = analogRead(ldr_pin) >= 580;

Если показания зашумлены, когда они пересекают пороговое значение (похоже, это не так при коротком интервале данных, который вы показываете), вы можете использовать некоторые методы шумоподавления. Вы могли бы, как предложил Мишель Кейзеры, требуют нескольких последовательных показаний “ВКЛЮЧЕНО”, прежде чем решить , что светодиод действительно включен. Или вы можете исследовать технику использования гистерезис, который был бы моим любимым решением, так как он чрезвычайно прост. Однако, если ваши показания всегда такие же чистые, как то, что вы нам показываете (никогда не колеблющиеся средние значения), вы можете придерживаться простого порогового решения, показанного выше.

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

int blink_count;

void loop() {
    static bool led_was_on = false;
    bool led_is_on = analogRead(ldr_pin) >= 580;
    if (!led_was_on && led_is_on) {
        blink_count++;
    }
    led_was_on = led_is_on;
}

Обратите внимание на условие: !led_was_on && led_is_on означает “Светодиод не был ВКЛЮЧЕНО, и теперь оно включено”.

,