Не выходит короткий импульс

const int RE = A0;     // Потенциометр на A0
const int BU = 7;      // Входной сигнал (через делитель) на цифровом 7
const int OUT = 4;     // Выходной сигнал на цифровом 4

void setup() {
  pinMode(BU, INPUT);    // Настройка BU как вход
  pinMode(OUT, OUTPUT);  // Настройка OUT как выход
}

void loop() {
  // Чтение значения потенциометра и преобразование в длительность импульса
  int val = analogRead(RE);
  val = map(val, 0, 1023, 500, 3000);  // 500-3000 микросекунд

  // Если на входе BU обнаружен высокий уровень (импульс)
  if (digitalRead(BU) == HIGH) {
    // Генерация импульса на OUT
    digitalWrite(OUT, HIGH);
    delayMicroseconds(val);  // Задержка согласно потенциометру
    digitalWrite(OUT, LOW);
  }
}

Работает. Вот прям как написано, так и работает

1 лайк

@Juzame , ничему ты не научишься пока не начнешь книжки читать.
Между прочим, чтение литературы (художественной) развивает воображение, абстрактное мышление и вообще учит ДУМАТЬ. А техническая литература учит думать и применять полученные знания.

Не проверял, должно работать
const int RE = A0;                      // к А0 подключен движок переменного резистора
const int BU = 7;                       // к 7 выводу подключена кнопка (при нажатии соединяет пин с GND)
const int OUT = 4;                      // с 4 выход на светодиод (светодиод соединяется вторым выводом через резистор с GND)
int val = 0;                            // переменная для хранения оцифрованного значения

void setup() {
  
  pinMode (OUT, OUTPUT);                // пин, куда подключен светодиод, настраиваем как "выход"
  pinMode (BU, INPUT_PULLUP);           // пин, куда подключена кнопка, настраиваем как "вход" с "подтяжкой к VCC (HIGH)"
}

void loop() {
  
  int val = digitalRead(RE);            // присваиваем значение напряжения, считанное с движка резистора и оцифрованное 10-битным АЦП
  val = map(val, 0, 1023, 500, 3000);   // приводим значение (0..1023) к нужному нам диапазону значений (500..3000)

  if (digitalRead(BU) == LOW) {         // если нажали кнопку
    digitalWrite(OUT, HIGH);            // подаем на светодиод высокий уровень, светодиод "включается"
    delayMicroseconds(val);             // ждём паузу, согласно считанному и приведенному значению val
    digitalWrite(OUT, LOW);             // "отключаем" светодиод
    while (digitalRead(BU) == LOW);     // ждём отпускания кнопки (если этого не сделать, то условие будет постоянно выполняться и 
  }                                     // светодиод будет просто постоянно гореть
}

если человек не в состоянии вырезать часть изображения с экрана компьютера и вместо этого выкладывает целый рабочий стол - вряд ли что то толковое из него выйдет.

1 лайк

Это от слова крайняя плоть? Похоже.

1 лайк

Ну ладно ТС - он не знает. Но остальные-то должны знать, что с кнопкой нужно ловить изменение состояния, а не считывать текущее. Не будет тут одиночного импульса, будет серия импульсов, сливающихся в один, пока не будет отпущена кнопка )))

ЗЫ: это вообще костыль костыльный ))

У тебя есть желание провести ТС курс лекций по этой теме? У меня - нет. :grinning_face:

Я не хочу ему лекции читать, поэтому так. Поумнеет - сам переделает. Не поумнеет - я ничего не потеряю (особенно - драгоценное время!).

Там вроде уже и не кнопка.
И главное, что он должен увидеть - это совсем не про “кнопку”.

Еще Север есть. Крайний.

позабавил старичка.

Не важно, импульс тоже может быть длинным

Не проверял, но должно работать (с) ))
const int RE = A0;  // к А0 подключен движок переменного резистора
const int BU = 7;   // к 7 выводу подключена кнопка (при нажатии соединяет пин с GND)
const int OUT = 4;  // с 4 выход на светодиод (светодиод соединяется вторым выводом через резистор с GND)
int val = 0;        // переменная для хранения оцифрованного значения

void setup() {

  pinMode(OUT, OUTPUT);       // пин, куда подключен светодиод, настраиваем как "выход"
  pinMode(BU, INPUT_PULLUP);  // пин, куда подключена кнопка, настраиваем как "вход" с "подтяжкой к VCC (HIGH)"
}

void loop() {

  int val = analogRead(RE);           // присваиваем значение напряжения, считанное с движка резистора и оцифрованное 10-битным АЦП
  val = map(val, 0, 1023, 500, 3000);  // приводим значение (0..1023) к нужному нам диапазону значений (500..3000)

  static uint8_t last_btn_state = HIGH;  // текущее состояние кнопки

  if (digitalRead(BU) != last_btn_state) {  // если состояние кнопки изменилось, сохраняем его
    last_btn_state = !last_btn_state;

    if (last_btn_state == LOW) {  // если кнопка была нажата
      digitalWrite(OUT, HIGH);    // подаем на светодиод высокий уровень, светодиод "включается"
      delayMicroseconds(val);     // ждём паузу, согласно считанному и приведенному значению val
      digitalWrite(OUT, LOW);     // "отключаем" светодиод
    }
  }
}
2 лайка

А зачем “унутре”? Это же разные события…

if (digitalRead(BU) != last_btn_state) {  // если состояние кнопки изменилось, сохраняем его
  last_btn_state = !last_btn_state;
}

if (last_btn_state == LOW) {  // если кнопка была нажата
  digitalWrite(OUT, HIGH);    // подаем на светодиод высокий уровень, светодиод "включается"
  delayMicroseconds(val);     // ждём паузу, согласно считанному и приведенному значению val
  digitalWrite(OUT, LOW);     // "отключаем" светодиод
}

Затем, что срабатывать должно только при смене состояния с HIGH на LOW. А в твоем варианте оно по прежнему будет лупить, пока состояние LOW ))

Как говорит ДедСимен, все коды работают… Но не все так, как задумывалось

Оно всегда работает как написано.

1 лайк

При чём тут вообще кнопка ?
В чём смысл вышеуказанного кода, если в данном случае переменная val может иметь только два значения ?

1 лайк

Откуда два? Одно – по нижней границе (500) и никакого другого она тут не получит. Ну, может там ещё 501 где-то вылезет.


Проверил. Виноват. Вы правы. Два значения: 500 и 502.

С какого перепою?

1 лайк

Будет иметь 1023 значения.

@v258 поправь, а то срач намечается.

1 лайк

Так map() , вроде не обрезает значения?
Сейчас проверю, WOKWI зависает