Библиотека кнопок GyverButton и шаговик 28BYJ-48 с драйвером ULN2003

Arduin01
Offline
Зарегистрирован: 07.02.2021

Хочу создать простейший макет лифта. Когда кнопка только 1 - всё работает безупречно. Однако если добавить 2 или 3, а то и обе кнопки сразу - в порт бесконечно выводится текст, что кнопка 2 или 3 нажата, даже если ничего не нажимать. А шаговик только греется и очень медленно вращается в одну сторону. Начинающий немного, пока хочу переписать код на OneButton. Вот код:\

#include <GyverStepper.h>
#include <AnalogKey.h>
#include <GyverButton.h>
#define redpin A2
#define greenpin A3
GButton lift1(2);
GButton lift2(3);
GButton lift3(4);
bool liftflag1 = true;
bool liftflag2 = false;
bool liftflag3 = false;

GStepper<STEPPER4WIRE> ENGINE(2048, 11, 9, 10, 8); 
void setup() {
  // Открытие порта
  Serial.begin(9600);
  pinMode(redpin, OUTPUT);
  pinMode(greenpin, OUTPUT);
  // Режим шаговика "Следование до позиции"
  ENGINE.setRunMode(FOLLOW_POS);
  // Скорость 600
  ENGINE.setMaxSpeed(600);
  // Ускорение 0 (сразу максимальная скорость)
  ENGINE.setAcceleration(0);
  // Автоматическое выключение шаговика при достижении нужной позиции
  ENGINE.autoPower(true);
  // Если положение шаговика больше или меньше -2048 (1 этаж)
  if(ENGINE.getCurrent() > -2048 && ENGINE.getCurrent() < -2048) {
      // Едем на 1 этаж (-2048)
      ENGINE.setTarget(-2048);
    }
    
  /*digitalWrite(greenpin, LOW);
  digitalWrite(redpin, LOW);*/
}

void loop() {
  // Объявление шаговика и 3 кнопок.
  ENGINE.tick();
  lift1.tick();
  lift2.tick();
  lift3.tick();
  // Если кнопка lift1 (1 этаж) нажата и положение шаговика не 1 этаж
  if(lift1.isClick() || liftflag1 == false) {
      // Вывод в порт "CLICKED 1"
      Serial.println("CLICKED 1");
      // Едем на 1 этаж (-2048)
      ENGINE.setTarget(-2048);
      // Включение красного светодиода, сигнализирующего движение лифта
      digitalWrite(greenpin, LOW);
      digitalWrite(redpin, HIGH);
      // Если шаговик остановился
      if(ENGINE.getState() == false) {
          // Переключение состояния положения лифта на "1 этаж"
          liftflag3 = false;
          liftflag2 = false;
          liftflag1 = true;
          // Включение зелёного светодиода, сигнализирующего прибытие и нахождение на этаже
          digitalWrite(redpin, LOW);
          digitalWrite(greenpin, HIGH);
        }
    }
   else if(lift2.isClick() || liftflag2 == false) {
      Serial.println("CLICKED 2");
      ENGINE.setTarget(-1024);
      digitalWrite(greenpin, LOW);
      digitalWrite(redpin, HIGH);
      if(ENGINE.getState() == false) {
          liftflag1 = false;
          liftflag3 = false;
          liftflag2 = true;
          digitalWrite(redpin, LOW);
          digitalWrite(greenpin, HIGH);
        }
    }
   else if(lift3.isClick() || liftflag3 == false) {
      Serial.println("CLICKED 3");
      ENGINE.setTarget(1024);
      digitalWrite(greenpin, LOW);
      digitalWrite(redpin, HIGH);
      if(ENGINE.getState() == false) {
          liftflag1 = false;
          liftflag1 = false;
          liftflag3 = true;
          digitalWrite(redpin, LOW);
          digitalWrite(greenpin, HIGH);
        }
    }
 
}

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Вместо ИЛИ нужно И

sadman41
Offline
Зарегистрирован: 19.10.2016

Условия срабатывают по, например, liftflag3 == false.

Arduin01
Offline
Зарегистрирован: 07.02.2021

Я перепутал ИЛИ с И??!!! Какой стыд... Спасибо!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arduin01 пишет:

#include <GyverStepper.h>
#include <GyverButton.h>

-> https://community.alexgyver.ru/