УМНЫЙ ДОМ Нужна помощь в написании скетча ...

vadi90901

✩✩✩✩✩✩✩
29 Ноя 2021
5
0
Оформи код соответствующим тэгом. И сделай шрифт нормального размера
Нужна помощь в написании скетча для гаражных ворот. Точнее нужно установить таймер при открытии и закрытии 30сек. , пауза между открытием и закрытием 2сек. , если не сложно то атидребизг .
Сам скетч написал правда ушло на это полтора года поэтому прошу помощь .
скетч работает но нужны паузы

C++:
int But1 = 2;     //  кнопка открыть
int But2 = 3;     //  кнопка закрыть
int But3 = 4;     //  кнопка стоп
int Led1 = 5;     //  мотор открыть
int Led2 = 6;     //  мотор закрыть
int Berx = 7;     //  концевик открыто
int Nuz = 8;      //  концевик закрыто
int flag1 = 0;   
int flag2 = 0;   
int flag3 = 0;   

void setup()
{
  pinMode(Led1, OUTPUT);    //  pin5 = выход мотор открыть
  pinMode(Led2, OUTPUT);    //  pin6 = выход мотор закрыть
  pinMode(2, INPUT);        //  pin2 = кнопка открыть
  pinMode(3, INPUT);        //  pin3 = кнопка закрыть
  pinMode(4, INPUT);        //  pin4 = кнопка стоп
  pinMode(7, INPUT);        //  pin7 = концевик открыто
  pinMode(8, INPUT);        //  pin8 = концевик закрыто
  boolean flag1 = false;    //  flag1 = 0
  boolean flag2 = false;    //  flag2 = 0
  boolean flag3 = false;    //  flag3 = 0
}

void loop()
{
  if (digitalRead(But1) == HIGH && flag1 == 0 && (digitalRead(Led2) == LOW) && (digitalRead(7) == LOW)) {
    digitalWrite(Led1, !digitalRead(Led1));                                  // ЗДЕСЬ     открыть через 2сек. и на протяжении 30сек.
    flag1 = 1;
  }
  if (digitalRead(But1) == HIGH && flag1 == 0 && (digitalRead(Led2) == HIGH)) {
    digitalWrite(Led2, LOW);
    flag1 = 1;
  }
  if (digitalRead(But1) == LOW && flag1 == 1) {
    flag1 = 0;
  }
  if (digitalRead(But2) == HIGH && flag2 == 0 && (digitalRead(5) == LOW) && (digitalRead(8) == LOW)) {
    digitalWrite(Led2, !digitalRead(Led2));                        // ЗДЕСЬ       закрыть через 2сек. и на протяжении 30сек.
    flag2 = 1;
  }
  if (digitalRead(But2) == HIGH && flag2 == 0 && (digitalRead(5) == HIGH)) {
    digitalWrite(Led1, LOW);
    flag2 = 1;
  }
  if (digitalRead(But2) == LOW && flag2 == 1) {
    flag2 = 0;
  }
  if (digitalRead(But3) == HIGH && flag3 == 0) {
    flag3 = 1;
    digitalWrite(Led1, LOW);
    digitalWrite(Led2, LOW);
  }
  if (digitalRead(But3) == HIGH && flag3 == 1) {
    flag3 = 0;
  }
  if (digitalRead(Berx) == HIGH ) {
    digitalWrite(Led1, LOW);
  } if (digitalRead(Nuz) == HIGH ) {
    digitalWrite(Led2, LOW);
  }
}
 

Вложения

Изменено:

i3epg

✩✩✩✩✩✩✩
9 Окт 2021
34
5
Красноярск
Схема уже есть? Если нет, то лучше сделать аппаратный антидребезг и не заморачиваться с программным.
 

vadi90901

✩✩✩✩✩✩✩
29 Ноя 2021
5
0
схема есть и работает лет 15 но собрана на реле. если не сложно то атидребизг он реализуется легко конденсатором .
 

Вложения

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
C++:
// освобождаем память не меняя удобства
#define But1     2     //  кнопка открыть
#define But2     3     //  кнопка закрыть
#define But3     4     //  кнопка стоп
#define Led1     5     //  мотор открыть
#define Led2     6     //  мотор закрыть
#define Berx     7     //  концевик открыто
#define Nuz      8     //  концевик закрыто
#define V_Tim    30    // время зашиты 30сек

//не вижу смысла использовать int темполее bool занимает на один байт меньше
bool flag1;   
bool flag2;   
bool flag3;

byte vinfo; //зашита ворот

extern volatile unsigned long timer0_millis; // делаем её extern для возможности прямого изменения а имено от переполнения таймера
uint32_t timer; //таймера

void setup() {
    pinMode(Led1, OUTPUT);    //  pin5 = выход мотор открыть
    pinMode(Led2, OUTPUT);    //  pin6 = выход мотор закрыть
    digitalWrite(Led2, false);
    digitalWrite(Led1, false);
    pinMode(But1, INPUT);        //  pin2 = кнопка открыть
    pinMode(But2, INPUT);        //  pin3 = кнопка закрыть
    pinMode(But3, INPUT);        //  pin4 = кнопка стоп
    pinMode(Berx, INPUT);        //  pin7 = концевик открыто
    pinMode(Nuz, INPUT);        //  pin8 = концевик закрыто
    flag1 = flag2 = flag3 = false;    //  flag1 = 0 flag2 = 0 flag3 = 0 не знаю точно, но на форумах говорят что так немного быстрей присваивается значения
    vinfo = timer0_millis = UINT32_MAX - 5000;  // за 5 секунд до переполнения сбрасываем тайме
}

