Формирователь одиночных импульсов

Elnorth
Offline
Зарегистрирован: 17.04.2022

Всем привет! Пытаюсь собрать формирователь одиночных импульсов на Ардуино. Уровень в программировании – «Начальный», в стадии «неделю назад начал изучение».

В схемотехнике – не плохо. Задача: один и тот же вход (2), и один и тот же выход (13).

На входе возможны 2 состояния:  непрерывный «0» или непрерывная «1». Скетч считывает состояние входа и при поступлении «0» выдает один импульс длительностью 6с, при смене состояния входа на «1» выдает один импульс 4с.

В чем проблема: у меня никак не получается остановить выдачу импульсов. Много вариантов перепробовал и, либо компилятор не могу уговорить, либо не та функция и т. д.

Похожий пример пока не нащел. С уважением приму любую подсказку или помощь по той теме. 

Скетч, который удалось запустить:

Elnorth
Offline
Зарегистрирован: 17.04.2022
const int trigger = 2; //Pin2 as trigger pin.
const int output =  13; //Pin3 as Output pin.
int TimeSt = 4000;        //Preset time delay.
int TimeSp = 6000;


void setup() {
  pinMode(output, OUTPUT);
  pinMode(trigger, INPUT);
}

void loop() {
  if (digitalRead(trigger) == HIGH) {
    digitalWrite(output, HIGH);
    delay(TimeSt);
    digitalWrite(output, LOW);
    delay(6000);                                    
  }
  else {
    digitalWrite(output, HIGH);
    delay(TimeSp);
    digitalWrite(output, LOW);
    delay(6000);
  }
}

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Надо отлавливать изменение ! 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020
void loop() {
  static byte lastState = digitalRead(trigger);
  byte temp = digitalRead(trigger);
  if (temp != lastState)
  {
    lastState = temp;
    if (temp == HIGH) {
      digitalWrite(output, HIGH);
      delay(TimeSt);
      digitalWrite(output, LOW);
      delay(6000);                                    
    }
    else {
      digitalWrite(output, HIGH);
      delay(TimeSp);
      digitalWrite(output, LOW);
      delay(6000);
    }
  }
}

 

Pyotr
Offline
Зарегистрирован: 12.03.2014

А если состояние входа поменяется раньше, чем закончится импульс?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Pyotr пишет:

А если состояние входа поменяется раньше, чем закончится импульс?

Тогда используй прерывание. Если оно уместно в данной задаче...

Pyotr
Offline
Зарегистрирован: 12.03.2014

Это был вопрос больше к ТС, чтобы он точнее сформулировал ТЗ.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Упс, не глянул на ник... ))

Elnorth
Offline
Зарегистрирован: 17.04.2022

[quote=Pyotr]

А если состояние входа поменяется раньше, чем закончится импульс?

 

В реальной схеме это мало вероятно, а, также, дальнейшая обработка сигнала любые непонятки переведет в "стоп".

Elnorth
Offline
Зарегистрирован: 17.04.2022

         V258, Вы Гений! Ваш скетч работает именно так, как и требуется. Огромное спасибо, удачи! Самостоятельно я бы еще очень долго добирался до такого решения, а может быть, и бросил это дело. Теперь оптимизма прибавилось...

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Это ваш скетч с небольшим дополнением. Как вам выше и посоветовали - нужно отслеживать не уровень сигнала, а изменение уровня. Ничего гениального там нет, советую разобраться и вникнуть. Пригодится на будущее.