Всем добрый день! Моторчик при нажатии на button1 едет в одну сторону, пока не включается концевик (button2). Если button1 отжать, моторчик едет в другую сторону, пока не нажмется концевик (button3). Проблема в том, что когда мотор едет в обратную сторону, он почему-то едет гораздо медленнее! Если убираю из кода button3, все нормально. Подскажите, может как-то по-другому тогда код написать? В чем может быть проблема? Заранее спасибо!
int IN2 = 2; // мотор 1
int IN3 = 3; // мотор 2
const int button1 = 13; // кнопка
const int button2 = 8; // концевик верх
const int button3 = 9; // концевик низ
int button1State = 0; // статус кнопки - нажата или отпущена
int button2State = 0; // статус кнопки - нажата или отпущена
int button3State = 0; // статус кнопки - нажата или отпущена
void setup()
{
pinMode (IN2, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode(button1, INPUT);
pinMode(button2, INPUT);
pinMode(button3, INPUT);
}
void loop()
{
button1State = digitalRead(button1);
button2State = digitalRead(button2);
button3State = digitalRead(button3);
if (button1State == HIGH && button2State == LOW) {
digitalWrite (IN3, HIGH);
digitalWrite (IN2, LOW);
}
else {
digitalWrite (IN2, LOW);
digitalWrite (IN3, LOW);
}
if (button1State == LOW && button3State == LOW) {
digitalWrite (IN2, HIGH);
digitalWrite (IN3, LOW);
}
else {
digitalWrite (IN2, LOW);
digitalWrite (IN3, LOW);
}
}
Кнопки , на вашей схеме, когда нажаты читаются LOW, поэтому должны быть INPUT_PULLUP (см. #3)
Концевики же, скорее всего, когда нажаты, читаются HIGH.(проверьте это), и, значит должны быть просто INPUT.
Сначала с этим разобраться, а дальше ещё с логикой разбираться надо (как выше сказали)
В условии 22 включается, в условии 33 выключается. Это при нажатии одной любой кнопки. Кривая логика. @kalapanga уже сказал об этом.
Условия без ELSE перепиши.
Опиши сам для себя логику простыми словами.
Внтмательно посмотри алгоритм. При нажатой кнопке1 срабатывает в первом IF ветка ИСТИНА, во втором IF ветка ЛОЖЬ
При НЕ НАЖАТОЙ в первом IF ЛОЖЬ,во втором IF ИСТИНА:
В связи с чем возникает вопрос: мотор как-то механически возвращается? Т.к. судя по коду при не нажатой кнопке он или обесточен или заторможен.
Алгоритм - если нажата кнопка 1 и не нажат концевик 2, мотор двигается вперед. Если концевик 2 нажимается, мотор останавливается.
Если отжимаем кнопку 1, мотор едет назад, пока не нажмется концевик 3. Если концевик нажат, остановить моторы.
Если я во всем этом убираю else, то нажатия концевиков не срабатывают
Дело не в наличии оператора else или его отсутствии. Никто не говорит, что его нельзя использовать. Используйте на здоровье!
Но у Вас желаемое поведение запрограммировано неправильно. Вам поняли, в чём именно? Подумайте и попробуйте переписать.
Да вот думаю уже пол дня. Сделал для нажатия кнопки отдельный цикл, для отжатия кнопки отдельный - он также медленно едет назад. Понять не могу в чем дело уже.