Работа с датчиком вибрации SW-420

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

  1. Defender

    Defender Нерд

    Здравствуйте. В моём проекте используется цифровой датчик вибрации совместно с сигнальной лампой 220В, которая подключена через реле. Необходимо чтобы лампа горела 3 секунды после появления сигнала о вибрации. Дело в том, что датчик очень быстро переходит в обратное состояние и лампа включившаяся на долю секунды опять не горит. Как датчик остановить на эти 3 секунды? Наведите на решение, пожалуйста.
     
  2. Vetrinus

    Vetrinus Гик

    Код (C++):
    bool vibration = false; //переменная для хранения наличия вибрации
    unsigned long now; //Переменная для хранения времени

    void loop {
      if (digitalRead(SW - 420)) {
        vibration=true;
        now=millis();
      }
      if(millis()-now >=3000) {
        vibration=false;
      }
      digitalWrite(Relay_pin, vibration);
    }
     
    Или вы имели ввиду не опрашивать датчик в течение этих трех секунд?
    В таком случае вам нужно просто в условие включения реле поставить трехсекундный делей.
    Разница между первым и вторым вариантами в том, что в первом вы все еще можете выполнять какой-либо код, пока идут эти три секунды. В случае с делеем такой возможности у вас не будет.
     
    Последнее редактирование: 19 май 2016
    Defender и Tomasina нравится это.
  3. Defender

    Defender Нерд

    Спасибо. Ваш код помог мне разобраться с флагами. У датчика ещё инвертированный сигнал, пришлось кое-что изменить. Ещё раз спасибо!
     
  4. Defender

    Defender Нерд

    Код (C++):
    bool vibration = false; // флаг есть вибрация или нет
    unsigned long now; // время когда появилась вибрация

    #define WINDOW 50 // окно

    #define VIB_PIN 6 // датчик вибрации


    void setup ()
    {
    pinMode(WINDOW, OUTPUT);

    pinMode(VIB_PIN, INPUT);
    }


    void loop ()
    {
    if(digitalRead(VIB_PIN) == LOW && vibration == 0)
    {
      vibration = true;
      digitalWrite(WINDOW, LOW);
      now = millis();
    }

    if(digitalRead(VIB_PIN) == HIGH && vibration == 1)
    {
      vibration = false;
    }

    if(millis() - now >= 3000)
    {
      digitalWrite(WINDOW, HIGH);
    }
    }