работает схема но не так как надо

mrDobryj
Offline
Зарегистрирован: 15.02.2015

Друзья. собрал схему. Написал программу. Всё работает,но...

Задача в том что нажимаю одну кнопку мотор крутит влево. Нажимаю другую - вправо. А в результате крутит куда хочет. И когда нажимаю много раз на одну кнопку также криутит то влево то вправо. В чем проблема?

 

Прикладываю схему сборки и скетч

http://pixs.ru/showimage/shemamotor_7779304_17186882.jpg

 

Вот скетч:

int m1=4;
int m2=5;
int b1=7;
int b2=8;

void setup() {
pinMode(m1, OUTPUT);
pinMode(m2, OUTPUT);
pinMode(b1, INPUT);
pinMode(b2, INPUT);
}

void loop() {
// Основной код
if (digitalRead(b1)){
digitalWrite(m1, HIGH);
digitalWrite(m2, LOW);
delay(4000);
}
if (digitalRead(b2)){
digitalWrite(m2, HIGH);
digitalWrite(m1, LOW);
delay(4000);
}

}
//здесь мотор подключен к пинам 4 и 5, кнопки к 7 и 8

 

Coolerr
Offline
Зарегистрирован: 30.06.2014

А с чем сравнивается if? Прочитали состояние входа и чё дальше?

mrDobryj
Offline
Зарегистрирован: 15.02.2015

заметил еще одну особенность. При долгом удерживании кнопки направление может меняться прямо во время нажатия

mrDobryj
Offline
Зарегистрирован: 15.02.2015

"else"

Отметим, что конструкция else if может быть использована с или без заключительного else и наоборот. Допускается неограниченное число таких переходов else if.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

У Вас кнопка при нажатии даёт низкий уровень на входе, а Вы проверяет на высокий. Задержка на 4 секунды зачем такая большая?

mrDobryj
Offline
Зарегистрирован: 15.02.2015

delay убрал из кода вообще. Заработало как надо. А ставил 50 было точно также. Интересно....

Sloper
Sloper аватар
Offline
Зарегистрирован: 30.03.2015

Надо кнопки подтянуть на землю резисторами. И учесть дебонсинг.

vov4ik
Offline
Зарегистрирован: 10.09.2013

Coolerr пишет:

А с чем сравнивается if? Прочитали состояние входа и чё дальше?

сдесь не обезательно сравнивать, действие выполняется при истина != 0  и не выполняется лож == 0 примеры:

if(1)   //истина
if(0)  //лож
if((1+4-5))  //лож
// а теперь смотрим внимательно
if((0*1+1))  //истина
if((1+1*0))  //лож

По теме устранить наводку на кнопки (занулить резистором на 10к) и всё будет работать.