Простая сигнализация (кнопка, 2 диода, pir датчик)

Тема в разделе "Arduino & Shields", создана пользователем Duschman, 19 апр 2020.

  1. Duschman

    Duschman Нуб

    Добрый день, я новенький, программированием занимался только на паскале, поэтому имею определённые трудности. Написал код, но работает не корректно, подскажите, что я не так делаю?
    Условия:
    При нажатии кнопки загорается зелёный светодиод и через одну минуту активируется PIR датчик, в случае обнаружения движения - загорается красный светодиод. Синализация отключается кнопкой. Это один из вариантов кода:
    Код (C++):
    #define LED_PIN_RED 2
    #define LED_PIN_GREEN 3
    #define BTN_PIN 4
    #define SENSOR_PIN 5
    bool buttonWasUp = true;
    bool ledEnabled = false;

    void setup()
    {
      Serial.begin(9600);
      pinMode(LED_PIN_RED, OUTPUT);
      pinMode(LED_PIN_GREEN, OUTPUT);
      pinMode(BTN_PIN, INPUT_PULLUP);
      pinMode(SENSOR_PIN, INPUT);
    }

    void loop()
    {
      bool buttonIsUp = digitalRead (BTN_PIN);
      if (buttonWasUp && !buttonIsUp)
      {
      delay (10);
      buttonIsUp = digitalRead (BTN_PIN);
      if(!buttonIsUp)
        {
          ledEnabled = !ledEnabled;
          digitalWrite (LED_PIN_GREEN, ledEnabled);
          while (digitalRead(BTN_PIN) == LOW);
          {
            Serial.println("Motion detected");
            int val = digitalRead (SENSOR_PIN);
            if (val == HIGH)
            {
              digitalWrite(LED_PIN_RED, HIGH);
              Serial.println("Motion detected");
            }
            else
              digitalWrite(LED_PIN_RED, LOW);;
          }
        }
      }
      buttonWasUp = buttonIsUp;
    }
     
     
  2. Daniil

    Daniil Гуру

    А как работает код в реальности?
    У вас кнопка притянута к земле или питанию?
     
  3. Duschman

    Duschman Нуб

    не знаю, собирал по гайдам, понимание не полное, могу показать схему
     

    Вложения:

  4. vvr

    vvr Инженерище

    у вас датчик активируется не по времени, а по удержанию кнопки.
    это как то не увязывается с вашим заданием.
     
  5. Duschman

    Duschman Нуб

    правильно, он должен активироваться спустя минуту после нажатия кнопки. Или Вы о том, что кусок кода, отвечающего за датчик нужно вынести из цикла кнопки и вставить после?
     
    Последнее редактирование: 19 апр 2020
  6. vvr

    vvr Инженерище

    Правильно, у вас никаких минут нет...
     
  7. vvr

    vvr Инженерище

    у вас есть состояние датчика - активный или нет.
    нажали кнопку - запустился таймер.
    оттикал минуту - датчик активен, таймер не работает..
    играетесь с датчиком.
    нажали кнопку - датчик не активен, таймер не работает.
     
  8. Duschman

    Duschman Нуб

    я ставил задержку через delay(60000) перед активацией датчика, но всё равно работает не правильно, поэтому его на время убрал. Я не понимаю как выйти из цикла проверки состояния кнопки и при этом продолжать влиять на состояние кнопки. Мне кажется, нужно ввести переменную bool которая будет отвечать за состояние датчика?
     
  9. vvr

    vvr Инженерище

    Я вам нацарапал алгоритм работы.
    Вот и пишите по нему программу.
    Сначала научитесь кнопкой запускать и останавливать таймер.
    В сериал выводите параметры чтобы представлять что происходит и отлавливать ошибки.
     
    Duschman нравится это.
  10. Duschman

    Duschman Нуб

    Не нашёл как устанавливать таймеры, нашёл только delay и milis. Сигнализация срабатывает только если через 6 сек. датчик улавливал движение
    Код (C++):
    #define LED_PIN_RED 2
    #define LED_PIN_GREEN 3
    #define BTN_PIN 4
    #define SENSOR_PIN 5
    bool buttonWasUp = true;
    bool ledEnabled = false;
    bool alarm = false;

    void setup()
    {
      Serial.begin(9600);
      pinMode(LED_PIN_RED, OUTPUT);
      pinMode(LED_PIN_GREEN, OUTPUT);
      pinMode(BTN_PIN, INPUT_PULLUP);
      pinMode(SENSOR_PIN, INPUT);
    }

    void loop()
    {
      bool buttonIsUp = digitalRead (BTN_PIN);
      if (buttonWasUp && !buttonIsUp)
      {
        delay (10);
        buttonIsUp = digitalRead (BTN_PIN);
        if(!buttonIsUp)
        {
          ledEnabled = !ledEnabled;
          alarm = !alarm;
          digitalWrite (LED_PIN_GREEN, ledEnabled);
          if (alarm == true)
          {
            delay (6000);
            int val = digitalRead (SENSOR_PIN);
            if (val == HIGH)
            {
              digitalWrite(LED_PIN_RED, HIGH);
              Serial.println("Motion detected");
            }
              else
              digitalWrite(LED_PIN_RED, LOW);
           }
        }
      }
      buttonWasUp = buttonIsUp;
    }