как остановить цикл analogWrite

CARLOS
CARLOS аватар
Offline
Зарегистрирован: 09.11.2016

Всем добрый день!

Задача - при нажатии кнопки плавно зажечь ленту и остановить её в максимальной яркости, при выкл соотв. наоборот.

void loop() 
{ 
   if (digitalRead(BUTPV)== HIGH) 
      {
      for (brightness = 0; brightness <= Maxbright; brightness++) 
                                        {
                                        analogWrite(pinOUT, brightness);  
                                        delay(smoothSwitchDelayStep - pause);
                                        }
                 //break;
                 //goto m;
                  if (brightness == Maxbright){digitalWrite(pinOUT, HIGH);}                       
      }
    else       
         {  digitalWrite(pinOUT, LOW);}
}

Антидребезг реализую аппаратно, проверял работает.

Проблема в том, что цикл повторяется. Пробывал Break и метку с переходом на digitalWrite - безуспешно.

Однократно программу реализовывать не вариант, так как нужно постоянное слежение за кнопкой.

Заранее спасибо !

CARLOS
CARLOS аватар
Offline
Зарегистрирован: 09.11.2016

Прошу прощения..

void loop() 
{ 
   if (digitalRead(BUTPV)== HIGH) 
      {
      for (brightness = 0; brightness <= Maxbright; brightness++) 
                                        {
                                        analogWrite(pinOUT, brightness);  
                                        delay(smoothSwitchDelayStep - pause);
                                        }
                 //break;
                 //goto m;
      }
                  if (brightness == Maxbright){digitalWrite(pinOUT, HIGH);}                       
      
    else       
           digitalWrite(pinOUT, LOW);
}

 

strarbit
Offline
Зарегистрирован: 12.06.2016

CARLOS пишет:

Всем добрый день!

Задача - при нажатии кнопки плавно зажечь ленту и остановить её в максимальной яркости, при выкл соотв. наоборот.

Антидребезг реализую аппаратно, проверял работает.

Проблема в том, что цикл повторяется. Пробывал Break и метку с переходом на digitalWrite - безуспешно.

Однократно программу реализовывать не вариант, так как нужно постоянное слежение за кнопкой.

 А как кнопка `понимает`, что   выкл соотв?

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

 Жрите и дальше ваш delay()

CARLOS
CARLOS аватар
Offline
Зарегистрирован: 09.11.2016

strarbit пишет:

CARLOS пишет:

Всем добрый день!

Задача - при нажатии кнопки плавно зажечь ленту и остановить её в максимальной яркости, при выкл соотв. наоборот.

Антидребезг реализую аппаратно, проверял работает.

Проблема в том, что цикл повторяется. Пробывал Break и метку с переходом на digitalWrite - безуспешно.

Однократно программу реализовывать не вариант, так как нужно постоянное слежение за кнопкой.

 А как кнопка `понимает`, что   выкл соотв?

 

 

Имел в виду при выкл кнопки процесс в обратную сторону - тушение ШИМом до 0 и удержание 0 до тех пор, пока кнопку не вкл

CARLOS
CARLOS аватар
Offline
Зарегистрирован: 09.11.2016

qwone пишет:

 Жрите и дальше ваш delay()

 

Дело даже не в delay, а в том как в цикле, срабатывающем по событию что-то сделать циклом, а потом удержать это что-то пока не произойдет другое событие.....delay временен)

strarbit
Offline
Зарегистрирован: 12.06.2016

CARLOS пишет:

Имел в виду при выкл кнопки процесс в обратную сторону - тушение ШИМом до 0 и удержание 0 до тех пор, пока кнопку не вкл

ведите счетчик нажатий кнопки. При первом нажатии плавно зажечь ленту, при втором плавно потушить

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

у вас уже есть цикл - loop() и millis() . Учитесь проектировать программы, перед тем как писать код.

CARLOS
CARLOS аватар
Offline
Зарегистрирован: 09.11.2016

qwone пишет:

у вас уже есть цикл - loop() и millis() . Учитесь проектировать программы, перед тем как писать код.

ну так millis() предполагает, что по его истечению программа будет возвращаться в LOOP, где сидит ШИМ, что не нужно.

Счётчик нажатий тут не нужен, 2 состояния кнопки, контролирую digitalRead

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

#6 переделайте программу и будет вам решение.

strarbit
Offline
Зарегистрирован: 12.06.2016

Счётчик нажатий тут не нужен, 2 состояния кнопки, контролирую digitalRead

А в чем интерес нажата кнопка - плавно зажечь, отпущена - плавно потушить? в таком случае лента включена пока нажата кнопка

 

strarbit
Offline
Зарегистрирован: 12.06.2016
vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Пробуйте!!

#define BUTPV 2
#define pinOUT 5
bool f_led;


void setup() {
  pinMode(BUTPV, INPUT);
  pinMode(pinOUT, OUTPUT);
}

