Мигнуть один раз

Тема в разделе "Arduino & Shields", создана пользователем Zems, 22 окт 2016.

  1. Zems

    Zems Нуб

    Код (C++):
    if (digitalRead(pin) == 1) //если на пин подали "1", представим, что это тумблер
    digitalWrite(led1, 1); //диод 1 включили
    digitalWrite(led2, 1); //диод 2 мигнули
    delay(500);
    digitalWrite(led2, 0);
    else {                         // иначе диод 1 не горит.
    digitalWrite(led1, 0); }
     
    Помогите разобраться, как сделать, что бы диод 2 не мигал постоянно если тумблер выключен, а мигнул один раз при включении тумблера, а второй раз уже при повторном включении ну или после перезагрузки ардуины. Немогу нагуглить, довольно простое, как мне кажется решение.
     
  2. rkit

    rkit Гуру

    Записываешь переменную предыдущее состояние пина, и не мигаешь, если оно совпадает с текущим.
     
  3. Zems

    Zems Нуб

    Код (C++):
    if(digitalRead(pin)==1)//если на пин подали "1", представим, что это тумблер
    digitalWrite(led1, 1);//диод 1 включили
    digitalWrite(led2, 1);//диод 2 мигнули
    delay(500);
    digitalWrite(led2, 0);
    else{                       // иначе диод 1 не горит.
    digitalWrite(led1, 0);}

    if(digitalRead(pin)==2)//если на пин подали "2",
    digitalWrite(led3, 1);//диод 3 включили
    digitalWrite(led2, 1);//диод 2 мигнули
    delay(500);
    digitalWrite(led2, 0);
    else{                       // иначе диод 3 не горит.
    digitalWrite(led3, 0);}
    Так тоже будет работать?
     
  4. qwone

    qwone Гик

    Zems , Вы видели дорогу , где много едет машин. Так вот среди водителей машин находятся неадекваты , которые считают что дорога только для них, вот и чудят в меру свой фантазии. Понятно , что новички учатся на пустой площадке. Но ситуация меняется если они выезжают на дорогу где есть и другие машины. Так и здесь. Как правило, все скетчи они демо. То есть хороши когда они работают одни. А вот когда их собирают в кучу, получается х р е н ь. Так и у вас. Пока учились на отдельной площадке то все ОК. А вот когда выехали на большую дорогу и полезла туфтень. 1 - delay(500); . Вы бы еще припарковались на середине автобана.
     
  5. rkit

    rkit Гуру

    Не вижу переменной. Код принято оформлять отступами для читаемости.
     
  6. qwone

    qwone Гик

    Код (C++):
    /*
    #1 кнопка  -> 2 (btm_pin) 0 нажата / 1 нет
               -> GND
    светодиод      -> 3 (Led1_pin ) 0 горит /1 нет
      через R=1кОМ-> +5В
      */

    //#1
    const int btm1_pin = 2;
    uint8_t btm1 = 0xFF;
    const int Led1_pin = 3;
    uint8_t Led1;//
    const int interval = 500 ; // интервал после нажатия клавиши 0,5 сек
    void setup() {
      //#1 светодиод и кнопка
      pinMode(btm1_pin, INPUT_PULLUP);
      btm1 = btm1 << 1 | digitalRead(btm1_pin);
      pinMode(Led1_pin, OUTPUT);
      digitalWrite(Led1_pin, Led1 = 1); // погасить светодиод
    }

    void loop() {
      static uint32_t MILLIS ;
      MILLIS = millis() ;
      //#1
      static uint32_t fut1 = 0 ;
      static uint32_t future1 = 0 ;
      if (!Led1 && MILLIS >= fut1) {
        digitalWrite(Led1_pin, Led1 = 1);
      }
      if (MILLIS >= future1) {
        future1 = MILLIS + 200;
        btm1 = btm1 << 1 | digitalRead(btm1_pin);
        if ( (btm1 & 3) == 2) {
          digitalWrite(Led1_pin, Led1 = 0);
          fut1 = MILLIS + interval;
        }
      }
    }
     
    Последнее редактирование: 22 окт 2016
  7. Zems

    Zems Нуб

    2rkit
    Я и не вводил переменную, просто не могу понять как это сделать грамотно. А второй вариант скетча, я написал для наглядности, что led2 у меня используется не только с led1 но и с led3,4,5 и т.д. Мне не хочется, что бы за меня написали весь мой скетч, а хочется разобраться с одним моментом, потому и привожу короткие кусочки кода.

    2qwone
    "delay" в моем коде не мешает, мне достаточно даже 0,1 секунды, что в целом на процесс не повлияет. Ваш вариант с "millis" мне знаком, но он мне кажется довольно громоздким, хотя я могу ошибаться и решений с меньшей "кровью" не существует.

    В любом случае всем спасибо за Ваши коментарии.
     
  8. qwone

    qwone Гик

    2 Zems . Это только кажется , что мой код горомоздкий. На деле я могу с минимальными усилиями совмещать работу десятка любых программ, написаных мной. И при этом они все будут работать и требовать "минимальной работы напильником".
     
  9. rkit

    rkit Гуру

    Ну могу сказать, что на цифровой пин нельзя подать 2.
    Можно подать высокий уровень, известный как 1 или HIGH.
    И можно подать низкий, известный как 0 или LOW.
    Третьего не дано.

    А вообще по вопросу вот тут разжевано достаточно хорошо.
    http://wiki.amperka.ru/конспект-arduino:кнопочный-переключатель
     
  10. Tomasina

    Tomasina Сушитель лампочек Модератор

    странно что код вообще скомпилировался
    строка
    Код (C++):
    digitalWrite(led1, 1); //диод 1 включили
    будет выполняться только при соблюдении указанного в скобках if условия.
    А вот строка
    Код (C++):
    digitalWrite(led2, 1); //диод 2 мигнули
    будет выполнена всегда, независимо от того, что указано в if
     
  11. ostrov

    ostrov Гуру

    Я вот это не понял:
    Код (C++):
    digitalWrite(Led1_pin, Led1 = 0);
     
  12. Tomasina

    Tomasina Сушитель лампочек Модератор

    включится, ибо уловие всегда истинно. И синтаксис не нарушен ;)
    А то, что не работает как задумано - как описано ТЗ, такой и результат.
     
  13. qwone

    qwone Гик

    Это сокращеная запись этого.
    Led1 =0;
    digitalWrite(Led1_pin, Led1);
    В некотором смысле штамп для моего стиля написания программы.
     
  14. ostrov

    ostrov Гуру

    Что мешает написать:
    Код (C++):
    digitalWrite(Led1_pin, 0);
    И вообще какой смысл в переменной в таком случае?
     
  15. Tomasina

    Tomasina Сушитель лампочек Модератор

    нет, это не сокращенная запись. Это всегда единица, т.е. присвоение переменной Led1 значение 0 завершилось успешно (возвращает true).
    Код (C++):
    digitalWrite(Led1_pin, Led1 = 0);
    и
    Код (C++):
    digitalWrite(Led1_pin, 0);
    это не одно и то же, а полностью противоположные значения.

    А вот строки
    Код (C++):
    digitalWrite(Led1_pin, Led1 = 0);
    digitalWrite(Led1_pin, Led1 = 1);
    полностью идентичны и обе включают светодиод Led1.

    ТС, даю подсказку: код в сообщении #1 полностью правильный с точки логики.
    А вот по синтактису - забыли две фигурных скобки, поэтому работает не так как задумано.
     
    Последнее редактирование: 22 окт 2016
  16. ostrov

    ostrov Гуру

    Таки нет, вероятно компилятор понимает это не как условие, а как действие присвоения. Пин выключится (установится в 0).
     
  17. qwone

    qwone Гик

    Мой скечь работает.
    digitalWrite(Led1_pin, Led1 =0);// это включает
    digitalWrite(Led1_pin, Led1 =1);// это выключает
    замечу я указал выше светодиод висит на питании.

    Вы еще не заметили кусок
    if(!Led1 && MILLIS >= fut1){
    digitalWrite(Led1_pin, Led1 =1);
    } // то есть если светодиод светит Led1 =0 , то есть !Led1 и время выключать подошло то выключить digitalWrite(Led1_pin, Led1 =1); // Led1 =1 и не будет выполнятся это условие !Led1==1
     
  18. Tomasina

    Tomasina Сушитель лампочек Модератор

  19. qwone

    qwone Гик

    Не путайте = это операция присвоения и ничего иное, а == это сравнение. А еще есть операция запятая. Это почти как точка с запятой. Синтаксис Си.
     
  20. ZAZ-965

    ZAZ-965 Гуру

    Здесь нет сравнения (==), это присваивание (=)
    ВЫ запись digitalWrite(kol_l, LOW) называете "дибилизм", а сами пишете "странноватенько" digitalWrite(Led1_pin, Led1 =0)