Почему не работает pulseIn
- Войдите на сайт для отправки комментариев
Пт, 06/11/2015 - 06:31
Доброго времени суток.
Помогите пожалуйста с проблемкой. Пытаюсь запрограммировать две кнопки через PulseIn. По одиночке они работают нормально. Как только прописываешь обе сразу вообще никакой реакции. Наверно я что-то об этой функции не знаю, или не правильно представляю её работу...
const byte but1=2,but2=3,led=13;
void setup() {
pinMode(but1,INPUT);
pinMode(but2,INPUT);
pinMode(led,OUTPUT);
}
void loop() {
if (pulseIn(but1,HIGH)>20000){ //Если нажатие на but1 дольше 20 миллисекунд
digitalWrite(led,HIGH); //загорается светодиод на 1 секунду.
delay(1000);
digitalWrite(led,LOW);
}
if (pulseIn(but2,HIGH)>20000){ //Если нажатие на but2 дольше 20 миллисекунд
digitalWrite(led,HIGH); //Два раза моргнуть светодиодом
delay(250);
digitalWrite(led,LOW);
delay(250);
digitalWrite(led,HIGH);
delay(250);
digitalWrite(led,LOW);
}
}
Вероятнее второе.
А что должна делать Ваша программа? (это к тому, что комментарии не совсем соответствуют коду)
Пока мне надо, чтобы она определила какую я кнопку нажимаю.
Для начала подтяни кнопки к земле либо используй внутреннюю подтяжку и комутируй землю. Если у тебя кнопки висят в воздухе, на входах будет мусор.
По железу здесь всё нормально. Может я неясно сказал: Если закоментировать любой из блоков if, оставшийся прекрасно работает.
Как только раскоментируешь оба, светодиод не моргает совсем.
Для начала уберите мигалки и выведите в консоль значения, полученные из пульсинов.
Также , задавая вопросы по работе программно-аппаратных устройств необходимо публиковать не только код , но и схему.
Понимание слова нормально у ТС и читающих топик может различаться, потому желательно подробно описывать каое поведение устройства ожидается.
применение пульсина для считывания кнопок - сильно концептуально.
Странный подход...
Вы пытаетесь, измерителем частоты нажатий (пардон за такое упрощение), измерить длительность одного нажатия.
С чего бы программе работать?
Вероятно, когда условие всего одно - вы ловите дребезг кнопки, а с двумя условиями в loop() у вас "антидребезг" получается.
Попробуйте "морзянку" набить, может ваш код и сработает... :)
не срабатывает...
Почему "измеритель частоты нажатий"? На сколько я понял это "измеритель длительности нажатия" , а я его и пытаюсь использовать как антидребезг.
1) прежде всего - неправильный стиль работы с функциями ввода-вывода в порты мк. вы заставляете логический оператор if ждать, что там у вас получится в круглых скобках в реальном времени. так не должно быть, думаю проблема именно в этом. одно такое извращение мк терпит а два в параллели- уже не хочет, на нём же нет многозадачной убунты, а прерывания Вы не используете ))
попробуйте так :
unsigned long impulseTime=0; // можно попробовать unsigned int
unsigned long maxTime=20000; // можно попробовать unsigned int
impulseTime = pulseIn(but2,HIGH);
if (impulseTime > maxTime) { .... }
2) не объявляйте номера портов через const byte, вообще-то по мануалу там тип int, хотя не суть важно, в любом случае лучше через #define. у Вас интересный стиль - там где необходима переменная, Вы от нее избавляетесь, а там где она не нужна - она есть ))
3) попробуйте Ваши delay() поднять на одну строчку выше. чтобы между pulseIn() и первым digitalWrite() тоже была пауза.
4) если Вы натренируете привычку на время отладки отправлять ключевые переменые в Serial у Вас таких вопросов будет на много меньше. посмотрите, что у Вас получается в переменной impulseTime
5) есть масса коротких и вполне удобных готовых функций для работы с дребезгом, причем даже подтяжка не требуется (хотя лучше, конечно, подтянуть). как ни удивительно на первый взгляд, на самом деле digitalRead() при правильном применении - вполне достаточно. зачем изобретать лисапет ?
#define but1 2 #define but2 3 #define led 13 void setup() { Serial.begin(9600); pinMode(but1,INPUT); pinMode(but2,INPUT); pinMode(led,OUTPUT); } void loop() { unsigned long impulseTimeBut1=0; unsigned long impulseTimeBut2=0; unsigned long maxTime=20000; impulseTimeBut1 = pulseIn(but1,HIGH); impulseTimeBut2 = pulseIn(but2,HIGH); if (impulseTimeBut1>maxTime){ delay(250); digitalWrite(led,HIGH); delay(1000); digitalWrite(led,LOW); } if (impulseTimeBut2>maxTime){ delay(250); digitalWrite(led,HIGH); delay(250); digitalWrite(led,LOW); delay(250); digitalWrite(led,HIGH); delay(250); digitalWrite(led,LOW); } }И та же история, если закоментировать по отдельности 16 или 17 строку, будет работать. Вместе нет! Есть тут какая-то изюминка..
не срабатывает...
Почему "измеритель частоты нажатий"? На сколько я понял это "измеритель длительности нажатия" , а я его и пытаюсь использовать как антидребезг.
http://arduino.ru/Reference/PulseIn
PulseIn- определяет изменение уровня от заданного уровня, а не просто нажатие на кнопку.
Чтобы всех обхитрить, нужно сначала очень хорошо разобраться в вопросе.
Так это и есть нажатие кнопки )))
c чего вы взяли что она определяет изменение уровня от заданного уровня ? она определяет именно переключение уровня, причем с учетом длины сигнала (если есть третий аргумент).
т-стартеру нужно вывести в Serial значения impulseTimeBut1 и impulseTimeBut2, посмотреть что там.
Так это и есть нажатие кнопки )))
по нажатию кнопки функция уходит и ждёт отжатия кнопки или тайм-аута....
сделайте - если нажата кнопка , то измеряем время
а то у тибя две функции ждут тайм-аута , блокируя друг друга :(
или разведи последовательность строк
16 , 18 - 23
и
17 , 24 - 33
...это тоже не правильно
Вероятнее второе.
А что должна делать Ваша программа? (это к тому, что комментарии не совсем соответствуют коду)
зря пропустил-не отреагировал :(
c чего вы взяли что она определяет изменение уровня от заданного уровня ?
Считывает длину сигнала на заданном порту (HIGH или LOW). Например, если задано считывание HIGH функцией pulseIn(), функция ожидает пока на заданном порту не появиться HIGH. Когда HIGH получен, включается таймер, который будет остановлен когда на порту вход/выхода будет LOW. Функция pulseIn() возвращает длину сигнала в микросекундах. Функция возвращает 0, если в течение заданного времени (таймаута) не был зафиксирован сигнал на порту.
Доброго времени суток.
Помогите пожалуйста с проблемкой. Пытаюсь запрограммировать две кнопки через PulseIn. По одиночке они работают нормально. Как только прописываешь обе сразу вообще никакой реакции. Наверно я что-то об этой функции не знаю, или не правильно представляю её работу...
const byte but1=2,but2=3,led=13; void setup() { pinMode(but1,INPUT); pinMode(but2,INPUT); pinMode(led,OUTPUT); } void loop() { if (pulseIn(but1,HIGH)>20000){ //Если нажатие на but1 дольше 20 миллисекунд digitalWrite(led,HIGH); //загорается светодиод на 1 секунду. delay(1000); digitalWrite(led,LOW); } if (pulseIn(but2,HIGH)>20000){ //Если нажатие на but2 дольше 20 миллисекунд digitalWrite(led,HIGH); //Два раза моргнуть светодиодом delay(250); digitalWrite(led,LOW); delay(250); digitalWrite(led,HIGH); delay(250); digitalWrite(led,LOW); } }этому коду пофиг как подключены кнопки......
и результат зрительно надо отслеживать
как подсоединил кнопки ?
отжатая кнопка даёт на пин 0 или 1 ?
c чего вы взяли что она определяет изменение уровня от заданного уровня ?
Считывает длину сигнала на заданном порту (HIGH или LOW). Например, если задано считывание HIGH функцией pulseIn(), функция ожидает пока на заданном порту не появиться HIGH. Когда HIGH получен, включается таймер, который будет остановлен когда на порту вход/выхода будет LOW. Функция pulseIn() возвращает длину сигнала в микросекундах. Функция возвращает 0, если в течение заданного времени (таймаута) не был зафиксирован сигнал на порту.
повтор #10 :)
функция считает время от фронта UP до фронта Down ( или наоборот ), если он больше тайм-аута - то возврат = 0
Считывает длину сигнала на заданном порту (HIGH или LOW).
правильнее - считывает время импульса ( полож или отриц ) ? нет ?
miskam2259 , как подсоединил кнопки ?
отжатая кнопка даёт на пин 0 или 1 ?