void loop() {
  if (digitalRead(BUTPV) == HIGH && !f_led)
  {
    f_led = 1;

    for ( int counter = 0; counter < 255; counter++)
    {
      analogWrite(pinOUT, counter);
      delay(100);
    }
    digitalWrite(pinOUT, HIGH);
  }

  if (digitalRead(BUTPV == LOW)) {
  f_led = 0;
 for ( int counter = 255; counter >0; counter--)
    {
      analogWrite(pinOUT, counter);
      delay(100);
    }
    digitalWrite(pinOUT, LOW);
  }
}

 

CARLOS
CARLOS аватар
Offline
Зарегистрирован: 09.11.2016

vosara пишет:

Пробуйте!!

#define BUTPV 2
#define pinOUT 5
bool f_led;


void setup() {
  pinMode(BUTPV, INPUT);
  pinMode(pinOUT, OUTPUT);
}

void loop() {
  if (digitalRead(BUTPV) == HIGH && !f_led)
  {
    f_led = 1;

    for ( int counter = 0; counter < 255; counter++)
    {
      analogWrite(pinOUT, counter);
      delay(100);
    }
    digitalWrite(pinOUT, HIGH);
  }

  if (digitalRead(BUTPV == LOW)) {
  f_led = 0;
 for ( int counter = 255; counter >0; counter--)
    {
      analogWrite(pinOUT, counter);
      delay(100);
    }
    digitalWrite(pinOUT, LOW);
  }
}

 

 

Так же - зажигается - тухнет - зажигается и т д.... Видимо потому что в цикле Loop .... А надо зажигается - горит - горит и т д (и наоборот соответственно.) Т.е. запись digitalWrite(pinOUT, HIGH) актуальная в один такт дуины.

Конечно можно дать задежку Millis(), но при выкл кнопки лента будет гореть в течении Millsа

CARLOS
CARLOS аватар
Offline
Зарегистрирован: 09.11.2016

программа работает так (при включении кнопки)

CARLOS
CARLOS аватар
Offline
Зарегистрирован: 09.11.2016

А надо чтобы работала так

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

За что я "люблю" ТС - за внятное "условие" задания. А есть 100% - "говно" в ТЗ => "говну" в коде => "говно" в работе программы. И от опытного программиста нужно уметь отсечь это "говно" на начальной стадии.

CARLOS
CARLOS аватар
Offline
Зарегистрирован: 09.11.2016

qwone пишет:

За что я "люблю" ТС - за внятное "условие" задания. А есть 100% - "говно" в ТЗ => "говну" в коде => "говно" в работе программы. И от опытного программиста нужно уметь отсечь это "говно" на начальной стадии.

Видимо я изначально некорректно сформулировал задачку

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Скорее у вас светильник с кнопкой. Вы хотите регулировать освещение ей. первый раз нажали освещение растет. Понятно до максимума, но можно остановиться и посередине. Второй раз нажали . Освещение падает до выкл. Но можно выбрать тускло . Следущее идет в рост. Почему я строник ООП-(объектно ориентированого проектирования). Потому что реальные проекты похожи на блин морской бой. Мимо, мимо, попал , мимо.  А там где попал надо еще и так, потому что так круще.  Еще вишенка в торте про светильник. Яркость должна идти не линейно, а логарифмически 0-1-3-7-15-31-63-127-255. Тогда глазу кажется что яркость линейно возрастает.

CARLOS
CARLOS аватар
Offline
Зарегистрирован: 09.11.2016

qwone пишет:

Скорее у вас светильник с кнопкой. Вы хотите регулировать освещение ей. первый раз нажали освещение растет. Понятно до максимума, но можно остановиться и посередине. Второй раз нажали . Освещение падает до выкл. Но можно выбрать тускло . Следущее идет в рост. Почему я строник ООП-(объектно ориентированого проектирования). Потому что реальные проекты похожи на блин морской бой. Мимо, мимо, попал , мимо.  А там где попал надо еще и так, потому что так круще.  Еще вишенка в торте про светильник. Яркость должна идти не линейно, а логарифмически 0-1-3-7-15-31-63-127-255. Тогда глазу кажется что яркость линейно возрастает.

Подсветка рабочей зоны. 2 кнопки - 1 принудительно включает ленту сначало шимом потом держит максимум до её выключения - процесс обратный - с максимальной яркости убывает до 0 и держит 0.... Вторая кнопка - работа от датчика освещенности и (если он сработал) датчика движения.... Если бы задача сводилась при принудительном включении просто разом зажечь ленту и при выкл разом потушить - проблем нет...но так как всё это дело происходит в рамках loop, максимальная яркость держиться только единицу времени контроллера, как Вы понимаете далее процесс повторяется... Если применять программные задержки, то, в случае выкл сразу же лента не потушиться ШИМом как планируется, а будет отрабатывать задержку....

Иными словами есть процесс опроса нажатия / отжатия кнопки и два последовательных процесс внутри этого опроса - плавное зажигание и удержание максимума

JasKo
Offline
Зарегистрирован: 21.11.2015

Может надо сделать так?
 

#include "OneButton.h"
//https://github.com/mathertel/OneButton

OneButton button(A0, true);
uint8_t mode, value;

void setup() {
  pinMode(3, OUTPUT);
  mode = 1;
  value = 0;
  button.attachClick(changeMode);
}


