Посоветуйте датчик движения.
- Войдите на сайт для отправки комментариев
Пнд, 07/03/2022 - 16:13
Товарищи, нужен совет. Начал изучать ардуину и первая моя игрушка это включение адресной ленты при входе на кухню. Датчик движения использую SR505. Он висит над дверью на высоте примерно 230 см. Проблема в том, что он срабатывает через раз. Хорошо срабатывает если остановиться под ним примерно на 1 секунду. Если просто идти обычным шагом, то иногда не срабатывает. Как думаете это брак датчика или сама модель не очень чувствительная? Какой датчик посоветуете? Может быть есть смысл применить ультразвук?
Лучше купить готовый блок датчика на али с выходом прямо на 220в - тогда и ардуина не понадобится
Ардуина за одно управляет адресной светодиодной лентой.
Ардуина за одно управляет адресной светодиодной лентой.
А где код?
// датчик движения 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; }Вот код. Думаете проблема именно в коде?
Нужно убирать delay(); в loop();
как только вы ввалились в delay(1000);
1 секунду вы висите в delay() и ничего не обрабатывается в loop(), пока вы не выйдите через секунду из delay();
Если за это время сработает датчик - это событие будет пропущено.
Меняй код с delay и будет тебе счастье.
http://arduino.ru/tutorials/BlinkWithoutDelay
С микроволновым датчиком надо быть осторожным, а то цветомузыка начнётся. Я бы объемник с сухим контактом попробовал.
Впрочем, согласен - сначала дилэи истребить следует.
Нужно убирать delay(); в loop();
как только вы ввалились в delay(1000);
1 секунду вы висите в delay() и ничего не обрабатывается в loop(), пока вы не выйдите через секунду из delay();
Если за это время сработает датчик - это событие будет пропущено.
Спасибо! Стало конечно лучше! Но всё равно не идеально.
Спасибо! Стало конечно лучше! Но всё равно не идеально.
Так а вы как убрали, нужно переделать на millis()
И delay() на 20 секунд нужно убирать.
Все нужно убирать.