Снова светодиод и кнопка)

Тема в разделе "Arduino & Shields", создана пользователем Suro, 20 окт 2017.

  1. akl

    akl Гуру

    значит я все таки не понял
    если было 11 и стало 01 - светодиод должен тут же погаснуть?
    а если было 10 и стало 00 - светодиод погаснет через 10 секунд? или как?
     
  2. akl

    akl Гуру

    00 -> 10 светодиод загорелся
    прошло 3 секунды
    10 -> 00
    прошло 7 секунд
    светодиод погас.
    так?

    а если
    11 -> 01 то гаснет мгновенно?
     
  3. Suro

    Suro Нерд

    код у меня такой но не работает.

    Код (C++):
    int BUTTON1_PIN = 9;
    int BUTTON2_PIN = 10;
    int LED_PIN = 11;
    int timer;


    bool button1 = digitalRead(BUTTON1_PIN); //считываются состояния кнопок и лампочки
    bool button2 = digitalRead(BUTTON2_PIN);
    bool led = digitalRead(LED_PIN);
      bool button1_on; //флаг нажатия кнопки 1
    void setup(){
      pinMode(BUTTON1_PIN, INPUT);
      pinMode(BUTTON2_PIN, INPUT);
      pinMode(LED_PIN, OUTPUT);
    }

    void loop() {
       if(button1 && !button1_on) {  //если кнопка1 нажата, но флаг что она была нажата не стоит
         button1_on = 1; //ставим флаг что кнопка нажата
         delay(20);  //ждем 20мс чтоб дребезг ушел
         button1 = digitalRead(BUTTON1_PIN); //проверяем нажата ли кнопка все еще
         if(button1){  //если таки нажата
         timer = millis(); //засекаем текущее время, т.к. в изначальном условии есть флаг -
                               //оно засечется только в момент нажатия на кнопку
         if(!led){digitalWrite(LED_PIN,HIGH);} //если лампочка не горит, то зажигаем ее
         }}
       if(!button1 && button1_on) {button1_on=0;
    digitalWrite(LED_PIN,LOW);} // если кнопка отжата - снимаем флаг нажатия кнопки
    //и отключаем лампочку



       if(button2 && led){  //а тут тупо каждый цикл пока зажата кнопка 2 при горящем леде
         timer = millis();  //будет обновляться время в таймере
         }

       if(led && millis()-timer>10000){ // если лампочка горит и время не обновлялось более 10с
          digitalWrite(LED_PIN,LOW); //выключаем лампочку
          }

    }
     
  4. akl

    akl Гуру

    не работает в каком смысле? не компилируется? что пишет при этом? или компилируется, но на кнопки реагирует неправильно?
     
  5. akl

    akl Гуру

    так ты считывание состояний кнопок из цикла убрал конечно

    Код (C++):
    int BUTTON1_PIN = 9;
    int BUTTON2_PIN = 10;
    int LED_PIN = 11;
    unsigned long timer;


    bool button1; //переменные состояний кнопок и леда
    bool button2;
    bool led;
      bool button1_on; //флаг нажатия кнопки 1
    void setup(){
      pinMode(BUTTON1_PIN, INPUT);
      pinMode(BUTTON2_PIN, INPUT);
      pinMode(LED_PIN, OUTPUT);
    }

    void loop() {


    button1 = digitalRead(BUTTON1_PIN); //считываются состояния кнопок и лампочки
    button2 = digitalRead(BUTTON2_PIN);
    led = digitalRead(LED_PIN);
       if(button1 && !button1_on) {  //если кнопка1 нажата, но флаг что она была нажата не стоит
         button1_on = 1; //ставим флаг что кнопка нажата
         delay(20);  //ждем 20мс чтоб дребезг ушел
         button1 = digitalRead(BUTTON1_PIN); //проверяем нажата ли кнопка все еще
         if(button1){  //если таки нажата
         timer = millis(); //засекаем текущее время, т.к. в изначальном условии есть флаг -
                               //оно засечется только в момент нажатия на кнопку
         if(!led){digitalWrite(LED_PIN,HIGH);} //если лампочка не горит, то зажигаем ее
         }}
       if(!button1 && button1_on) {button1_on=0;
    digitalWrite(LED_PIN,LOW);} // если кнопка отжата - снимаем флаг нажатия кнопки
    //и отключаем лампочку



       if(button2 && led){  //а тут тупо каждый цикл пока зажата кнопка 2 при горящем леде
         timer = millis();  //будет обновляться время в таймере
         }

       if(led && millis()-timer>10000){ // если лампочка горит и время не обновлялось более 10с
          digitalWrite(LED_PIN,LOW); //выключаем лампочку
          }

    }
    кстати, а номера пинов в переменных принципиально? обычно это дефайнами делается
     
  6. Suro

    Suro Нерд

    нет не принципиально,можем и define - ом.
    первая часть отлично работает - если кнопка1 нажата более 10сек светодиод выключается.
    но надо что когда кноопка1 нажата более 10сек и светодиод выключен,при паралелном нажатии конпка2 включился светодиод.и после этого если отжали кнопка2 (но кнопка1 все же нажата) светодиод пусть выключится после 10сек
     
  7. akl

    akl Гуру

    вот так вроде должно работать

    Код (C++):
    int BUTTON1_PIN = 9;
    int BUTTON2_PIN = 10;
    int LED_PIN = 11;
    unsigned long timer;


    bool button1; //переменный состояний кнопок и леда
    bool button2;
    bool led;
      bool button1_on; //флаг нажатия кнопки 1
    void setup(){
      pinMode(BUTTON1_PIN, INPUT);
      pinMode(BUTTON2_PIN, INPUT);
      pinMode(LED_PIN, OUTPUT);
    }

    void loop() {


    button1 = digitalRead(BUTTON1_PIN); //считываются состояния кнопок и лампочки
    button2 = digitalRead(BUTTON2_PIN);
    led = digitalRead(LED_PIN);
       if(button1 && !button1_on) {  //если кнопка1 нажата, но флаг что она была нажата не стоит
         button1_on = 1; //ставим флаг что кнопка нажата
         delay(20);  //ждем 20мс чтоб дребезг ушел
         button1 = digitalRead(BUTTON1_PIN); //проверяем нажата ли кнопка все еще
         if(button1){  //если таки нажата
         timer = millis(); //засекаем текущее время, т.к. в изначальном условии есть флаг -
                               //оно засечется только в момент нажатия на кнопку
         if(!led){digitalWrite(LED_PIN,HIGH);} //если лампочка не горит, то зажигаем ее
         }}
       if(!button1 && button1_on) {button1_on=0;
    digitalWrite(LED_PIN,LOW);} // если кнопка отжата - снимаем флаг нажатия кнопки
    //и отключаем лампочку



       if(button2 && led){  //а тут тупо каждый цикл пока зажата кнопка 2 при горящем леде
         timer = millis();  //будет обновляться время в таймере
         }

       if(button2 && button1 && !led){  //если кнупку2 нажали при удерживаемой 1 и потухшем леде
         delay(20); //типа дребезг
         button2 = digitalRead(BUTTON2_PIN); //проверяем кнопку2
         if(button2){ //если нажата
         digitalWrite(LED_PIN,HIGH);
         timer = millis();    //подрубаем светодиод и засекаем время
       }}

       if(led && millis()-timer>10000){ // если лампочка горит и время не обновлялось более 10с
          digitalWrite(LED_PIN,LOW); //выключаем лампочку
          }

    }
    тупо добавлено что при удерживаемой кнопке 1 но потухшем диоде при нажатии кнопки 2 происходит зажигание светодиода и далее все то же с таймером по циклу

    и все таки, что за секретный проект, в котором нужны такие странные кнопки?


    о опечатка была в строчке
    button2 = digitalRead(BUTTON2_PIN); //проверяем кнопку2
    короче лучше не копипастить, а делать самому, принцип то понятен и прост - следим за состоянием кнопок и лампочки, и в зависимости от совпадения комбинаций этих состояний делаем разное.
     
    Последнее редактирование: 21 окт 2017
  8. Suro

    Suro Нерд

    у вас есть вк ?
    могу написать вам в личку?
     
  9. akl

    akl Гуру

    если для консультирования, то не стоит, т.к. я не шарю в программировании - лучше нанять кого-то опытного.
    а если проект настолько секретный, что про него на форуме писать нельзя, то лучше и меня не посвящать, а то еще придут люди в черном и скажут что это не светодиод мигал, а взрыв газа
     
    qwone нравится это.
  10. Suro

    Suro Нерд

    нет не надо консультации и нету никаких люди в черном ,, скажите и вам напишу что хотел сказать ;) )