void changeMode(){
  mode++;
  mode = mode % 2;
}

byte inc(byte value){
  static unsigned long past = -9999;
  if (millis()-past > 50){
    if (value < 255) {
      value++;}
    past = millis();
  }
  
  return value;
}

byte dec(byte value){
  static unsigned long past = -9999;
  if (millis()-past > 50){
    if (value > 0) {
      value--;}
    past = millis();
  }
  return value;
}


void loop() {
  button.tick();
  switch (mode){
  case 0: value = inc(value);
          break;
  case 1: value = dec(value);
          break;
  }
  analogWrite(3, value);
}

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Поправил- алгоритм следующий - Нажажали кнопку и држите (вк. выключатель) Лента плавно зажглась и горит до отпускания кнопки (вык. выключателя) - плавно потухла и не горит до следующего вк.

#define BUTPV 2
#define pinOUT 5
bool f_led;


void setup() {
  pinMode(BUTPV, INPUT);
  pinMode(pinOUT, OUTPUT);
}

void loop() {
  if (digitalRead(BUTPV) == HIGH && !f_led)
  {
    f_led = 1;

    for ( int counter = 0; counter < 255; counter++)
    {
      analogWrite(pinOUT, counter);
      delay(100);
    }
    digitalWrite(pinOUT, HIGH);
  }

  if (digitalRead(BUTPV) == LOW && f_led) {
    f_led = 0;
    for ( int counter = 255; counter > 0; counter--)
    {
      analogWrite(pinOUT, counter);
      delay(100);
    }
    digitalWrite(pinOUT, LOW);
  }
}

 

JasKo
Offline
Зарегистрирован: 21.11.2015

vosara пишет:

Поправил- алгоритм следующий - Нажажали кнопку и држите (вк. выключатель) Лента плавно зажглась и горит до отпускания кнопки (вык. выключателя) - плавно потухла и не горит до следующего вк.

Простите, может мой вопрос будет неуместным, возможно даже дезким - на хрена в рабочей зоне выключатель который надо держать пальцем, что бы был свет?

Logik
Offline
Зарегистрирован: 05.08.2014

Тож элементарно. Кнопка с пальцем - средство отладки. В рабочем варианте - обічный выключатель, с фиксацией и без пальца.

JasKo
Offline
Зарегистрирован: 21.11.2015

Вот что пишет ТС

CARLOS пишет:

Всем добрый день!

Задача - при нажатии КНОПКИ плавно зажечь ленту и остановить её в максимальной яркости, при выкл соотв. наоборот.

 

Где тут выключатель?

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

 

 CARLOS Счётчик нажатий тут не нужен, 2 состояния кнопки, контролирую digitalRead

CARLOS пишет:

А надо чтобы работала так

JasKo
Offline
Зарегистрирован: 21.11.2015

Ну и к чему это?

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

CARLOS Счётчик нажатий тут не нужен, 2 состояния кнопки, контролирую digitalRead

Вы хотите сказать что потребитель будет держать кнопку чтобы любоваться светом?

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

В конце концов решать CARLOS - если надо (нажал вк., отпустил - нажал вык.) пусть говорит. Добавим переменную и все дела.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Банальный конечный автомат на 4 состояния:

0 - яркость минимальна,

1 - яркость увеличивается,

2 - яркость максимальна,

3 - яркость уменьшается.

Переходы между состояниями строго последовательно: 0-1-2-3-0-1-2-3-0-... 

Сигналом к переходу служит:

0-1 - нажатие (отпускание) кнопки,

1-2 - достижение максиимальной яркости,

2-3 - нажатие (отпускание) кнопки,

3-0 - достижение миниимальной яркости.

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

JasKo
Offline
Зарегистрирован: 21.11.2015

Клиенту не нужно 4 ему нужно 2, на 2 автомат я в #20 посте уже скетч накропал, его легко переделать в 4. Но ни кто в свернутые коды не смотрит, а ТС картошку копает.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Это ВЫ думаете, что ему нужно только на 2. А как только ему предложет на 2, вдруг выяснится, что ему нужны все 4, а то и больше. (да здравствуют хрустальные шары!)

CARLOS
CARLOS аватар
Offline
Зарегистрирован: 09.11.2016

Народ, приношу извинение за "кнопки" - в реалии двойной выключатель

Алгоритм на рисунке....с правым алгоритмом пока всё ясно (есть готовые решения / скетчи), 

а вот с левым никто не заморачивется (все включают сразу, без ШИМА)

 

 

 

CARLOS
CARLOS аватар
Offline
Зарегистрирован: 09.11.2016

vosara пишет:

Поправил- алгоритм следующий - Нажажали кнопку и држите (вк. выключатель) Лента плавно зажглась и горит до отпускания кнопки (вык. выключателя) - плавно потухла и не горит до следующего вк.

#define BUTPV 2
#define pinOUT 5
bool f_led;


void setup() {
  pinMode(BUTPV, INPUT);
  pinMode(pinOUT, OUTPUT);
}

