2 кнопки - одно устройство - проблема.

Barny
Offline
Зарегистрирован: 23.01.2015

ДрУги приветствую! Зашел в тупик и бьюсь головой уже 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);
      }

Тут где-то ошибка, код не работает как надо. В данном случае не закрывается при пропадании сигнала. Взгляд в конец замылился, не могу найти ошибку...

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

нормальные пасаны так кнопки не читают, и уж тем более delay такой большой не пользуют. титановый вел Клапы в помощь

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

Так замените операции с сервой на включение светодиода - код сократится втрое, легко найдёте проблему в логике, исправите, потом вернёте сервовые дела.

b707
Offline
Зарегистрирован: 26.05.2017

Barny пишет:

Тут где-то ошибка, код не работает как надо.

да как же он будет работать, если например, в случае "питание пропало" в процессе закрывания напихано делаев аж на 5 секунд. И все это время вы ни кнопки не контролируете, ни питание...

Первым делом перепишите весь код без задержек. Если проблема не исчезнет - тогда отлаживайте так, как написали выше.

Barny
Offline
Зарегистрирован: 23.01.2015

Дело в том, что устройство - это автомобильный навигатор, который выдвигается сервой из нишы. Задержки нужны для того, что бы на экране прошли нужные изменения/сообщения.

bwn
Offline
Зарегистрирован: 25.08.2014

На делеях свет клином не сошелся, блинк без делей, делает тоже самое, но не блокирует работу МК.