Библиотека кнопок GyverButton и шаговик 28BYJ-48 с драйвером ULN2003
- Войдите на сайт для отправки комментариев
Вс, 07/02/2021 - 10:00
Хочу создать простейший макет лифта. Когда кнопка только 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);
}
}
}
Вместо ИЛИ нужно И
Условия срабатывают по, например,
liftflag3 ==false.Я перепутал ИЛИ с И??!!! Какой стыд... Спасибо!
-> https://community.alexgyver.ru/