Boolean и оператор if...else

Тема в разделе "Arduino & Shields", создана пользователем Jogovskiy, 11 янв 2021.

  1. Jogovskiy

    Jogovskiy Нерд

    Написал простенький скетч для управления диода от кнопки и датчика движения. Алгоритм (и цель) следующие : диод светится после нажатия кнопки, если кнопка выключена не подает сигнал на свет, то свет загорается от датчик движения. Скетч работает, хочу реализовать фиксирование кнопки программно.
    Фиксацию хочу провести через boolean, но не получается в конце присвоить значение предыдущий=текущий. ( pred_button=tek_button;) Т.к. между операторами if и else его не установить. После всех операторов как понимаю не имеет смысла (истина найдена и программа игнорирует все следующие строки). Как тогда быть?
    Без дальнейших операторов после if эта строка работает.

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

    Код (C++):
    boolean LEDflag=false;

    const int LED=11;
    const int button=12;
    const int PIR=10;

    int tek_button=LOW;
    int pred_button=HIGH;

    void setup() {

    pinMode(LED, OUTPUT);
    pinMode(button, INPUT);
    pinMode(PIR, INPUT);
    }
    void loop() {

      tek_button=digitalRead(button);
    if (tek_button == LOW && pred_button == HIGH){
      LEDflag=!LEDflag;

      digitalWrite(LED, LEDflag);
    }

    else if(digitalRead(PIR)== HIGH){
      digitalWrite(LED, HIGH);
    }
    else {
      digitalWrite(LED,LOW);
    }
    pred_button=tek_button;
    }
     
     
    Последнее редактирование: 11 янв 2021
  2. a1000

    a1000 Гуру

    Это как? Нажал - зажглось, ещё раз нажал - потухло.
    И ещё вопрос. Какая у вас кнопка? Механическая?
     
  3. Jogovskiy

    Jogovskiy Нерд

    Кнопка механическая, без фиксации ( то есть пока держишь сигнал есть, отпустил -цепь разорвана)
    Хочу нажал - изменилось состояния диода. Все механическое, все в железе делаю.
    Если убрать else if и else , а строку оставить как есть, то нажатие меняет состояние
     
  4. NikitOS

    NikitOS Король шутов Администратор

  5. a1000

    a1000 Гуру

    Посмотрите видео


    и продолжение


    Там всё расписано как сделать
    с подавлением дребезга.
     
  6. Jogovskiy

    Jogovskiy Нерд

    Такое читал,пробовал, у меня вопрос, проблема в том, куда вставить строчку последнего значения. Ибо если между операторами программа ругается
    А если после всех операторов, то не работает. (При отпускании диод пытается моргнуть, еле заметно, но это не та фиксация значения, что я пытаюсь сделать)
     
  7. a1000

    a1000 Гуру

    Вот вам скетч от видео с фиксацией кнопки и фильтрацией дребезга.
    Код (C++):
    int switchPin = 8;
    int ledPin = 13;
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    boolean ledOn = false;

    void setup()
    {
      pinMode(switchPin, INPUT);
      pinMode(ledPin, OUTPUT);
    }

    boolean debounce(boolean last)
    {
      boolean current = digitalRead(switchPin);
      if (last != current)
      {
        delay(5);
        current = digitalRead(switchPin);
      }
      return current;
    }

    void loop()
    {
      currentButton = debounce(lastButton);
      if (lastButton == LOW && currentButton == HIGH)
      {
        ledOn = !ledOn;
      }
      lastButton = currentButton;

      digitalWrite(ledPin, ledOn);

    }
     
    Jogovskiy нравится это.
  8. KindMan

    KindMan Гуру

    С этими строками, у вас в любом случае светодиод погаснет, как только нет сигнала с датчика движения.
    А теперь нужен вариант с датчиком движения ;)
     
  9. Jogovskiy

    Jogovskiy Нерд

    Выглядит очень разжевано и хорошо, кажется завтра смогу сделать.
    Спасибо большое!

    Тему пока не закрываю, мало ли)
     
  10. Jogovskiy

    Jogovskiy Нерд

    Конечно он погаснет, а иначе смысл от датчика движения, никто не двигается, значит и свет никому не нужен.

    На счет с датчиком не нужно, я сам))
     
  11. KindMan

    KindMan Гуру

    Так а кнопка то зачем тогда?
    или я не правильно понял ваше описание.
     
  12. Jogovskiy

    Jogovskiy Нерд

    Если кнопка включена >> свет горит, датчик игнорируется
    А если кнопка не включена, свет в умном режиме, от датчика работает
     
  13. issaom

    issaom Гуру

    Ваша проблема в том что вы все хотите засунуть в один IF....
    Разбейте задачу на части:
    заведите еще одну логическую переменную - состояние_кнопки
    В лупе сначала идет процедура которая будет менять состояние этой переменной при клацании этой кнопки (с фишками антидребезга)
    А в отдельном IF уже в зависимости от состояния этой переменной сразу зажигайте свет (если кнопка нажата), или опрашивайте датчик и только тогда зажигайте свет. (если кнопка не нажата)
     
  14. parovoZZ

    parovoZZ Гуру

    ребята, вы реально отмачиваете. Алгоритм кто будет составлять? Не надо думать, что всё в голове. В голове даже профессионалы не держат. Берёшь лист бумаги и рисуешь. В этом нет ничего зазорного. Зато всё наглядно.
    алкоритм.png
    Утром встал, озарение пришло - взял и оптимизировал чутка. Алгоритм рядом с проектом держишь. Потом через неделю открыл и сразу всё встало по местам.
     
  15. Jogovskiy

    Jogovskiy Нерд

    Программу планирую большую, поэтому стараюсь компактнее, не выйдет , буду расписывать как вы советуете, спасибо.
     
  16. issaom

    issaom Гуру

    Если бы автор умел рисовать такие картинки - он бы тут не появился с таким вопросом, а мне дак под такую задачу было бы влом, что-то рисовать... я бы минут за 10-15 рабочее решение и так бы сделал
     
  17. Jogovskiy

    Jogovskiy Нерд

    Тут алгоритм не сложный, я расписал для себя словами, да и вопрос не в этом, но спасибо
     
  18. parovoZZ

    parovoZZ Гуру

    если бы это было так, то давно бы на код положил.

    так мы и не твою проблему обсуждаем. А автору топика ещё учиться и учиться. А учиться все начинают с букварей.
    Ну и над форматированием кода в редакторе надо поработать.
    Я понимаю, что не в моготу, как хочется что-то сделать и чтоб оно заработало. Но надо помнить, что красивые самолёты и летают красиво.
     
  19. issaom

    issaom Гуру

    Программа должна быть понятна Вам самому и должна работать. Пишите сначала рабочую версию как можно проще и понятнее для себя, а решение что там сократить обычно уже потом приходит. (но я например не всегда стремлюсь к оптимизации в ущерб читаемости кода)
     
  20. parovoZZ

    parovoZZ Гуру

    я наоборот, функции насыщаю переменными. Вот как здесь, например:
    Код (C++):
    void SSD1306_gLIB_DrawChar (uint8_t column_start, uint8_t page_start, const ImageChar_t* c, const uint8_t char_height)
    {
        const uint8_t* data;
        const ImageChar_t* Image_Char;

        uint8_t char_width;

        uint8_t page_end;
        uint8_t column_end;
        uint8_t count;

        Image_Char = c;

        char_width = Image_Char->width;

        column_end = (column_start + char_width - 1);
        page_end = page_start + (char_height / 8);
        count = Image_Char->count;

        data = Image_Char->data;

        SSD1306_gLIB_DrawBitmap (column_start, page_start, column_end, page_end, data, count);
    }
    Во-первых, очень сильно выручает при дебаге; а во-вторых, компилятор промежуточные переменные всё-равно выкинет, если гайки на оптимизацию накинуть.