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);
}
}
Работает. Вот прям как написано, так и работает
@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); // ждём отпускания кнопки (если этого не сделать, то условие будет постоянно выполняться и
} // светодиод будет просто постоянно гореть
}
если человек не в состоянии вырезать часть изображения с экрана компьютера и вместо этого выкладывает целый рабочий стол - вряд ли что то толковое из него выйдет.
Это от слова крайняя плоть? Похоже.
Ну ладно ТС - он не знает. Но остальные-то должны знать, что с кнопкой нужно ловить изменение состояния, а не считывать текущее. Не будет тут одиночного импульса, будет серия импульсов, сливающихся в один, пока не будет отпущена кнопка )))
ЗЫ: это вообще костыль костыльный ))
У тебя есть желание провести ТС курс лекций по этой теме? У меня - нет.
Я не хочу ему лекции читать, поэтому так. Поумнеет - сам переделает. Не поумнеет - я ничего не потеряю (особенно - драгоценное время!).
Там вроде уже и не кнопка.
И главное, что он должен увидеть - это совсем не про “кнопку”.
Еще Север есть. Крайний.
позабавил старичка.
Не важно, импульс тоже может быть длинным
Не проверял, но должно работать (с) ))
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); // "отключаем" светодиод
}
}
}
А зачем “унутре”? Это же разные события…
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
))
Как говорит ДедСимен, все коды работают… Но не все так, как задумывалось
Оно всегда работает как написано.
При чём тут вообще кнопка ?
В чём смысл вышеуказанного кода, если в данном случае переменная val может иметь только два значения ?
Откуда два? Одно – по нижней границе (500) и никакого другого она тут не получит. Ну, может там ещё 501 где-то вылезет.
Проверил. Виноват. Вы правы. Два значения: 500 и 502.
С какого перепою?
Будет иметь 1023 значения.
@v258 поправь, а то срач намечается.
Так map() , вроде не обрезает значения?
Сейчас проверю, WOKWI зависает