void loop() {
    if(digitalRead(Berx)) {
        vinfo = false; //сбрасываем время те 30 сек
        digitalWrite(Led1, false); //если сработал концевик открыто убераем питания с мотор открыть
    }
    if(digitalRead(Nuz))  {
        vinfo = false; //сбрасываем время те 30 сек
        digitalWrite(Led2, false); //если сработал концевик закрвтия убераем питания с мотор закрытия
    }
    bool btnState = digitalRead(But1); //дребизг - кнопка открыть
    if(!btnState && !flag1) {  // нажата кнопка
        flag1 = true;
        if(!digitalRead(Led1) && !digitalRead(Berx)) { //есле выход мотор открытия Выключен и концевик верх не заккнут
            digitalWrite(Led2, false); //убераем питания с выход мотор закрыть
            delay(2000); //ожидакм 2сек
            digitalWrite(Led1, true); //открваем ворота
        }
        else {
            digitalWrite(Led1, false); //если нажали еще раз останавливаем открытия
        }
       //тоесть нажав один раз ворота начнут отерыватся, нажав второй раз ворота остаеовится, нажав снова ворота продолжат окрывания и так пока не сроботает концевик
    }
    if(btnState && flag1) flag1 = false;  //отпук кнопки
 
    btnState = digitalRead(But2); //дребизг - кнопка закрыть
    if(!btnState && !flag2) {  // нажата кнопка
        flag2 = true;
        if(!digitalRead(Led2) && !digitalRead(Berx)) { //есле выход мотор закрытия выключен и концевик низ не заккнут
            digitalWrite(Led1, false); //убераем питания с выход мотор открыть
            delay(2000); //ожидакм 2 сек
            digitalWrite(Led2, true); //закрывае ворота
        }
        else digitalWrite(Led2, false); //если нажали еще раз останавливаем открытия
    }
    if(btnState && flag2) flag2 = false;  //отпук кнопки
    
    btnState = digitalRead(But3); //дребизг - кнопка стоп
    if(!btnState && !flag3) {  // нажата кнопка
        flag3 = true;
        digitalWrite(Led1, false); //убераем питания с выход мотор открыть
        digitalWrite(Led2, false); //убераем питания с выход мотор закрыть
    }
    if(btnState && flag3) flag3 = false;  //отпук кнопки
    if(millis() - timer >= 1000) {  //таймер на 1 сек
        timer = millis(); // сброс таймера
        if(digitalRead(Led1) || digitalRead(Led2)) vinfo++ //если мотор открытия включен добовляем секунду
        if(vinfo >= V_Tim) { //если прошло 30 сек а концевик открытия не сработол включаем зашиту
            vinfo = false; //сбрасываем время те 30 сек
            digitalWrite(Led1, false); //убераем питания с выход мотор открыть
            digitalWrite(Led2, false); //убераем питания с выход мотор закрыть
        }       
    }
}
не проверял, но должно работать
 

vadi90901

✩✩✩✩✩✩✩
29 Ноя 2021
5
0
Большое спасибо .
это возможно малый шаг для тех, кто понимает, но большой скачок для меня. есть небольшие неточности в отработке после нажатия кнопок попытаюсь побороться с ними. по крайней мере, я вышел из тупика и уже начал двигаться. имею поле для размышлений.
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@vadi90901, да не за что, всего то пять минут работы, и то что много комментировал))
 

vadi90901

✩✩✩✩✩✩✩
29 Ноя 2021
5
0
пять минут? я восемь часов пробую изменить но результату ноль.
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@vadi90901, ну это по началу 8 часов, со временем разберетесь и будет тоже 5 минут)) как говорится главное желания)
 
  • Лойс +1
Реакции: andyparker

vadi90901

✩✩✩✩✩✩✩
29 Ноя 2021
5
0
Принцип работы: брелок 3 кнопки используются 2шт. в гараж + 1шт. Въездные ворота.
В гараже стоит пульт с тремя кнопками. (верх, низ дублируются брелком).
ворота секционные поднимаются верх. имеют три концевика : верх, низ, середина (1,6м. для проезда авто. при открывании останавливаются при закрывании игнорирует концевик (подключенный последовательно с конденсатором который обеспечивает одинокий короткий импульс, одновременно дублирует кнопку стоп)).
есть конфликт:
1) при нажатии стоп (срабатывает при отпускании) нужно при при нажатии.
2) при движении верх или низ при нажатии кнопки противоположного направления верх или низ (срабатывает движение в обратном направлении с паузой 2 сек.) требуется стоп + 2 сек. пауза, а при повторном нажатии движение в нужном направлении без пауз.

вопрос: если вернуться к скетчу что я писал возможно добавить только таймер на автоматическое отключение (стоп через 30сек. после начала движения ) и белье ничего .
стоп+2 сек. пауза решается с помощью delay(2000); после 34 и 45 строки. (2сек. отдыха для ардуино не повредит)
избавиться от дребезга контактов можно с помощью конденсатора.