Не гаснут полностью светодиоды

Alex_
Offline
Зарегистрирован: 02.11.2015

Вопрос такой:
в бегущих огнях на светодиодах, плата Arduino Nono, по команде аналогичной этой   

   digitalWrite(ledPin_2, LOW);

светодиоды полностью не гаснут, наблюдается очень слабое свечение.

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

vk007
Offline
Зарегистрирован: 16.06.2015

Схема включения и скетч - всё стандартное, да?

Alex_
Offline
Зарегистрирован: 02.11.2015

Да, все стандартно
Просто игрушка для изучения , кучка светодиодов где каждый последовательно с резистором на 470ом, но почему так происходит?

 unsigned long time;

 const int ledPin_2 =  2;
  const int ledPin_3 =  3;
   const int ledPin_4 =  4;
    const int ledPin_5 =  5;
     const int ledPin_6 =  6;
      const int ledPin_7 =  7;
       const int ledPin_8 =  8;
        const int ledPin_9 =  9;
         const int ledPin_10 =  10;
          const int ledPin_11 =  11;
// Variables will change:
int ledState_2 = LOW;             // этой переменной устанавливаем состояние светодиода
int ledState_3 = LOW;             // этой переменной устанавливаем состояние светодиода
int ledState_4 = LOW;             // этой переменной устанавливаем состояние светодиода
int ledState_5 = LOW;             // этой переменной устанавливаем состояние светодиода
int ledState_6 = LOW;             // этой переменной устанавливаем состояние светодиода
int ledState_7 = LOW;             // этой переменной устанавливаем состояние светодиода
int ledState_8 = LOW;             // этой переменной устанавливаем состояние светодиода
int ledState_9 = LOW;             // этой переменной устанавливаем состояние светодиода
int ledState_10 = LOW;             // этой переменной устанавливаем состояние светодиода
int ledState_11 = LOW;             // этой переменной устанавливаем состояние светодиода
long previousMillis_2 = 0;        // храним время последнего переключения светодиода
long previousMillis_3 = 0;        // храним время последнего переключения светодиода
long previousMillis_4 = 0;        // храним время последнего переключения светодиода
long previousMillis_5 = 0;        // храним время последнего переключения светодиода
long previousMillis_6 = 0;        // храним время последнего переключения светодиода
long previousMillis_7 = 0;        // храним время последнего переключения светодиода
long previousMillis_8 = 0;        // храним время последнего переключения светодиода
long previousMillis_9 = 0;        // храним время последнего переключения светодиода
long previousMillis_10 = 0;        // храним время последнего переключения светодиода
long previousMillis_11 = 0;        // храним время последнего переключения светодиода
long interval = 950;           // интервал между включение/выключением светодиода (1 секунда)
 
// the setup function runs once when you press reset or power the board
void setup()   
{
           for (int p=2; p <= 11; p++)
           {
               pinMode(p, OUTPUT); // задаем режим выхода для порта, подключенного к светодиоду
           } 
           
Serial.begin(9600);

}

void loop() {

  // здесь будет код, который будет работать постоянно
  // и который не должен останавливаться на время между переключениями свето
  unsigned long currentMillis = millis();
/*  
  //проверяем не прошел ли нужный интервал, если прошел то
  if(currentMillis - previousMillis_2 > interval) 
    {
    digitalWrite(ledPin_2, HIGH);
    }
  
   if(currentMillis - previousMillis_2 > interval*2) 
    {
    // сохраняем время последнего переключения
    previousMillis_3 = currentMillis; 
    digitalWrite(ledPin_3, HIGH);
    }
  if(currentMillis - previousMillis_2 > interval*3) 
    {
     digitalWrite(ledPin_4, HIGH);
    }
  */
  if(currentMillis - previousMillis_2 > interval*1) 
    {
     digitalWrite(ledPin_2, LOW);  
     digitalWrite(ledPin_5, HIGH);
    }

  if(currentMillis - previousMillis_2 > interval*2) 
    {
     digitalWrite(ledPin_2, LOW);     
     digitalWrite(ledPin_6, HIGH);
    }
  if(currentMillis - previousMillis_2 > interval*3) 
    {
     digitalWrite(ledPin_3, LOW);     
     digitalWrite(ledPin_7, HIGH);
    }
  if(currentMillis - previousMillis_2 > interval*4) 
    {
     digitalWrite(ledPin_4, LOW);     
     digitalWrite(ledPin_8, HIGH);
    }
  if(currentMillis - previousMillis_2 > interval*5) 
    {
     digitalWrite(ledPin_5, LOW);     
     digitalWrite(ledPin_9, HIGH);
    } 
 if(currentMillis - previousMillis_2 > interval*6) 
    {
     digitalWrite(ledPin_6, LOW);     
     digitalWrite(ledPin_10, HIGH);
    }  
if(currentMillis - previousMillis_2 > interval*7) 
    {
     digitalWrite(ledPin_7, LOW);     
     digitalWrite(ledPin_11, HIGH);
    }
if(currentMillis - previousMillis_2 > interval*8) 
    {
     digitalWrite(ledPin_8, LOW);
          digitalWrite(ledPin_2, HIGH);     
    }
if(currentMillis - previousMillis_2 > interval*9) 
    {
     digitalWrite(ledPin_9, LOW);
               digitalWrite(ledPin_3, HIGH);         
    }
if(currentMillis - previousMillis_2 > interval*10) 
    {
     digitalWrite(ledPin_10, LOW);
          digitalWrite(ledPin_4, HIGH);     
    }
if(currentMillis - previousMillis_2 > interval*11) 
    {
     digitalWrite(ledPin_11, LOW);
          digitalWrite(ledPin_5, HIGH);
         previousMillis_2 = currentMillis;       
    }
   Serial.println(millis());
}

 

