Всем доброго времени суток! Я не сильно силен в написании кодов и не как не могу закончить. Код работает как нужно за исключением одного нюанса, который надо исправить и я не как не могу понять, как это сделать. Нужно чтобы работало так: есть три светодиода и датчик движения, когда датчик обнаруживает движение, то плавно включает светодиоды один за другим (это работает), если в течение 15 секунд повторяется движение, то светодиоды не выключаются (это тоже работает), если в течение 15 секунд, движения не обнаружено, то все три светодиода плавно гаснут вместе (и это работает). Проблема в следующем: в тот момент, когда светодиоде начинают затухать, датчик не откликается пока они полностью не потухнут, а необходимо если светодиоды начали затухать и в этот момент обнаружено движение, то они обратно, плавно зажглись, не дожидаясь полного выключения.
Код (C++): #define LED1 3 #define LED2 5 #define LED3 6 #define timeON 2 #define timeOFF 30 #define delayON 15000 int Sharp=2; int i = 0; int on=0; int off=1; unsigned long timeroff; void setup() { pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(Sharp, INPUT); } void loop() { int val1=digitalRead(Sharp); delay(10); int val2=digitalRead(Sharp); if (val1==1&&val2==1&&on==0) { for (i = 0; i < 256; i++) { analogWrite(LED1, i); delay(timeON); if (i==255) { for (i = 0; i < 256; i++) { analogWrite(LED2, i); delay(timeON); if (i==255) { for (i = 0; i < 256; i++) { analogWrite(LED3, i); delay(timeON);} } } } } on=1;off=0;} else if (val1==1&&val2==1&&on==1) { off=0;timeroff=0; } else if (val1==0&&val2==0&&timeroff==0) { timeroff=millis(); } else if (val1==0&&val2==0&&off==0&&millis()-timeroff>delayON) { for (i = 255; i >= 0; i--) { analogWrite(LED1, i); analogWrite(LED2, i); analogWrite(LED3, i); delay(timeOFF); } off=1;on=0;timeroff=0; } }
Не успел до конца разобраться в коде, но, с точки зрения логики С, нужно сделать следующее: внутрь цикла, выключающего светодиоды, вставить проверку датчика движения. Если проходит, то break'ом или goto'м выйти и включить. Грубо, но должно сработать. Вечером могу попробовать и код набросать
Спасибо за ответ! С break'ом пытался, но скорее всего я не правильно понимаю выполнение программой порядок условий в коде, поэтому получалось все время не то что нужно! Коды попроще мне дались легче, а вот там где нужно глубже понять происходящее, я сразу путаюсь. Вообщем мне еще учиться, учиться, учиться! Если кому-то не трудно поэтапно. Всем СПАСИБО за помощь!
Всем спасибо код закончен и работает так как нужно! Отдельно СПАСИБО Ignis работа продолжилась по его предложению и добавив еще немного получилось то, что нужно!
Вот что получилось, может кому-то пригодится! Код (C++): #define LED1 3 #define LED2 5 #define LED3 6 #define timeON 2 #define timeOFF 50 #define delayON 5000 int Sharp=2; int i = 0; int on=0; int off=1; unsigned long timeroff; int L = 0; void setup() { pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(Sharp, INPUT); } void loop() { int val1=digitalRead(Sharp); delay(10); int val2=digitalRead(Sharp); if (val1==1&&val2==1&&on==0&&L==1) { for (i = i; i < 256; i++) { analogWrite(LED1, i); analogWrite(LED2, i); analogWrite(LED3, i); delay(timeON); } on=1;off=0; L=0; } if (val1==1&&val2==1&&on==0&&L==0) { for (i = 0; i < 256; i++) { analogWrite(LED1, i); delay(timeON); if (i==255) { for (i = 0; i < 256; i++) { analogWrite(LED2, i); delay(timeON); if (i==255) { for (i = 0; i < 256; i++) { analogWrite(LED3, i); delay(timeON);} } } } } on=1;off=0;} else if (val1==1&&val2==1&&on==1) { off=0;timeroff=0; } else if (val1==0&&val2==0&&timeroff==0) { timeroff=millis(); } else if (val1==0&&val2==0&&off==0&&millis()-timeroff>delayON) { for (i = 255; i >= 0; i--) { analogWrite(LED1, i); analogWrite(LED2, i); analogWrite(LED3, i); delay(timeOFF); if(digitalRead(Sharp) == HIGH) { L=1; break; } } off=1;on=0;timeroff=0; } }