Товарищи, нужна помощь. В общем идея следующая. При входе на кухню включается подсветка на адресной светодиодной ленте. Используется датчик движения sr-505, датчик освещения ky-018 и две ленты ws-2812.
Вот схема подключения:
Вот код
int pirPin = 3; // назначение пина для ИК датчика
int value;// переменная для хранения положения датчика
int sensorvalue;// переменная для хранения датчика движения
// лента
#define LED_PIN1 2 // пин подключения первой ленты
#define LED_PIN2 4 // пин подключения второй ленты
#define LED_NUM 60 // количество светодиодов
int countR=30;
int countL=29;
int mode=2; // режим движения 0 - от середины к краю, 1 - от края к середине, 2 - выключение
int i;
long previousMillis; // храним время последнего переключения светодиода
long interval = 30; //скорость движения светодиода
long worktime = 20000; //время работы ленты до выключения
byte sensorPin = A0; // переменная входа А0 датчика освещения
#include "FastLED.h"
CRGB leds[LED_NUM];
void setup() {
FastLED.addLeds<WS2812, LED_PIN1, GRB>(leds, LED_NUM); // первая лента
FastLED.addLeds<WS2812, LED_PIN2, GRB>(leds, LED_NUM); // вторая лента
FastLED.setBrightness(255);
Serial.begin (9600);
Serial.print("countR=");
Serial.println(countR);
Serial.print("mode=");
Serial.println(mode);
pinMode (pirPin, INPUT) ; // пин датчика движения работает как вход
pinMode(sensorPin, INPUT); // пин датчика освещения работает как вход
}
void loop () {
sensorvalue = analogRead(sensorPin); // значение с датчика освещения в диапазоне от 0 до 1023
value = digitalRead (pirPin) ;// чтение значения с датчика движения
if (value == HIGH && sensorvalue>900 ) // когда с ИК сенсора появляется высокий уровень и уровень датчика света больше значения, светодиод загорается
{mode=0;
Serial.println("movement");}
else
{ mode=2;
Serial.println("no movement"); }
if (mode==2) // выключение
{
for (int i = 0; i < LED_NUM; i++)
leds[i] = CHSV(0, 0, 0);
FastLED.show();
//mode=1;
}
if (mode==0) // от середины до конца
{delay (2000); // пауза 2 секунды перед включением
do
{
{leds[countR] = CHSV(255, 0, 255);
leds[countL] = CHSV(255, 0, 255);
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(255, 0, 255);
leds[countL] = CHSV(255, 0, 255);
//leds[countR + 1] = CHSV(0, 0, 0);
FastLED.show();
delay (30);
countR--;
countL++;
}
while (countR > LED_NUM/2-1);
delay(120000); // сколько времени будет включенной
}
{mode=2;};
Serial.print("countR=");
Serial.println(countR);
Serial.print("mode=");
Serial.println(mode);
Serial.print("sensorvalue=");
Serial.println(sensorvalue);
//mode=2;
}
Проблема следующая. Когда я всё это настраивал и ардуина была подключена к компу через usb то всё работало нормально. Лента включалась если пройти мимо датчика движения и если темно. Когда я перетащил всё на кухню и подключил ардуину к блоку питания, то лента перестала выключаться. Отрабатывает она по алгоритму, зажигается как и прописано в коде. Но как только она гаснет по истечении установленного времени, то тут же включается снова. Думал датчик движения цепляю, для эксперимента закрыл его в шкаф, там он точно не мог бы сработать, но всё равно лента включается. Подскажите пожалуйста в какую сторону копать.
Я новичок в ардуине, это мой первый опыт и я не программист, поэтому если можно объясните всё на пальцах.