Официальный сайт компании Arduino по адресу arduino.cc
Существует ли что-то наподобие wait until ?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Сб, 18/11/2017 - 20:18
Доброго времени суток.
Для одного проекта решил использовать Arduino (ранее на ней только лампочки мигал)
Но проблема в том, что на первый взгляд простая задача порождает косяк, который я не соображу как решить.
Вот код:
int mot = 8; //драйвер мотора int mag = 6; //реле магнита void setup() { pinMode(mot, OUTPUT); pinMode(mag, OUTPUT); pinMode(2, INPUT); } void loop() { if(digitalRead(2)==HIGH) //если кнопку зажали { digitalWrite(mag,LOW); //отключаем магнит // вот тут должно стоять что-то типо "wait until" но такого не существует :( if (digitalRead(2)==LOW)//если кнопку отжали { digitalWrite(mot,HIGH); delay (1000); // проворавчиваенм мотор на 1 сек digitalWrite(mot,LOW); digitalWrite(mag,HIGH); //включаем магнит } } }
Косяк в том, что мотор проворачивается и при нажатии и при ОТжатии кнопки. Хочется такую функцию, которая бы "удерживала" код, пока ключ не разомкнется.
Вы забыли написать что Вам нужно сделать, потому я ничего не могу посоветовать.
В тексте же написан полный бред. Смотрите, в строке 14 Вы проверяете, что "digitalRead(2)==HIGH", а затем ПОД ЭТИМ if'ом в строке 20 проверяете что "digitalRead(2)==LOW".
Вы понимаете, что условие в строке 20 никогда не будет истинным? Вернее будет, но только в том уникальном случае, если состояние кнопки успеет поменяться между строками 14 и 20, а это несколько микросекунд.
Да заметил , бред xD
Вот там хочется написать wait until (digitalRead(2)==LOW) но так нельзя.
А алгоритм действий выглядит так :
- Включили arduino
- Реле магнита включено сразу
- Зажимаем кнопку -> Реле отключается
- Ждем пока кнопка не отожмется
- Кнопка отжалась -> провернули мотор, включили реле на магнит
- Ждем пока кнопку опять зажмут
Ну, если уж очень хочется, то: wait until (digitalRead(2)==LOW) => while(digitalRead(2) != LOW)
так алгоритм будет выполняться ...
так алгоритм будет выполняться ...
Работает, но мотор норовит прокрутиться сразу по нажатию кнопки
Работает, но мотор норовит прокрутиться сразу по нажатию кнопки
Дребезг, наверное. Вверху этого раздела несколько прикреплённых тем про кнопки есть - почитайте.
А если пойти совершенно другим путём, допустим использовать case и счетчик?
Но может ли arduino засечь изменения в сигнале (HIGH и LOW) единожды?
То есть LOW -> case 1, HIGH -> case 2, LOW -> case 3 (здесь, после вращения моторам, возвращаем n = 1), LOW -> case 1
Как думаете, правильно рассуждаю?
Да дребизга нет, просто код LoneDog'а мою же ошибку повторяет, а именно строки 19 и 24.
А алгоритм действий выглядит так :
- Включили arduino
- Реле магнита включено сразу
- Зажимаем кнопку -> Реле отключается
- Ждем пока кнопка не отожмется
- Кнопка отжалась -> провернули мотор, включили реле на магнит
- Ждем пока кнопку опять зажмут
Давай я в псевдокоде с комментариями напишу, остальное - дело техники, что называется ;) Ок?
Этот код - блокирующий, с полностью неблокирующей обработкой будет сложнее. И, ещё раз обращаю внимание - это псевдокод, он не будет компилироваться, и предназначен лишь для демонстрации алгоритма. Если код наполнить конкретной логикой, включая антидребезг при проверке кнопки на нажатие - всё будет работать согласно алгоритму.
Зря Вы про антидребезг не слушаете а стоите на своем. С антидребезгом все будет работать.Пробуйте
Зря Вы про антидребезг не слушаете а стоите на своем. С антидребезгом все будет работать.Пробуйте
Признаю, зря. Все как часы заработало !
Как я понял в вашем коде применяется "чувствительность" на изменение сигнала ?
Честно сказать даже не догадывался как это и близко реализовать. Теперь буду знать. Спасибо большое !