Почему не работает pulseIn

miskam2259
Offline
Зарегистрирован: 06.11.2015

Доброго времени суток.

Помогите пожалуйста с проблемкой. Пытаюсь запрограммировать две кнопки через 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);
  }
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вероятнее второе.

А что должна делать Ваша программа? (это к тому, что комментарии не совсем соответствуют коду)

miskam2259
Offline
Зарегистрирован: 06.11.2015

Пока мне надо, чтобы она определила какую я кнопку нажимаю.

keefa
Offline
Зарегистрирован: 19.06.2015

Для начала подтяни кнопки к земле либо используй внутреннюю подтяжку и комутируй землю. Если у тебя кнопки висят в воздухе, на входах будет мусор.

miskam2259
Offline
Зарегистрирован: 06.11.2015

По железу здесь всё нормально. Может я неясно сказал: Если закоментировать любой из блоков if, оставшийся прекрасно работает.

Как только раскоментируешь оба, светодиод не моргает совсем.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Для начала уберите мигалки и выведите в консоль значения, полученные из пульсинов.

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

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

применение пульсина для считывания кнопок - сильно концептуально.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Странный подход...

Вы пытаетесь, измерителем частоты нажатий (пардон за такое упрощение), измерить длительность одного нажатия.

С чего бы программе работать?

Вероятно, когда условие всего одно - вы ловите дребезг кнопки, а с двумя условиями в loop() у вас "антидребезг" получается.

Попробуйте "морзянку" набить, может ваш код и сработает... :)

miskam2259
Offline
Зарегистрирован: 06.11.2015

не срабатывает...

Почему "измеритель частоты нажатий"? На сколько я понял это "измеритель длительности нажатия" , а я его и пытаюсь использовать как антидребезг.

Maverik
Offline
Зарегистрирован: 12.09.2012

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() при правильном применении - вполне достаточно.   зачем изобретать лисапет ?

miskam2259
Offline
Зарегистрирован: 06.11.2015
#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 строку, будет работать. Вместе нет! Есть тут какая-то изюминка..

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

miskam2259 пишет:

не срабатывает...

Почему "измеритель частоты нажатий"? На сколько я понял это "измеритель длительности нажатия" , а я его и пытаюсь использовать как антидребезг.

http://arduino.ru/Reference/PulseIn
PulseIn- определяет изменение уровня от заданного уровня, а не просто нажатие на кнопку.

Чтобы всех обхитрить, нужно сначала очень хорошо разобраться в вопросе.

miskam2259
Offline
Зарегистрирован: 06.11.2015

Так это и есть нажатие кнопки )))

Maverik
Offline
Зарегистрирован: 12.09.2012

c чего вы взяли что она определяет изменение уровня от заданного уровня ? она определяет именно переключение уровня, причем с учетом длины сигнала (если есть третий аргумент).

т-стартеру нужно вывести в Serial значения  impulseTimeBut1 и  impulseTimeBut2, посмотреть что там.

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

miskam2259 пишет:

Так это и есть нажатие кнопки )))

по нажатию кнопки функция уходит и ждёт отжатия кнопки или тайм-аута....
сделайте - если нажата кнопка , то измеряем время
а то у тибя две функции ждут тайм-аута , блокируя друг друга :(

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

или разведи последовательность строк
16 , 18 - 23
и
17 , 24 - 33

...это тоже не правильно

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

andriano пишет:

Вероятнее второе.

А что должна делать Ваша программа? (это к тому, что комментарии не совсем соответствуют коду)

зря пропустил-не отреагировал :(

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Maverik пишет:

c чего вы взяли что она определяет изменение уровня от заданного уровня ?

Считывает длину сигнала на заданном порту (HIGH или LOW). Например, если задано считывание HIGH функцией pulseIn(), функция ожидает пока на заданном порту не появиться HIGH. Когда HIGH получен, включается таймер, который будет остановлен когда на порту вход/выхода будет LOW. Функция pulseIn() возвращает длину сигнала в микросекундах. Функция возвращает 0, если в течение заданного времени (таймаута) не был зафиксирован сигнал на порту.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

miskam2259 пишет:

Доброго времени суток.

Помогите пожалуйста с проблемкой. Пытаюсь запрограммировать две кнопки через 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 ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Gippopotam пишет:

Maverik пишет:

c чего вы взяли что она определяет изменение уровня от заданного уровня ?

Считывает длину сигнала на заданном порту (HIGH или LOW). Например, если задано считывание HIGH функцией pulseIn(), функция ожидает пока на заданном порту не появиться HIGH. Когда HIGH получен, включается таймер, который будет остановлен когда на порту вход/выхода будет LOW. Функция pulseIn() возвращает длину сигнала в микросекундах. Функция возвращает 0, если в течение заданного времени (таймаута) не был зафиксирован сигнал на порту.

повтор #10 :)

функция считает время от фронта UP до фронта Down ( или наоборот ), если он больше тайм-аута - то возврат = 0

Считывает длину сигнала на заданном порту (HIGH или LOW).

правильнее - считывает время импульса ( полож или отриц ) ? нет ?
 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

miskam2259 , как подсоединил кнопки ?
отжатая кнопка даёт на пин 0 или 1 ?