2 кнопки - одно устройство - проблема.
- Войдите на сайт для отправки комментариев
Ср, 25/03/2020 - 01:45
ДрУги приветствую! Зашел в тупик и бьюсь головой уже 2е сутки, не могу понять причину бага.
Есть некое устройство, подымаемое через серву посредством драйвера. Устройство поднимается и стоит в таком положении, пока есть сигнал на входе одного пина и опускается, когда сигнал пропадает. Или устройство поднимается по однократному нажатию на другую кнопку и опускается по нажатию на нее же.
Вот код, прошу прощения за сумбур, это уже энная итерация...:
#include <EEPROM.h> // подключаем библиотеку EEPROM
#define PWMA 11 // выходы arduino
#define AIN1 5
#define AIN2 6
#define STBY 12
#define DATCH 9
#define BUTT 8
int t_open = 1280;
int t_close=800;
int flag =2;
int last_b=0;
int motorSpeed = 255; // скорость мотора
void setup()
{
Serial.begin(9600);
pinMode(PWMA, OUTPUT);
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(STBY, OUTPUT);
pinMode(DATCH, INPUT_PULLUP);
pinMode(BUTT, INPUT_PULLUP);
delay (100);
}
void loop()
{
if (digitalRead(DATCH) == LOW && digitalRead(BUTT)== HIGH && flag == 2)
{ // питание появилось, кнопка не нажата, закрыто - открываем
delay(200);
f_open();
flag = 1; // открыто
delay(200);
last_b=0; // обнуляем кнопку
}
if (digitalRead(DATCH) == HIGH && digitalRead(BUTT)== HIGH && flag == 1 && last_b==0) // для выключния питания
{ // питание пропало, кнопка не нажималась на открытие, открыто - закрываем
delay(3000);
f_close();
flag=2; // закрыто
delay(200);
}
if (digitalRead(DATCH) == HIGH && digitalRead(BUTT)== LOW && flag == 2)
{ // питания нет, кнопка нажата, закрыто - открываем
delay(200);
f_open();
flag=1; // открыто
last_b=1;// кнопку нажимали на открытие
delay(200);
}
if (digitalRead(DATCH) == HIGH && digitalRead(BUTT)== LOW && flag == 1)
{ // питания нет, кнопка нажата, открыто - закрываем
delay(200);
f_close();
flag=2; // закрыто
delay(200);
}
}
void f_close()
{
digitalWrite(STBY, 1);
digitalWrite(AIN1, 0);
digitalWrite(AIN2, 1);
analogWrite(PWMA, motorSpeed);
delay(t_close);
digitalWrite(STBY, 0);
}
void f_open()
{
digitalWrite(STBY, 1);
digitalWrite(AIN1, 1);
digitalWrite(AIN2, 0);
analogWrite(PWMA, motorSpeed);
delay(t_open);
analogWrite(PWMA, motorSpeed-80);
delay (300);
digitalWrite(STBY, 0);
}
Тут где-то ошибка, код не работает как надо. В данном случае не закрывается при пропадании сигнала. Взгляд в конец замылился, не могу найти ошибку...
нормальные пасаны так кнопки не читают, и уж тем более delay такой большой не пользуют. титановый вел Клапы в помощь
Так замените операции с сервой на включение светодиода - код сократится втрое, легко найдёте проблему в логике, исправите, потом вернёте сервовые дела.
Тут где-то ошибка, код не работает как надо.
да как же он будет работать, если например, в случае "питание пропало" в процессе закрывания напихано делаев аж на 5 секунд. И все это время вы ни кнопки не контролируете, ни питание...
Первым делом перепишите весь код без задержек. Если проблема не исчезнет - тогда отлаживайте так, как написали выше.
Дело в том, что устройство - это автомобильный навигатор, который выдвигается сервой из нишы. Задержки нужны для того, что бы на экране прошли нужные изменения/сообщения.
На делеях свет клином не сошелся, блинк без делей, делает тоже самое, но не блокирует работу МК.