vk007
Offline
Зарегистрирован: 16.06.2015

И все-таки, хотелось бы увидеть эту "стандартную" схему.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Проблема в программе, схема вряд ли.

Начиная с начала светик 2 гаснет, начиная с 8 секунды он начинает метаться, например в строках 73 и 79 он гасится, а в 102 включается. Получается, что примерно с 8 по 11 секунду это светодиод гасят и практически сразу включают. Потому, естественно, он якобы не выключается. Еще раз, к 11-ой секунде буду последовательно срабатывать ВСЕ условия. Т.е. через секунду сработает условие 1, еще через секунду сработают условия 1 и 2, еще через секунду сработают условия 1, 2 и 3 и т.п.

Это ни разу не бегущие огни, это просто быстрое включение/выключение одних и тех же светодиодов. Насколько я знаю, бегущие огни, в простейщем варианте, это когда в начале включают один светодиод, через определенный интервал его выключают и включают другой и так далее по цепочке, а здесь совершенно другой алгоритм.

Бедные светодиодики.

 

Гриша
Offline
Зарегистрирован: 27.04.2014

Alex_ пишет:

Вопрос такой:
в бегущих огнях на светодиодах, плата Arduino Nono, по команде аналогичной этой   

   digitalWrite(ledPin_2, LOW);

светодиоды полностью не гаснут, наблюдается очень слабое свечение.

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

ошибка в троке 126, т.к. событие произойдет после выполнения условия   122    if(currentMillis - previousMillis_2 > interval*11)    т.е. все условия будут выполняться и делать они будут это очень быстро , что и наблюдается. цикл примерно 10 сек. некое подобие ШИМ получилось (пример стр 80 и 99)

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

Интересно, сэр слышал про такую вещь, как циклы?

#define interval 950

void setup() {
  for(byte i = 2; i < 12; i++)
    pinMode(i, OUTPUT);
}

void loop() {
  int state = (millis() / interval) % 10;
  for(byte i = 2; i < 12; i++)
    digitalWrite(i, (i-2) == state);
}

 

Гриша
Offline
Зарегистрирован: 27.04.2014

andriano пишет:

Интересно, сэр слышал про такую вещь, как циклы? 

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

Alex_
Offline
Зарегистрирован: 02.11.2015

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

Вообщем я код на форум не правильный выставил

В нём не возможно было этого увидеть,

но проблема есть реальная

код был нгаписан через delay

и можно было видеть как светодиоды слегка светятся до новой итеракции

Alex_
Offline
Зарегистрирован: 02.11.2015

вот этот код



// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin 13 as an output.
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {


   for (int k=12; k > 0; k=k-2){
           for (int i=1; i <= 15; i++){
            digitalWrite(2, HIGH);   // turn the LED on (HIGH is the voltage level)
            delay(2);
              digitalWrite(2, LOW);
              delay(k); 
           } 
   }
  
  digitalWrite(2, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(200);              // wait for a second

   for (int k=12; k > 0; k=k-2){
           for (int i=1; i <= 15; i++){
            digitalWrite(3, HIGH);   // turn the LED on (HIGH is the voltage level)
            delay(2);
              digitalWrite(3, LOW);
              delay(k); 
           } 
   }

      
  digitalWrite(3, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(200);              // wait for a second

  digitalWrite(4, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(200);              // wait for a second

  digitalWrite(5, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(200);              // wait for a second

  digitalWrite(6, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(200);              // wait for a second

  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1);              // wait for a second
  digitalWrite(5, LOW);  
  digitalWrite(6, LOW);  
  digitalWrite(7, LOW); 
  digitalWrite(5, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(100);              // wait for a second
  digitalWrite(6, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(100);              // wait for a second
  digitalWrite(7, HIGH);   
 delay(100); 

   
  digitalWrite(8, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(200);              // wait for a second

  digitalWrite(9, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(200);              // wait for a second

  digitalWrite(10, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(200);              // wait for a second

  digitalWrite(11, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(500);   
  
  digitalWrite(2, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(3, LOW);  
  digitalWrite(4, LOW);  
  digitalWrite(5, LOW);  
  digitalWrite(6, LOW);  
  digitalWrite(7, LOW);  
  digitalWrite(8, LOW);  
  digitalWrite(9, LOW);  
  digitalWrite(10, LOW);  
  digitalWrite(11, LOW);  
  delay(1000);              // wait for a second

}

 

Alex_
Offline
Зарегистрирован: 02.11.2015

дело не в коде, их было много подобных бегущем огням и до новой итеракции диоды всё равно немного светились

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Ну тогда к телепатам, без схемы, да еще сегодня один скетч завтра другой.

Гриша
Offline
Зарегистрирован: 27.04.2014

Alex_ пишет:

дело не в коде, их было много подобных бегущем огням и до новой итеракции диоды всё равно немного светились

проверяем схему :) надеюсь ноги сами подставите?

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */
 
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}

 

Alex_
Offline
Зарегистрирован: 02.11.2015

всем привет! и спасибо за участие

Проблема действительно была

Её наблюдали несколько человек, пришлось взять и померить тестером

Сведодиоды плоские примерно 1 см один от другого в ряд

Даже Один светящийся подсвечивал по сторонам и создавал эффект не полного выключения

Еще раз всем спасибо и тему можно закрывать