void loop() {
  if (digitalRead(BUTPV) == HIGH && !f_led)
  {
    f_led = 1;

    for ( int counter = 0; counter < 255; counter++)
    {
      analogWrite(pinOUT, counter);
      delay(100);
    }
    digitalWrite(pinOUT, HIGH);
  }

  if (digitalRead(BUTPV) == LOW && f_led) {
    f_led = 0;
    for ( int counter = 255; counter > 0; counter--)
    {
      analogWrite(pinOUT, counter);
      delay(100);
    }
    digitalWrite(pinOUT, LOW);
  }
}

 

Этот код привод к "неверному" графику работы, в силу повторения цикла LOOP...

Вернее в силу того, что команда digitalWrite работает один такт процессорного времени контроллера, потом всё повторяется

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Вот проверил, все как Вы нарисовали

#define BUTPV 2
#define pinOUT 5
bool f_led;


void setup() {
  pinMode(BUTPV, INPUT);
  pinMode(pinOUT, OUTPUT);
Serial.begin(9600);
}

void loop() {
  if (digitalRead(BUTPV) == HIGH && !f_led)
  {
    f_led = 1;
for ( int counter = 0; counter < 255; counter++)
    {
      analogWrite(pinOUT, counter);
      delay(10);
    Serial.println(counter);  
    }
    Serial.println(f_led);
    digitalWrite(pinOUT, HIGH);
  }

  if (digitalRead(BUTPV) == LOW && f_led) {
    f_led = 0;
    for ( int counter = 255; counter > 0; counter--)
    {
      analogWrite(pinOUT, counter);
      delay(10);
      Serial.println(counter);
    }
      Serial.println(f_led);
     digitalWrite(pinOUT, LOW);
  }
}

CARLOS
CARLOS аватар
Offline
Зарегистрирован: 09.11.2016

vosara пишет:

Поправил- алгоритм следующий - Нажажали кнопку и држите (вк. выключатель) Лента плавно зажглась и горит до отпускания кнопки (вык. выключателя) - плавно потухла и не горит до следующего вк.

#define BUTPV 2
#define pinOUT 5
bool f_led;


void setup() {
  pinMode(BUTPV, INPUT);
  pinMode(pinOUT, OUTPUT);
}

void loop() {
  if (digitalRead(BUTPV) == HIGH && !f_led)
  {
    f_led = 1;

    for ( int counter = 0; counter < 255; counter++)
    {
      analogWrite(pinOUT, counter);
      delay(100);
    }
    digitalWrite(pinOUT, HIGH);
  }

  if (digitalRead(BUTPV) == LOW && f_led) {
    f_led = 0;
    for ( int counter = 255; counter > 0; counter--)
    {
      analogWrite(pinOUT, counter);
      delay(100);
    }
    digitalWrite(pinOUT, LOW);
  }
}

 

скетч работает!

При модернизации программы (условия опроса второй кнопки и, если она нажата, опрос входа от датчика) столкунся с проблемой неверной работы. А именно - (case 2, case 3) при включении второй кнопки BUTDD и появления сигнала от датчика pinDD программа постоянно проводит цикл ШИМа, при отсутствии сигнала от датчика ШИМ в максимуме, хотя должен плавно тухнуть.

Как я понимаю, необходимо проверять состояния кнопок до и после нажатия.
Буду рад помощи!
#define BUTPV 2             // вход от кнопки принудительного включения
#define pinOUT 10           // выход на ленту
#define BUTDD 7             // вход от кнопки включения по датчику движения
#define pinDD 11            // вход с датчика

int sit;
bool f_led;                 // переменная удержания постояного уровня
bool z_led;   


#define Maxbright 255                  // Максимальная яркость 
#define smoothSwitchDelayStep 30       // Скорость нарастания яркости
#define Sleepbright 90                 // Яркость дежурной подсветки ночью 
#define pause 30                       // Скорость в принудительном режиме - чем больше тем быстрее

void setup() 
{
  pinMode(pinDD, INPUT);
  pinMode(BUTPV, INPUT);
  pinMode(BUTDD, INPUT);
  pinMode(pinOUT, OUTPUT);
}

