RGB лента и SR505 скетч

BarsX
Offline
Зарегистрирован: 05.05.2021

Приветствую вас! У меня к вам просьба, может ли кто то подсказать как правильно написать скетч для Arduino NANO? Суть задачи такова, нужно что бы при срабатывании датчика движения (SR505) поочередно загорались диоды светодиодной ленты и когда очередь дойдет до последнего, это все добро светило определенное количество времени (для теста я взял кусочек ленты с 3мя светодиодами).В общем макет я собрал и протестил скетч что бы просто при включении светодиоды загорались по очереди, так же проверил работает ли датчик движения. Дальше решил вклинить один скетч во второй, по идеи оно должно было заработать, но что то пошло не так)) Скетч не реагирует на датчик движения, а просто зациклил работу ленты....

Хотелось что бы при срабатывании датчика движения, поочередно загорались светодиоды, и продолжали светить некоторое время, далее если датчик движения не шлет сигнал то светодиоды тухли через 2 минуты и цикл завершался, до тех пор пока датчик не пошлет сигнал снова.

Вот тот скетч что я сотворил:

#include "Adafruit_NeoPixel.h"
#define LED_COUNT 3 //количество светодиодов
int pirPin = 2; //пин к которому подключен датчик движения
int value;
int LED_PIN = 4; //пин к которому подключен информационный вход ргб ленты
Adafruit_NeoPixel strip = Adafruit_NeoPixel (LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
 
void setup()
{
Serial.begin(9600);
pinMode (LED_PIN, OUTPUT);
pinMode (pirPin, INPUT);
}
 
void loop()
{
  value = digitalRead (pirPin);
  if (value == HIGH)
  {
  for (int i = 0; i < LED_COUNT; i++)
  {
    strip.setPixelColor(i, strip.Color (0, 0, 0));
  }
  strip.show();
  delay (100); //задержка включения
  
  for (int i = 0; i < LED_COUNT; i++)
  {
    strip.setPixelColor(i, strip.Color (255, 255, 255));
    strip.show();
  delay (350); //задержка поочередного включения светодиодов
  }
  
  for (int i = 0; i < LED_COUNT; i++)
  {
    strip.setPixelColor(i, strip.Color (255, 255, 255));
  }
  strip.show();
  delay (8000); //длительность свечения всех светодиодов после поочередного включения (1000 = 1 секунда)
  }
  else
  {
    digitalWrite (LED_PIN, LOW);
    Serial.println("no motion");
  }
}

 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

Первое сообщение не редактируется, вставьте новым.

BarsX
Offline
Зарегистрирован: 05.05.2021
#include "Adafruit_NeoPixel.h"
#define LED_COUNT 3 //количество светодиодов
int pirPin = 2; //пин к которому подключен датчик движения
int value;
int LED_PIN = 4; //пин к которому подключен информационный вход ргб ленты
Adafruit_NeoPixel strip = Adafruit_NeoPixel (LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
 
void setup()
{
Serial.begin(9600);
pinMode (LED_PIN, OUTPUT);
pinMode (pirPin, INPUT);
}
 
void loop()
{
  value = digitalRead (pirPin);
  if (value == HIGH)
  {
  for (int i = 0; i < LED_COUNT; i++)
  {
    strip.setPixelColor(i, strip.Color (0, 0, 0));
  }
  strip.show();
  delay (100); //задержка включения
  
  for (int i = 0; i < LED_COUNT; i++)
  {
    strip.setPixelColor(i, strip.Color (255, 255, 255));
    strip.show();
  delay (350); //задержка поочередного включения светодиодов
  }
  
  for (int i = 0; i < LED_COUNT; i++)
  {
    strip.setPixelColor(i, strip.Color (255, 255, 255));
  }
  strip.show();
  delay (8000); //длительность свечения всех светодиодов после поочередного включения (1000 = 1 секунда)
  }
  else
  {
    digitalWrite (LED_PIN, LOW);
    Serial.println("no motion");
  }
}

 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

delay() полностью останавливает работу контроллера, посмотрите в сторону http://arduino.ru/tutorials/BlinkWithoutDelay

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Плохо - Вы всё время чего-то пишете. Не надо так делать. Используйте промежуточную булеву переменную.

Алгоритм такой

1. Проверяем датчик

2. Если датчик не работает И промежуточная переменная равна 0 - ничего не делаем

3. Если датчик работает И промежуточная переменная равна 1 - ничего не делаем

4. Датчик не работает И промежуточная переменная равна 1 записываем в промежуточную переменную 1 и включаем светодиоды, выводим на ленту.

5. Датчик работает И промежуточная переменная равна 0 записываем в промежуточную переменную 0 и выключаем светодиоды, выводим на ленту.

Кстати, старое значение датчика можно назвать oldvalue :)