1. Форумный чат переехал в Telegram.
  2. В сообществе нашего форума Вконтакте создан раздел по продаже электронных компонентов.
    Каждый может продать в нем свои залежавшиеся детали. Подробности здесь.

Кнопки со сложной логикой

Тема в разделе "Arduino", создана пользователем ilay, 6 фев 2016.

Статус темы:
Закрыта.
  1. ilay

    ilay Гость

    Сообщения:
    16
    Симпатии:
    0
    Помогите с кодом кто может. Задача: нажали кнопку-1-светодиод горит заданное время независимо удерживаем кнопку или нет, при последующих нажатиях, кнопка-1 не должна срабатывать, пока не нажмем кнопку-2....нажали кнопку-2, загорается тот же светодиод на заданное время и загорается светодиод-2...светодиод-2 горит пока не отпустишь кнопку-2. Кнопка-2 должна работать так же как кнопка-1...т.е. после первого нажатия(не зависимо кликнули или удерживаем) должна отработать цикл с заданным временем... и пока не нажмем кнопку-1, срабатывать не должна.

    С первой кнопкой цикл прописан и ключ с блокировкой первой кнопки решил...а вот со второй кнопкой не получается.

    Модель здесь- https://123d.circuits.io/circuits/1476444-/edit
    Последнее редактирование: 6 фев 2016
     
  2. Дмитрий BASIC

    Дмитрий BASIC Живет здесь

    Сообщения:
    171
    Симпатии:
    91
    Здравствуйте, может фрагмент кода выложите для понимания !
  3. ilay

    ilay Гость

    Сообщения:
    16
    Симпатии:
    0
    Здесь https://123d.circuits.io/circuits/1476444-/edit слева вверху есть кнопка "Code Editor" откроется код...там можно посмотреть и скопировать.
  4. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.391
    Симпатии:
    331
    Адрес:
    Талгар
    может можно сюда выложить ?
  5. ilay

    ilay Гость

    Сообщения:
    16
    Симпатии:
    0
    Можно сюда.
    Не весь код вставился...поправил.

    Код:
    int reley = 10;
    int rele1 = 13;// пин со светодиодом
    int rele2 = 6; // нога на бум
    long OnTime = 200; // время свечения светодиода, мс
    int ledState = LOW;
    int ledState2 = LOW;
    int pinButton = 7; // пин, к которому подключена кнопка
    int pinButton2 = 9; // пин, к которому подключена кнопка2
    int pinButton3 = 8;
    unsigned long previousMillis = 0UL;
    bool key = true;
    bool keyLOW = true;
    bool key3 = true;
    
    void setup()
    {
       pinMode(rele2, OUTPUT);
       pinMode(rele1, OUTPUT);
       pinMode(reley, OUTPUT);
       pinMode(pinButton, INPUT);
       pinMode(pinButton3, INPUT);
       pinMode(pinButton2, INPUT);
    }
    
    void loop(){
      
       if (digitalRead(pinButton3) == HIGH){
          previousMillis = millis(); // запоминаем время когда она нажалать
          digitalWrite(reley, HIGH);
          ledState = HIGH; // взводим ключ на включение.
          key3 = true;
       }
       else{
          digitalWrite(reley, LOW);
       }
    
       if (millis()- previousMillis >= OnTime){ // таймер пяти секунд
          ledState = LOW; //потушить по истечении времени
       }
    
       if ((digitalRead(pinButton2) == LOW) && (keyLOW == false)){
          keyLOW = true;// триггер на отжатие кнопки, пока не отожмешь не пустит в если где проверяет нажатие.
          ledState2 = LOW;
        }
       if ((digitalRead(pinButton2) == HIGH) && (keyLOW == true)){ // если нажата кнопка и ключ true то
          previousMillis = millis(); // запоминаем время когда она нажалать
          ledState2 = HIGH; // взводим ключ на включение.
          keyLOW = false;
        }
        if ((digitalRead(pinButton) == LOW) && (key == false)) key = true;
        if ((digitalRead(pinButton) == HIGH) && (key == true) && key3){ // если нажата кнопка и ключ true то
          previousMillis = millis(); // запоминаем время когда она нажалать
          ledState = HIGH; // взводим ключ на включение.
          key = false;
          key3 = false;
        
        }
       digitalWrite(rele1,ledState); // включаем или гасим диод в зависимости от переменной ledState
       digitalWrite(rele2,ledState2); // включаем или гасим диод в зависимости от переменной ledState
    }
    
  6. UL7AAjr

    UL7AAjr В доску свой

    Сообщения:
    1.910
    Симпатии:
    315
    Род занятий:
    инженер-программист
    Адрес:
    Алма-Ата
    ого! И эта куча кода чтобы по-очереди разрешать включение двух ледов двумя кнопками?
    Жесть:)
  7. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.391
    Симпатии:
    331
    Адрес:
    Талгар
    блин.. ардуина....
  8. ilay

    ilay Гость

    Сообщения:
    16
    Симпатии:
    0
    Да...но включение то не простое. Не могу никак вторую кнопку сделать как с первой.
  9. UL7AAjr

    UL7AAjr В доску свой

    Сообщения:
    1.910
    Симпатии:
    315
    Род занятий:
    инженер-программист
    Адрес:
    Алма-Ата
    Да ничего там сложного нету. Первое, что в голову пришло. Но 100% будет работать если на С перевести:)

    PHP:
    var
      
    FirstAllowBoolean;
    begin
       
    if (PORT_A[0] = 0) and FirstAllow then
       begin
         Led1_ON
    ;
         
    Sleep(2000);
         
    Led1_OFF;
         
    FirstAllow := not FirstAllow;
       
    end
       
    else
       if (
    PORT_A[1] = 0) and not FirstAllow then
       begin
         Led1_ON
    ;
         
    Led2_ON;
         
    Sleep(2000);
         
    Led1_OFF;
         
    Led2_OFF;
         
    FirstAllow := not FirstAllow;
       
    end;
    end;
  10. ilay

    ilay Гость

    Сообщения:
    16
    Симпатии:
    0

    На Си с регистрами нужно заморачиваться. Я Wiring то не до конца освоил...а тут такой ЯЗЫЧИЩЕ нужно учить.
  11. Дмитрий BASIC

    Дмитрий BASIC Живет здесь

    Сообщения:
    171
    Симпатии:
    91
    Я в ардуино не очень , но кое что заметил может конструкцию надо перевести в if elseif или switch не знаю как в ардуино называется , чтобы условия все подряд не выполнялась!
  12. UL7AAjr

    UL7AAjr В доску свой

    Сообщения:
    1.910
    Симпатии:
    315
    Род занятий:
    инженер-программист
    Адрес:
    Алма-Ата
    да тут логика просто описана.
    Led1_ON Led1_OFF Led2_ON Led2_OFF - думаю и так все понятно
    Sleep(2000) задержка 2000 мс (2 сек)

    FirstAllow - булевая переменная, если True - значит можно реагировать на кнопку №1, если False - можно реагировать на кнопку №2

    PORT_A[0] = 0 - проверка пина на "0" первой кнопки
    PORT_A[1] = 0 - проверка пина на "0" второй кнопки

    Замените на свой код - и вперед:)
  13. Дмитрий BASIC

    Дмитрий BASIC Живет здесь

    Сообщения:
    171
    Симпатии:
    91
    If кнопка1=1
    While пока не достигнуто время выполняем
    Led1=1
    If кнопка2=1 then выходим из цикла while
    Wend
    Elseif кнопка2=1
    While пока не достигнуто время выполняем
    Led1=1
    If кнопка1=1 then выходим из цикла while
    If кнопка2=1 then led2=1 else led2=0
    Wend
    Else
    Led1=0
    Led2 =0
    Endif
  14. aman

    aman Завсегдатай

    Сообщения:
    149
    Симпатии:
    10
    исходя из описания задачи, длительность горения светодиода 2 зависит от длительности первого нажатия кнопки 2 и может превышать время включения светодиода 1.
  15. UL7AAjr

    UL7AAjr В доску свой

    Сообщения:
    1.910
    Симпатии:
    315
    Род занятий:
    инженер-программист
    Адрес:
    Алма-Ата
    И где вы там такое вычитали? Нет такого в описании задачи. Написано, что первый должен гореть заданное время. Второй - пока удерживается кнопка №2;
  16. aman

    aman Завсегдатай

    Сообщения:
    149
    Симпатии:
    10
    Второй - пока удерживается кнопка №2
  17. ilay

    ilay Гость

    Сообщения:
    16
    Симпатии:
    0
    Нажали кнопку-1, загорелся светодиод-1 на 2сек.(скажем)...светодиод-1 должен гореть 2сек. независимо кликнули мы кнопку-1 или удерживаем. Так же кнопка-1 при повторном нажатии не должна включать светодиод-1, пока не нажмем кнопку-2. Кнопка-2 работает так же как и первая...но включать на 2сек. она должна светодиод-1(не зависимо удерживаем кнопку-2 или кликнули)...а так же кнопка-2 включает светодиод-2, который горит пока нажата кнопка-2.
  18. aman

    aman Завсегдатай

    Сообщения:
    149
    Симпатии:
    10
    уточните, сколько времени может быть нажата кнопка 2 ?
    --- Сообщения объединены, 7 фев 2016 ---
    если на две сек или меньше, то все просто, а если больше? в этом и смысл задачи
    --- Сообщения объединены, 7 фев 2016 ---
    наверное :)
  19. ilay

    ilay Гость

    Сообщения:
    16
    Симпатии:
    0
    Кнопка-1 и кнопка-2 включают светодиод-1 на 2сек. Кнопка-2 так же включает светодиод-2. Кнопка-1 должна срабатывать 1раз(не зависимо кликнули или удерживаем) пока не нажмем кнопку-2...т.е. кнопка-2 обнуляет цикл кнопки-1...и кнопка-1 так же обнуляет для кнопки-2...этот алгоритм касается только светодиода-1.
  20. ilay

    ilay Гость

    Сообщения:
    16
    Симпатии:
    0
    Короче наворотил я с кодом...запутался сам уже. :banghead: С циклом while мало знаком. Курить надо пойти...и табак, и мануалы.
Статус темы:
Закрыта.

Поделиться этой страницей