void loop() {
//******************************************************************
    if (digitalRead(BUTPV) == HIGH && digitalRead(BUTDD) == HIGH)  {sit = 0;}
    if (digitalRead(BUTPV) == HIGH && digitalRead(BUTDD) == LOW)   {sit = 1;}
    if (digitalRead(BUTPV) == LOW && digitalRead(BUTDD) == HIGH)   {sit = 2;}
    if (digitalRead(BUTPV) == LOW && digitalRead(BUTDD) == LOW)    {sit = 3;}
 
 switch (sit)  
  {
    case 0:
            m:     if (digitalRead(BUTPV) == HIGH && !f_led)
                        {
                          f_led = 1;
                              for ( int counter = 0; counter < Maxbright; counter++)
                             {
                                analogWrite(pinOUT, counter);
                                delay(smoothSwitchDelayStep);
                             }
                                    digitalWrite(pinOUT, HIGH);
                         }
  
                  if (digitalRead(BUTPV) == LOW && f_led)
                         {
                           f_led = 0;
                              for ( int counter = Maxbright; counter > 0; counter--)
                               {
                                    analogWrite(pinOUT, counter);
                                    delay(smoothSwitchDelayStep); 
                               }
                                    digitalWrite(pinOUT, LOW);
    }    
    break;
//********************************************************************
  case 1:
  goto m; 
  break;
//********************************************************************
case 2:
                if (digitalRead(pinDD) == HIGH && !f_led)
                   {
                        f_led = 1;
                        for ( int counter = 0; counter < Maxbright; counter++)
                           {
                              analogWrite(pinOUT, counter);
                              delay(smoothSwitchDelayStep);
                           }
                        digitalWrite(pinOUT, HIGH);
                   }
                   
                         if (digitalRead(pinDD) == LOW && f_led)
                         {
                           f_led = 0;
                              for ( int counter = Maxbright; counter > 0; counter--)
                               {
                                    analogWrite(pinOUT, counter);
                                    delay(smoothSwitchDelayStep); 
                               }
                                    digitalWrite(pinOUT, LOW);
                         }
                   
   break;     
//*****************************************************************  
case 3:
digitalWrite(pinOUT, LOW);
break;

}
}
    
CARLOS
CARLOS аватар
Offline
Зарегистрирован: 09.11.2016
#define BUTPV 2             // вход от кнопки принудительного включения
#define pinOUT 10           // выход на ленту
#define BUTDD 7             // вход от кнопки включения по датчику движения
#define pinDD 11            // вход с датчика

int sit;
bool f_led;                 // переменная удержания постояного уровня
bool ff_led;  
bool fff_led; 


#define Maxbright 255                  // Максимальная яркость 
#define smoothSwitchDelayStep 30       // Скорость нарастания яркости
#define Sleepbright 90                 // Яркость дежурной подсветки ночью 
#define pause 20                       // Скорость в принудительном режиме - чем больше тем быстрее

void setup() 
{
  pinMode(pinDD, INPUT);
  pinMode(BUTPV, INPUT);
  pinMode(BUTDD, INPUT);
  pinMode(pinOUT, OUTPUT);
}

void loop() {
//************************************************************************************************************  
 if (digitalRead(BUTDD) == HIGH && !fff_led)
  {    
                    fff_led = 1;
                    if (digitalRead(pinDD) == HIGH && !f_led) 
                          {
                             f_led = 1;  
                                  for ( int counter = 0; counter < 255; counter++)
                                        {
                                         analogWrite(pinOUT, counter);
                                         delay(30);
                                        }
                                    digitalWrite(pinOUT, HIGH);
                           }
                           
                  if (digitalRead(pinDD) == LOW && f_led) 
                      { 
                        f_led = 0;
                          for ( int counter = 255; counter > 0; counter--)
                                         {
                                           analogWrite(pinOUT, counter);
                                           delay(30);
                                         }
                                   digitalWrite(pinOUT, LOW);
                    }
                    
                    if (digitalRead(pinDD) == LOW && !f_led) 
                      {  
                      digitalWrite(pinOUT, LOW);
                      }
  }
  
    
  if (digitalRead(BUTDD) == LOW && fff_led )
      {    
        fff_led = 0;
                for ( int counter = 255; counter > 0; counter--)
                              {
                                analogWrite(pinOUT, counter);
                                delay(30);
                              }
                        digitalWrite(pinOUT, LOW);
        }
  

//******************************************************************************
 
   if (digitalRead(BUTPV) == HIGH && !ff_led)
        {
            ff_led = 1;
             for ( int counter = 0; counter < 255; counter++)
                  {
                      analogWrite(pinOUT, counter);
                      delay(30);
                  }
          digitalWrite(pinOUT, HIGH);
        }
        
  if (digitalRead(BUTPV) == LOW && ff_led)
  {
    ff_led = 0;
    for ( int counter = 255; counter > 0; counter--)
        {
            analogWrite(pinOUT, counter);
            delay(30);

        }
      digitalWrite(pinOUT, LOW);
  }
}

Подскажите, почему не выполняется проверка условия  (52 строка)...при нажатии на кнопку BUTDD лента включается на максимуме и тушится до 0 и так останавливается...на пояление 1 на pindd в этом режиме реакции нет

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
#define BUTPV 2             // вход от кнопки принудительного включения
#define pinOUT 10           // выход на ленту
#define BUTDD 7             // вход от кнопки включения по датчику движения
#define pinDD 11            // вход с датчика

int counter;
int sit;
bool f_led;                 // переменная удержания постояного уровня
bool ff_led;
bool fff_led;


#define Maxbright 255                  // Максимальная яркость 
#define smoothSwitchDelayStep 30       // Скорость нарастания яркости
#define Sleepbright 90                 // Яркость дежурной подсветки ночью 
#define pause 20                       // Скорость в принудительном режиме - чем больше тем быстрее

void setup()
{
  pinMode(pinDD, INPUT);
  pinMode(BUTPV, INPUT);
  pinMode(BUTDD, INPUT);
  pinMode(pinOUT, OUTPUT);
  Serial.begin(9600);
}

