Посоветуйте датчик движения.

rline
Offline
Зарегистрирован: 02.03.2022

Товарищи, нужен совет. Начал изучать ардуину и первая моя игрушка это включение адресной ленты при входе на кухню. Датчик движения использую SR505. Он висит над дверью на высоте примерно 230 см. Проблема в том, что он срабатывает через раз. Хорошо срабатывает если остановиться под ним примерно на 1 секунду. Если просто идти обычным шагом, то иногда не срабатывает. Как думаете это брак датчика или сама модель не очень чувствительная? Какой датчик посоветуете? Может быть есть смысл применить ультразвук?

b707
Offline
Зарегистрирован: 26.05.2017

Лучше купить готовый блок датчика на али с выходом прямо на 220в - тогда и ардуина не понадобится

rline
Offline
Зарегистрирован: 02.03.2022

Ардуина за одно управляет адресной светодиодной лентой.

SLKH
Offline
Зарегистрирован: 17.08.2015

rline пишет:

Ардуина за одно управляет адресной светодиодной лентой.

 RCWL-0516

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А где код? 

rline
Offline
Зарегистрирован: 02.03.2022
// датчик движения
int pirPin = 3; // назначение пина для мини ИК датчика
int value ;// переменная для хранения положения датчика
// лента
#define LED_PIN 2     // пин подключения ленты
#define LED_NUM 60    // количество светодиодов
  int countR=30;
  int countL=29;
  int mode=2; // режим движения 0 - от середины к краю, 1 - от края к середине
  int i;
#include "FastLED.h"
CRGB leds[LED_NUM];
void setup() {
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, LED_NUM);
  FastLED.setBrightness(50);
  Serial.begin (9600);

  Serial.print("countR=");
Serial.println(countR);
Serial.print("mode=");
Serial.println(mode);

pinMode (pirPin, INPUT) ; // пин датчика работает как вход
}

void loop () {
value = digitalRead (pirPin) ;// чтение значения с датчика
if (value == HIGH) // когда с ИК сенсора появляется высокий уровень, светодиод загорается
  {mode=0;
    Serial.println("movement");}
  else
  {
   mode=2;
  Serial.println("no movement");
  }
  delay(1000);


if (mode==2) // выключение
  {
  for (int i = 0; i < LED_NUM; i++)
  leds[i] = CHSV(0, 0, 0);
  FastLED.show();
  //mode=1;
  }  


if (mode==0) // от середины до конца
{do {
  
  leds[countR] = CHSV(48, 100, 50);
  leds[countL] = CHSV(48, 100, 50);
  
  leds[countR - 3] = CHSV(0, 0, 0);
  leds[countL + 3] = CHSV(0, 0, 0);
  
  FastLED.show();
  delay (30);
  countR++;
  countL--;
  
   // Serial.print("countR=");
//Serial.println(countR);
}
  while (countR < LED_NUM);
mode=1;
}
Serial.print("mode=");
Serial.println(mode);


if (mode==1) // от конца к середине
  {
  do {
  leds[countR] = CHSV(48, 100, 50);
  leds[countL] = CHSV(48, 100, 50);
  //leds[countR + 1] = CHSV(0, 0, 0);
  FastLED.show();
  delay (30);
  countR--;
  countL++;
  //Serial.print("countR=");
  //Serial.println(countR);
  }
  while (countR > LED_NUM/2-1);
  delay(20000); // сколько времени будет включенной
  }
  {mode=2;};




Serial.print("countR=");
Serial.println(countR);
Serial.print("mode=");
Serial.println(mode);
//mode=2;


}

Вот код. Думаете проблема именно в коде?

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

Нужно убирать delay(); в loop(); 

как только вы ввалились в delay(1000);

1 секунду вы висите в delay() и ничего не обрабатывается в loop(), пока вы не выйдите через секунду из delay();

Если за это время сработает датчик - это событие будет пропущено.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Меняй код с delay и будет тебе счастье.

http://arduino.ru/tutorials/BlinkWithoutDelay

sadman41
Offline
Зарегистрирован: 19.10.2016

С микроволновым датчиком надо быть осторожным, а то цветомузыка начнётся. Я бы объемник с сухим контактом попробовал.

Впрочем, согласен - сначала дилэи истребить следует.

rline
Offline
Зарегистрирован: 02.03.2022

SergeiL пишет:

Нужно убирать delay(); в loop(); 

как только вы ввалились в delay(1000);

1 секунду вы висите в delay() и ничего не обрабатывается в loop(), пока вы не выйдите через секунду из delay();

Если за это время сработает датчик - это событие будет пропущено.

Спасибо! Стало конечно лучше! Но всё равно не идеально.

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

rline пишет:

Спасибо! Стало конечно лучше! Но всё равно не идеально.

Так а вы как убрали, нужно переделать на millis() 

И delay() на 20 секунд нужно убирать. 

Все нужно убирать.