Ультразвуковой датчик управления реле (помогите новичку)

Ramzes
Offline
Зарегистрирован: 25.09.2013

Здравствуйте, сразу попрошу не пинать если что не так. Появилась необходимость в устройстве которое замыкало бы реле (на некоторое время) после того как перед датчиком на расстоянии 40 см находилось препятствие в течении 30сек скажем. Ультразвуковой датчик HC - SR04. Приблизительный скетч набросал (пока вместо реле светодиоды). Теперь вопрос. Подскажите как мне теперь описать счетчик который будет тикать секунды? И второй вопрос. Правильным ли путем я иду? Или нужно было делать по прерыванию? 

 

#include "Ultrasonic.h"
int ledPin_1 = 13,
       ledPin_2 = 2;

// Trig - 3, Echo - 4
Ultrasonic ultrasonic(3, 4);

void setup()
{
  pinMode(ledPin_1, OUTPUT);
  pinMode(ledPin_2, OUTPUT);
 }

void loop()
{
   float dist_cm = ultrasonic.Ranging(CM);       // get distance
   if (dist_cm < 40)
   {
   digitalWrite(ledPin_2, HIGH);
   digitalWrite(ledPin_1, LOW);
   }
   else
   {
   digitalWrite(ledPin_1, HIGH);
   digitalWrite(ledPin_2, LOW);
   }
             
  delay(100);                                  
}

 

maksim
Offline
Зарегистрирован: 12.02.2012
void loop()
{
  float dist_cm = ultrasonic.Ranging(CM);       // get distance
  static unsigned long start = 0;
  if (dist_cm < 40)
  {
    if(!start) start = millis();
  }
  else
  {
    start = 0;
    digitalWrite(ledPin_1, HIGH);
    digitalWrite(ledPin_2, LOW);
  }

  if(start && (millis()-start > 30000))
  {
    digitalWrite(ledPin_2, HIGH);
    digitalWrite(ledPin_1, LOW);
  }
  
  delay(100);                                  
}

 

Ramzes
Offline
Зарегистрирован: 25.09.2013

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

maksim
Offline
Зарегистрирован: 12.02.2012

Ramzes пишет:

не знал что на ардуино это так просто.

Так же просто будет где угодно, но небольшое количество строк не равно простота.

Ramzes пишет:

Как теперь указать время на которое необходимо включать ?  

Нужно конкретизировать. А вобщем точно также как и выше в коде.

maksim
Offline
Зарегистрирован: 12.02.2012

Ramzes пишет:

Только теперь при появлении препятствия реле срабатывает, а после исчезания не выключается. до тех пор пока кратковременно препятствие снова не появится.

А?

maksim
Offline
Зарегистрирован: 12.02.2012
void loop()
{
  float dist_cm = ultrasonic.Ranging(CM);       // get distance
  static unsigned long start = 0;
  static unsigned long on = 0;
  if (dist_cm < 40)
  {
    if(!start) start = millis();
  }
  else
  {
    start = 0;
    on = 0;
    digitalWrite(ledPin_1, HIGH);
    digitalWrite(ledPin_2, LOW);
  }

  if(start && (millis()-start > 30000))
  {
    if(!on) 
    {
      on = millis();
      digitalWrite(ledPin_2, HIGH);
      digitalWrite(ledPin_1, LOW);
    }
    if(on && (millis()-on > 5000))
    {
      digitalWrite(ledPin_1, HIGH);
      digitalWrite(ledPin_2, LOW);
    }
  }

  delay(100);                                  
}