void led() {
  if (counter <= 0) {
    for ( ; counter < 255; counter++)
    {
      analogWrite(pinOUT, counter);
      delay(30);
      Serial.println(counter);
    }
    digitalWrite(pinOUT, HIGH);
  }
  else {
    for (; counter > 0; counter--)
    {
      analogWrite(pinOUT, counter);
      delay(30);
      Serial.println(counter);
    }
    digitalWrite(pinOUT, LOW);
  }
}

void loop() {
  //************************************************************************************************************
  if (digitalRead(BUTDD) == HIGH)
  {
    if (digitalRead(pinDD) == HIGH && !f_led)
    {
      f_led = 1;
      if (!counter)led();
    }

    if (digitalRead(pinDD) == LOW && f_led)
    {
      f_led = 0;
      if (counter)led();
    }

    if (digitalRead(pinDD) == LOW && !f_led)
    {
      digitalWrite(pinOUT, LOW);
    }
  }

  if (digitalRead(BUTDD) == LOW )
  {
    digitalWrite(pinOUT, LOW);
  }


  //******************************************************************************

  if (digitalRead(BUTPV) == HIGH && !ff_led)
  {
    ff_led = 1;
    if (!counter)led();
  }

  if (digitalRead(BUTPV) == LOW && ff_led)
  {
    ff_led = 0;
    if (counter) led();
  }
}

 

CARLOS
CARLOS аватар
Offline
Зарегистрирован: 09.11.2016

vosara пишет:

#define BUTPV 2             // вход от кнопки принудительного включения
#define pinOUT 10           // выход на ленту
#define BUTDD 7             // вход от кнопки включения по датчику движения
#define pinDD 11            // вход с датчика

int counter;
int sit;
bool f_led;                 // переменная удержания постояного уровня
bool ff_led;
bool fff_led;


#define Maxbright 255                  // Максимальная яркость 
#define smoothSwitchDelayStep 30       // Скорость нарастания яркости
#define Sleepbright 90                 // Яркость дежурной подсветки ночью 
#define pause 20                       // Скорость в принудительном режиме - чем больше тем быстрее

void setup()
{
  pinMode(pinDD, INPUT);
  pinMode(BUTPV, INPUT);
  pinMode(BUTDD, INPUT);
  pinMode(pinOUT, OUTPUT);
  Serial.begin(9600);
}

void led() {
  if (counter <= 0) {
    for ( ; counter < 255; counter++)
    {
      analogWrite(pinOUT, counter);
      delay(30);
      Serial.println(counter);
    }
    digitalWrite(pinOUT, HIGH);
  }
  else {
    for (; counter > 0; counter--)
    {
      analogWrite(pinOUT, counter);
      delay(30);
      Serial.println(counter);
    }
    digitalWrite(pinOUT, LOW);
  }
}

void loop() {
  //************************************************************************************************************
  if (digitalRead(BUTDD) == HIGH)
  {
    if (digitalRead(pinDD) == HIGH && !f_led)
    {
      f_led = 1;
      if (!counter)led();
    }

    if (digitalRead(pinDD) == LOW && f_led)
    {
      f_led = 0;
      if (counter)led();
    }

    if (digitalRead(pinDD) == LOW && !f_led)
    {
      digitalWrite(pinOUT, LOW);
    }
  }

  if (digitalRead(BUTDD) == LOW )
  {
    digitalWrite(pinOUT, LOW);
  }


  //******************************************************************************

  if (digitalRead(BUTPV) == HIGH && !ff_led)
  {
    ff_led = 1;
    if (!counter)led();
  }

  if (digitalRead(BUTPV) == LOW && ff_led)
  {
    ff_led = 0;
    if (counter) led();
  }
}

 

При включении кнопки BUTPV лента зажигается, доходит до максимума и разом тухнет.....при выкл этой кнопки лента разом включается и плавно тухнет до 0 и держит 0....если при наличии 1 на pinDD выкл кнопку ButDD лента разом погаснет, что правильно, но если вкл эту кнопку снова лента не загорится (при наличии 1 на pinDD), а вкл ленты принудительно с BUTPV зажжёт ленту разом, плавно потушит, еще раз проведется цикл плавно зажечь, потушить....и 0......

Видимо для решения данной задачи нужно как-то запоминать предшествующую ситуацию с кнопками и с яркостью ленты.....

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Пробуйте - проверил вроде нормально

#define BUTPV 2             // вход от кнопки принудительного включения
#define pinOUT 10           // выход на ленту
#define BUTDD 7             // вход от кнопки включения по датчику движения
#define pinDD 11            // вход с датчика

int counter;
int sit;
bool f_led;                 // переменная удержания постояного уровня
bool ff_led;
bool fff_led;


#define Maxbright 255                  // Максимальная яркость 
#define smoothSwitchDelayStep 30       // Скорость нарастания яркости
#define Sleepbright 90                 // Яркость дежурной подсветки ночью 
#define pause 20                       // Скорость в принудительном режиме - чем больше тем быстрее

void setup()
{
  pinMode(pinDD, INPUT);
  pinMode(BUTPV, INPUT);
  pinMode(BUTDD, INPUT);
  pinMode(pinOUT, OUTPUT);
  Serial.begin(9600);
}

