Помогите с ШИМ сриптом
- Войдите на сайт для отправки комментариев
Ардуинка с датчиком + 2 светодиода (для теста, после теста будет 8 шт.).
Логика: Есть кратковременный сигнал от датчика, запускаем плавное зажигание светодиодов, при достижении последнего ждем и далее уже плавно гасим. Если при гашении датчик опять сработал, то плавно обратно возвращаем яркость светодиодов с того, на котором остановились, когда появился повторный сигнал с датчика.
Все нормально работает, но, если датчик подает сигнал при начале гашения на первом светодиоде с конца, то начинается какафония. Последовательно все светодиоды начинают тухнуть и зажигаться, вне зависимости от того, что затрагивался только крайний светодиод.
Первые варианты программного когда были операторах IF (все работало как я хотел, но иногда зависал процесс, на датчик ничего не реагировало)... потом я перешел на switch, код упростился, но осталось добить последний глюк, который я не могу выявить.
int calibrationTime = 2; int pirPin = A0; //вывод подключения сенсора int Ledstart = 5; //пин первого светодиода int timedelay=0; //задержка между огнями int lnumber=6; //пин последнего светодиода int i,j; //переменные int wait = 3000; //ожидание по свечению после датчика int PinStart; // с этого пина стартуем int FadeStart; // с этой яркости стартуем int FadeStop; // здесь запомним величину яркости int PinStop; // здесь запомним светодиод на котором остановилось гашение int programsNumber; ///////////////////////////// //SETUP void setup(){ Serial.begin(9600); pinMode(pirPin, INPUT); digitalWrite(pirPin, LOW); for (i=Ledstart;i<=lnumber;i++) //определяем какие порты будут у нас рабочими, к примеру для 8 светодиодов: 0-7 { pinMode(i,OUTPUT); } //дадим датчику время на калибровку Serial.print("calibrating sensor "); for(int i = 0; i < calibrationTime; i++){ Serial.print("."); delay(1000); } Serial.println(" done"); Serial.println("SENSOR ACTIVE"); delay(50); programsNumber = 0; PinStart = Ledstart; Ledstart; } //////////////////////////// //LOOP void loop(){ //... начало старта по движению if(digitalRead(pirPin) == HIGH && digitalRead(Ledstart) == 0 ){ //..если датчик сработал и первый светодиод не горит Serial.println("START"); PinStart = Ledstart; // указываем первый пин светодиода при первом старте programsNumber = 1; // запуск первого case логики j=0; FadeStart = 0; // стартуем с нуля по яркости } switch (programsNumber) { case 1: //... полное нарастание при старте { for(int FadeStart = FadeStart; FadeStart <= 255; FadeStart ++) { // тут только один светодиод, который зажигается с уровня яркости котоырй зафиксировали после того, как сработал датчик при гашении. До этого, он просто идет первым при плавном зажигании, при первом срабатывании датчика analogWrite(PinStart, FadeStart); delay(6); } for (int i=PinStart+1;i<=lnumber;i++) { // зажигание остальных светодиоды после гашения с 0 уровня яркости for(int fadeValue = 0 ; fadeValue <= 255; fadeValue ++) { analogWrite(i, fadeValue); delay(6); } delay(timedelay);//подождали перед следующим светодиодом } delay(wait); // пауза на свечение for (int i=lnumber;i>=Ledstart;i--) { //.. переход на затухание после полного зажигания света for(int fadePirPin = 255; fadePirPin >= 0; fadePirPin -=1) { //the led visualizes the sensors output pin state analogWrite(i, fadePirPin); delay(15); if(digitalRead(pirPin) == HIGH ){ //... если при гашении срабатывает датчик останавливаем гашение и запоминаем на каком светодиоде остановилось и на каком уровне гашения Serial.println("stop"); delay(10); j=2; break; } FadeStop = fadePirPin; // тут фиксируем уровень яркости при гашении и срабатывании break на датчик PinStop = i; // тут запомниаем светодиод при brake на датчик Serial.println(PinStop); Serial.println(fadePirPin); } } programsNumber=0+j; // переходим на case 2 если сработал датчик при гашении } break; case 2: //...дозажигает светодиод { Serial.println("start grow "); PinStart = PinStop; FadeStart = FadeStop; j=0; programsNumber=1; // идем на case 1 и дозажигаем погасшие светодиоды } break; } }
я не знаю где проблема, есть вероятность, что это тут:
for (int i=PinStart+1;i<=lnumber;i++) {
И то, что светодиод который идет после одиночного за счет того, что +1 - становится больше чем пин последнего светодиода (inumber)
Из-за чего рушится вся локига и светодиоды с первого выключаются и заново увеличивают яркость. МОгу ошибаться конечно. В общем нужна помощь.
Больше глобальных переменных для бога глобальных переменных!
Больше глобальных переменных для бога глобальных переменных!
У вас комплекс насчет глобальных переменных в элементарных скетчах?
Б - Бережливость.
Блин-блинский! Двумя темами ниже я приводил готовое решение этой проблемы на случай 5-и датчиков и 5-и ламп. Ну искать что-ли совсем лень!!!???
http://arduino.ru/forum/programmirovanie/upravlenie-svetom-s-pomoshchyu-arduiny-i-datchika-dvizheniya
Если хочется найти ошибку именно в вашем скетче, то увы, я не возьмусь.