HC-SR04 и delay

victorv
Offline
Зарегистрирован: 31.07.2015

Здравствуйте , столкнулся с такой проблемой -в скетче для   HC-SR04 есть задержка для коректной работы датчика

   float dist_cm = ultrasonic.Ranging(CM);      
   delay(100);

и при необходимости постоянного мониторинга расстояния из за задержки ритмично срабатывает реле , хотя расстояние не меняется . Можно перед реле поставить реле с задержкой включения , но есть ли программный способ убрать это ?

 

Araris
Offline
Зарегистрирован: 09.11.2012

Способ есть, скетч покажите.

victorv
Offline
Зарегистрирован: 31.07.2015

Araris пишет:

Способ есть, скетч покажите.

 

#include "Ultrasonic.h"
int FAN = 7; // пин вытяжка
int Light = 8; // пин свет
long OnTime = 10000; // время работы вытяжки , мс
int ledState = LOW;
int pinButton = 2; // пин, вход от датчика движения
int Flag = 0;
unsigned long previousMillis = 0;
// sensor connected to:
// Trig - 3, Echo - 4
Ultrasonic ultrasonic(3,4);

void setup()
{
  pinMode(FAN, OUTPUT);
  pinMode(Light, OUTPUT);
  digitalWrite(FAN, HIGH);
  digitalWrite(Light, HIGH);
  digitalWrite(pinButton, LOW );
  pinMode(3, OUTPUT);
  pinMode(4, INPUT);
  Serial.begin(9600);    

}

void loop()
{
  float dist_cm = ultrasonic.Ranging(CM);       // get distance
  Serial.println(dist_cm);
  delay(100);                     

  unsigned long currentMillis;
  if ((dist_cm)<100 && (Flag == 0))
  {
    digitalWrite(FAN, HIGH);// выключаем вытяжку
    digitalWrite(Light, LOW);//включаем свет
    delay (2000);
    Flag = 1;
  }  else  {
    digitalWrite(Light, HIGH);
    Flag = 0;

  }

  //if (digitalRead (pinButton) == LOW)
  {
    currentMillis = millis();

    // проверяем сколько прошло времени,
    // если больше заданного - выключаем
    if (currentMillis - previousMillis >= OnTime)
    {
      ledState = LOW;
      previousMillis = 0;
      digitalWrite(FAN, HIGH);

    }
  }

  // если кнопка не нажата и Flag=1
  if (digitalRead (pinButton) == LOW && (Flag == 1))
  {
    previousMillis = currentMillis; // запоминаем время
    ledState = HIGH;
    digitalWrite(FAN, LOW);

  }
}

 

 

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

Araris
Offline
Зарегистрирован: 09.11.2012

Не думаю, что причина бед в delay(100);

Вставьте перед нужными digitalWrite() вывод отладочных сообщений в консоль ( Serial.println("message 1"); ), чтобы видеть, каким путем выполняется код и посмотрите в мониторе порта, что происходит при выполнении скетча.