void led() {
  if (counter <= 0) {
    for ( ; counter < 255; counter++)
    {
      analogWrite(pinOUT, counter);
      delay(10);
      Serial.println(counter);
    }
    digitalWrite(pinOUT, HIGH);
  }
  else {
    for (; counter > 0; counter--)
    {
      analogWrite(pinOUT, counter);
      delay(10);
      Serial.println(counter);
    }
    digitalWrite(pinOUT, LOW);
  }
}

void loop() {
  //************************************************************************************************************
  if (digitalRead(BUTDD) == HIGH)
  {
    if (digitalRead(pinDD) == HIGH && !f_led)
    {
      f_led = 1;
      if (!counter)led();
    }

    if (digitalRead(pinDD) == LOW && f_led)
    {
      f_led = 0;
      if (counter)led();
    }
  }

  //******************************************************************************

  if (digitalRead(BUTPV) == HIGH && !ff_led)
  {
    ff_led = 1;
    if (!counter)led();
  }

  if (digitalRead(BUTPV) == LOW && ff_led)
  {
    ff_led = 0;
    if (counter) led();
  }
}

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

А может так даже правельней - Если кнопка #define BUTDD 7 Вык то работает только ручное Вк/Вык И НЕ РЕАГИРУЕТ НА ДАТЧИК - а если ВКЛЮЧЕНА то работает только датчик движения!!! и не реагирует на ручное включение. Выбирать Вам. Может надо чтобы в приоритете было ручное Вк/Вык.


#define BUTPV 2             // вход от кнопки принудительного включения
#define pinOUT 10           // выход на ленту
#define BUTDD 7             // вход от кнопки включения по датчику движения
#define pinDD 11            // вход с датчика

int counter;

#define Maxbright 255                  // Максимальная яркость 
#define smoothSwitchDelayStep 30       // Скорость нарастания яркости
#define Sleepbright 90                 // Яркость дежурной подсветки ночью 
#define pause 20                       // Скорость в принудительном режиме - чем больше тем быстрее

void setup()
{
  pinMode(pinDD, INPUT);
  pinMode(BUTPV, INPUT);
  pinMode(BUTDD, INPUT);
  pinMode(pinOUT, OUTPUT);
  //Serial.begin(9600);
}

void led() {
  if (counter <= 0) {
    for ( ; counter < 255; counter++)
    {
      analogWrite(pinOUT, counter);
      delay(30);
      //Serial.println(counter);
    }
    digitalWrite(pinOUT, HIGH);
  }
  else {
    for (; counter > 0; counter--)
    {
      analogWrite(pinOUT, counter);
      delay(30);
      //Serial.println(counter);
    }
    digitalWrite(pinOUT, LOW);
  }
}

void loop() {
  //************************************************************************************************************
  if (digitalRead(BUTDD) == HIGH)
  {
    if (digitalRead(pinDD) == HIGH)
    {
      if (!counter)led();
    }

    if (digitalRead(pinDD) == LOW)
    {
      if (counter)led();
    }
  }
  //******************************************************************************
  if (digitalRead(BUTDD) == LOW) {
    if (digitalRead(BUTPV) == HIGH)
    {
      if (!counter)led();
    }

    if (digitalRead(BUTPV) == LOW)
    {
      if (counter) led();
    }
  }
}

 

JasKo
Offline
Зарегистрирован: 21.11.2015

отписался...

CARLOS
CARLOS аватар
Offline
Зарегистрирован: 09.11.2016

vosara пишет:

А может так даже правельней - Если кнопка #define BUTDD 7 Вык то работает только ручное Вк/Вык И НЕ РЕАГИРУЕТ НА ДАТЧИК - а если ВКЛЮЧЕНА то работает только датчик движения!!! и не реагирует на ручное включение. Выбирать Вам. Может надо чтобы в приоритете было ручное Вк/Вык.


#define BUTPV 2             // вход от кнопки принудительного включения
#define pinOUT 10           // выход на ленту
#define BUTDD 7             // вход от кнопки включения по датчику движения
#define pinDD 11            // вход с датчика

int counter;

#define Maxbright 255                  // Максимальная яркость 
#define smoothSwitchDelayStep 30       // Скорость нарастания яркости
#define Sleepbright 90                 // Яркость дежурной подсветки ночью 
#define pause 20                       // Скорость в принудительном режиме - чем больше тем быстрее

void setup()
{
  pinMode(pinDD, INPUT);
  pinMode(BUTPV, INPUT);
  pinMode(BUTDD, INPUT);
  pinMode(pinOUT, OUTPUT);
  //Serial.begin(9600);
}

void led() {
  if (counter <= 0) {
    for ( ; counter < 255; counter++)
    {
      analogWrite(pinOUT, counter);
      delay(30);
      //Serial.println(counter);
    }
    digitalWrite(pinOUT, HIGH);
  }
  else {
    for (; counter > 0; counter--)
    {
      analogWrite(pinOUT, counter);
      delay(30);
      //Serial.println(counter);
    }
    digitalWrite(pinOUT, LOW);
  }
}

