аналоговый читать только один раз

Я работал над школьным проектом, где мне нужно получить аналоговую форму чтения A0 и проверить, если мое значение больше некоторой границы (например, 500), чтобы вернуть 0 или 1 ну с простым кодом в бесконечной петле это будет продолжать возвращать 0000000 и 1111111 для бесконечности но нужно 1 только один раз, когда мое аналоговое значение проходит от 900 до 300, например, и мне не нужно один раз, когда он остается на уровне 300. и та же проблема для 0: мне нужно 0 только один раз, когда она проходит от 300 до 900, а не 0 от пребывания на уровне 900 спасибо за помощь заранее

1 голос | спросил Karem Ben Chikha 16 MarpmFri, 16 Mar 2018 19:24:32 +03002018-03-16T19:24:32+03:0007 2018, 19:24:32

2 ответа


1

Сохраните текущее значение чтения И предыдущее значение и проверьте, была ли пересечена граница.

например.

if Previous value < 500 AND current value >= 500
   Going from 0 to 1 -> return/send 1
else if Previous value >= 500 AND current value < 500
   Going from 1 to 0 -> return/send 0

Однако, чтобы сделать его более сложным, у вас могут быть эффекты debouncing, например. что, если значение движется в течение некоторого времени около 500, чтобы перейти к 200 ... Это все равно приведет к возможно большому изменению границы 0 и 1.

Вы можете легко исправить это, используя два разных значения: путем проверки перехода ниже <490 и выше,> 510 (или любое другое соответствующее значение). Или используйте механизм дебюта, где он должен быть ниже или выше значения 500 для минимального (но короткого) времени.

ответил Michel Keijzers 16 MarpmFri, 16 Mar 2018 19:30:10 +03002018-03-16T19:30:10+03:0007 2018, 19:30:10
0

Что вы говорите, это порог с гистерезисом . В основном, как цифровые входы работают с помощью триггеров schmit .

+------+ 1023
| HIGH |
+------+ 900
| DEAD |
+------+ 300
| LOW  |
+------+ 0

То, что вы хотите сделать, должно выполняться в двух разных разделах:

  1. Обнаружение входящего аналогового уровня и
  2. Управление и запись состояния.

Первая часть достаточно проста:

int val = analogRead(0);
if (val > 900) {
    // High
} else if (val < 300) {
    // Low
}

С этим у вас есть два блока кода, которые подходят для двух групп, которые вас интересуют. Это фактически похоже на кнопку - у вас есть сигнал «HIGH» и «LOW», точно так же, как digitalRead() дает вам цифровой вход. Теперь вам просто нужно связать это с помощью стандартного кнопочного переключателя. То есть - только изменить статус, если статус действительно должен измениться. И это достаточно просто. Например:

if (newStatus != oldStatus) {
    oldStatus = newStatus;
    // Do something just once
}

Чтобы расширить эту концепцию, вы получаете:

static bool enabled = false; // This is the saved status

int val = analogRead(0); // The incoming value

if (val > 900) { // A HIGH signal.
    if (!enabled) { // It's not already recorded as HIGH
        enabled = true; // Record it as a HIGH
        Serial.println("1");
    }
} else if (val < 300) { // A LOW signal
    if (enabled) { // It's currently HIGH, not LOW...
        enabled = false;
        Serial.println("0");
    }
}

И у вас это есть. Если он ВЫСОКИЙ, и он не записан как HIGH, то это new HIGH. Если он идет низко, и он не записывается как LOW, то это new LOW.

ответил Majenko 16 MarpmFri, 16 Mar 2018 19:33:15 +03002018-03-16T19:33:15+03:0007 2018, 19:33:15

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132