Всем доброго времени суток! Помогите в написании скетча. Имеется датчик движения, ардуино уно. Нашел скетч для зажигания светодиода от значения датчика, немного переделал и собрал, всё работает отлично. Но мне нужно чтобы при обнаружении движения светодиод загорался плавно (до значения к примеру в 255) и горел пока есть движение. И чтобы он так же плавно затухал при прекращении движения. Вот что я намудрил, но тут светодиод очень быстро моргает. Есть некоторые условия, датчик настроен так что у него есть минимальное время включения (например он выдает сигнал HIGH минимум 2 секунды) а светодиод при этом не успевает по условиям скетча разгореться до максимального значения, так вот хотелось бы чтобы светодиод не затухал пока не наберет максимального значения даже при прекращении движения. И еще, пока есть движение на датчике чтобы он держал максимальное значение светодиода. В конечном итоге я хочу данный скет залить на Atttiny 2313a int pir = 7; int led = 9; void setup() { Serial.begin(9600); pinMode(pir, INPUT); pinMode(led, OUTPUT); } void loop() { int pirVal = digitalRead(pir); if(pirVal == HIGH); { for (int up=0; up <= 255; up++) analogWrite(led, up); Serial.print("Motion detected"); delay(30); } if(pirVal == LOW); { for (int dwn=255; dwn >= 0; dwn--) analogWrite(led, dwn); Serial.print("Motion detected"); delay(30); } }
Код (Text): #define PIR 7 // пин для ДД #define LED 9 // пин для LED #define PAUSE 30 // задержка изменения яркости LED #define MOTION_DETECTED (digitalRead(PIR)) // макрос для более наглядного кода boolean prevMotion = false; void setup() { Serial.begin(9600); pinMode(PIR, INPUT); pinMode(LED, OUTPUT); } void loop() { if(MOTION_DETECTED) // если обнаружено движение (ДД выдает HIGH) { if (!prevMotion) // если до этого LED был выключен, то включаем { Serial.println("Motion detected"); prevMotion = true; // флаг, для следующего цикла о том, что ДД уже был активен ledBright(); } } else // если ДД выдает LOW { if (prevMotion) // если до этого LED был включен, то гасим, иначе игнорируем { Serial.println("Timeout"); prevMotion = false; ledBright(); } } } void ledBright() { for (byte count = 0; count < 255; count++) // 255 шагов яркости { byte value = 255 * (1 - prevMotion) + (2 * prevMotion - 1); // 0...255 при prevMotion:true и 255...0 при prevMotion:false //Serial.println(value); analogWrite(LED, value); delay(PAUSE); } }