void loop() {
  //************************************************************************************************************
  if (digitalRead(BUTDD) == HIGH)
  {
    if (digitalRead(pinDD) == HIGH)
    {
      if (!counter)led();
    }

    if (digitalRead(pinDD) == LOW)
    {
      if (counter)led();
    }
  }
  //******************************************************************************
  if (digitalRead(BUTDD) == LOW) {
    if (digitalRead(BUTPV) == HIGH)
    {
      if (!counter)led();
    }

    if (digitalRead(BUTPV) == LOW)
    {
      if (counter) led();
    }
  }
}

 

Благодарю за Вашу помощь.

Программа работает и всё ок, но нет учёта нажатий (по случайности) двух кнопок сразу, (т е принцип приоритета принудительного включения)....при это происходит цикл тушения, загорания, горения... ввел goto, но без результата...

Так же в планах установить экранчик с возможностью выбирать параметров максимальной яркости и скорости наращения... или же просто двух энкодеров и т п

#define BUTPV 2             // вход от кнопки принудительного включения
#define pinOUT 10           // выход на ленту
#define BUTDD 7             // вход от кнопки включения по датчику движения
#define pinDD 11            // вход с датчика
 
int counter;
 
#define Maxbright 255                  // Максимальная яркость
#define smoothSwitchDelayStep 10       // Скорость нарастания яркости
//#define Sleepbright 90                 // Яркость дежурной подсветки ночью
//#define pause 20                       // Скорость в принудительном режиме - чем больше тем быстрее
 
void setup()
{
  pinMode(pinDD, INPUT);
  pinMode(BUTPV, INPUT);
  pinMode(BUTDD, INPUT);
  pinMode(pinOUT, OUTPUT);
  //Serial.begin(9600);
}
 
void led() {
  if (counter <= 0) {
    for ( ; counter < Maxbright; counter++)
    {
      analogWrite(pinOUT, counter);
      delay(smoothSwitchDelayStep);
     //Serial.println(counter);
    }
    digitalWrite(pinOUT, HIGH);
  }
  else {
    for (; counter > 0; counter--)
    {
      analogWrite(pinOUT, counter);
      delay(smoothSwitchDelayStep);
      //Serial.println(counter);
    }
    digitalWrite(pinOUT, LOW);
  }
}
 
void loop() {
  //************************************************************************************************************
 if (digitalRead(BUTDD) == HIGH)

  {

    if (digitalRead(pinDD) == HIGH)
    {
      if (!counter)led();
    }
 
    if (digitalRead(pinDD) == LOW)
    {
      if (counter)led();
    }
  }
  //******************************************************************************
  if (digitalRead(BUTDD) == LOW) {
    if (digitalRead(BUTPV) == HIGH)
    {m:
      if (!counter)led();
    }
 
    if (digitalRead(BUTPV) == LOW)
    {
      if (counter) led();
    }
  }
//--------------
if (digitalRead(BUTPV) == HIGH && digitalRead(BUTDD) == HIGH)
   {
     goto m;
   }
}

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
#define BUTPV 2             // вход от кнопки принудительного включения
#define pinOUT 10           // выход на ленту
#define BUTDD 7             // вход от кнопки включения по датчику движения
#define pinDD 11            // вход с датчика

int counter;
bool prioritet;

#define Maxbright 255                  // Максимальная яркость
#define smoothSwitchDelayStep 10       // Скорость нарастания яркости
//#define Sleepbright 90                 // Яркость дежурной подсветки ночью
//#define pause 20                       // Скорость в принудительном режиме - чем больше тем быстрее

void setup()
{
  pinMode(pinDD, INPUT);
  pinMode(BUTPV, INPUT);
  pinMode(BUTDD, INPUT);
  pinMode(pinOUT, OUTPUT);
  //Serial.begin(9600);
}

void led() {
  if (counter <= 0) {
    for ( ; counter < Maxbright; counter++)
    {
      analogWrite(pinOUT, counter);
      delay(smoothSwitchDelayStep);
      //Serial.println(counter);
    }
    digitalWrite(pinOUT, HIGH);
  }
  else {
    for (; counter > 0; counter--)
    {
      analogWrite(pinOUT, counter);
      delay(smoothSwitchDelayStep);
      //Serial.println(counter);
    }
    digitalWrite(pinOUT, LOW);
  }
}

void loop() {
  //************************************************************************************************************
  if (digitalRead(BUTDD) == HIGH && !prioritet)

  {

    if (digitalRead(pinDD) == HIGH)
    {
      if (!counter)led();
    }

    if (digitalRead(pinDD) == LOW)
    {
      if (counter)led();
    }
  }
  //******************************************************************************
  if (digitalRead(BUTDD) == LOW) {
    if (digitalRead(BUTPV) == HIGH)
    {
      if (!counter)led();
    }

    if (digitalRead(BUTPV) == LOW)
    {
      if (counter) led();
    }
  }
  //--------------
  if (digitalRead(BUTPV) == HIGH && digitalRead(BUTDD) == HIGH)
  {
    prioritet = 1;
    if (!counter)led();
  }
  else prioritet = 0;
}