ir датчик и режимы мигания светодиодами (гирлянда)

rus2014
Offline
Зарегистрирован: 11.09.2014

Доброго времени суток!

Просьба сильно не пинать, новичок мигаю светодиодами.

Есть скеч из интернета

/*     ---------------------------------------------------------
 *     |  Arduino Experimentation Kit Example Code             |
 *     |  CIRC-02 .: 8 LED Fun :. (Multiple LEDs)   |
 *     ---------------------------------------------------------
 *  
 *  A few Simple LED animations
 *
 * For more information on this circuit http://tinyurl.com/d2hrud
 *
 */
 
//LED Pin Variables
int ledPins[] = {2,3,4,5,6,7,8,9}; //An array to hold the pin each LED is connected to
                                   //i.e. LED #0 is connected to pin 2, LED #1, 3 and so on
                                   //to address an array use ledPins[0] this would equal 2
                                   //and ledPins[7] would equal 9
 
/*
 * setup() - this function runs once when you turn your Arduino on
 * We the three control pins to outputs
 */
void setup()
{
  
  //Set each pin connected to an LED to output mode (pulling high (on) or low (off)
  for(int i = 0; i < 8; i++){         //this is a loop and will repeat eight times
      pinMode(ledPins[i],OUTPUT); //we use this to set each LED pin to output
  }                                   //the code this replaces is below
 
  /* (commented code will not run)
   * these are the lines replaced by the for loop above they do exactly the
   * same thing the one above just uses less typing
  pinMode(ledPins[0],OUTPUT);
  pinMode(ledPins[1],OUTPUT);
  pinMode(ledPins[2],OUTPUT);
  pinMode(ledPins[3],OUTPUT);
  pinMode(ledPins[4],OUTPUT);
  pinMode(ledPins[5],OUTPUT);
  pinMode(ledPins[6],OUTPUT);
  pinMode(ledPins[7],OUTPUT);
  (end of commented code)*/
}
 
 
/*
 * loop() - this function will start after setup finishes and then repeat
 * we call a function called oneAfterAnother(). if you would like a different behaviour
 * uncomment (delete the two slashes) one of the other lines
 */
void loop()                     // run over and over again
{
oneAfterAnotherNoLoop();   //this will turn on each LED one by one then turn each off
  
//oneAfterAnotherLoop();   //does the same as oneAfterAnotherNoLoop but with 
                             //much less typing
inAndOut();              //lights the two middle LEDs then moves them out then back 
                             //in again
oneOnAtATime();          //this will turn one LED on then turn the next one
                             //on turning the 
                             //former off (one LED will look like it is scrolling 
                             //along the line
}
 
/*
 * oneAfterAnotherNoLoop() - Will light one LED then delay for delayTime then light
 * the next LED until all LEDs are on it will then turn them off one after another
 *
 * this does it without using a loop which makes for a lot of typing. 
 * oneOnAtATimeLoop() does exactly the same thing with less typing
 */
void oneAfterAnotherNoLoop(){
  int delayTime = 100; //the time (in milliseconds) to pause between LEDs
                       //make smaller for quicker switching and larger for slower
  digitalWrite(ledPins[0], HIGH);  //Turns on LED #0 (connected to pin 2 )
  delay(delayTime);                //waits delayTime milliseconds
  digitalWrite(ledPins[1], HIGH);  //Turns on LED #1 (connected to pin 3 )
  delay(delayTime);                //waits delayTime milliseconds
  digitalWrite(ledPins[2], HIGH);  //Turns on LED #2 (connected to pin 4 )
  delay(delayTime);                //waits delayTime milliseconds
  digitalWrite(ledPins[3], HIGH);  //Turns on LED #3 (connected to pin 5 )
  delay(delayTime);                //waits delayTime milliseconds
  digitalWrite(ledPins[4], HIGH);  //Turns on LED #4 (connected to pin 6 )
  delay(delayTime);                //waits delayTime milliseconds
  digitalWrite(ledPins[5], HIGH);  //Turns on LED #5 (connected to pin 7 )
  delay(delayTime);                //waits delayTime milliseconds
  digitalWrite(ledPins[6], HIGH);  //Turns on LED #6 (connected to pin 8 )
  delay(delayTime);                //waits delayTime milliseconds
  digitalWrite(ledPins[7], HIGH);  //Turns on LED #7 (connected to pin 9 )
  delay(delayTime);                //waits delayTime milliseconds  
 
//Turns Each LED Off
  digitalWrite(ledPins[7], LOW);  //Turns on LED #0 (connected to pin 2 )
  delay(delayTime);                //waits delayTime milliseconds
  digitalWrite(ledPins[6], LOW);  //Turns on LED #1 (connected to pin 3 )
  delay(delayTime);                //waits delayTime milliseconds
  digitalWrite(ledPins[5], LOW);  //Turns on LED #2 (connected to pin 4 )
  delay(delayTime);                //waits delayTime milliseconds
  digitalWrite(ledPins[4], LOW);  //Turns on LED #3 (connected to pin 5 )
  delay(delayTime);                //waits delayTime milliseconds
  digitalWrite(ledPins[3], LOW);  //Turns on LED #4 (connected to pin 6 )
  delay(delayTime);                //waits delayTime milliseconds
  digitalWrite(ledPins[2], LOW);  //Turns on LED #5 (connected to pin 7 )
  delay(delayTime);                //waits delayTime milliseconds
  digitalWrite(ledPins[1], LOW);  //Turns on LED #6 (connected to pin 8 )
  delay(delayTime);                //waits delayTime milliseconds
  digitalWrite(ledPins[0], LOW);  //Turns on LED #7 (connected to pin 9 )
  delay(delayTime);                //waits delayTime milliseconds  
}
 
/*
 * oneAfterAnotherLoop() - Will light one LED then delay for delayTime then light
 * the next LED until all LEDs are on it will then turn them off one after another
 *
 * this does it using a loop which makes for a lot less typing. 
 * than oneOnAtATimeNoLoop() does exactly the same thing with less typing
 */
void oneAfterAnotherLoop(){
  int delayTime = 100; //the time (in milliseconds) to pause between LEDs
                       //make smaller for quicker switching and larger for slower
 
//Turn Each LED on one after another
  for(int i = 0; i <= 7; i++){
    digitalWrite(ledPins[i], HIGH);  //Turns on LED #i each time this runs i
    delay(delayTime);                //gets one added to it so this will repeat 
  }                                  //8 times the first time i will = 0 the final
                                     //time i will equal 7;
 
//Turn Each LED off one after another
  for(int i = 7; i >= 0; i--){  //same as above but rather than starting at 0 and counting up
                                //we start at seven and count down
    digitalWrite(ledPins[i], LOW);  //Turns off LED #i each time this runs i
    delay(delayTime);                //gets one subtracted from it so this will repeat 
  }                                  //8 times the first time i will = 7 the final
                                     //time it will equal 0
                                     
                                     
}
 
/*
 * oneOnAtATime() - Will light one LED then the next turning off all the others
 */
void oneOnAtATime(){
  int delayTime = 100; //the time (in milliseconds) to pause between LEDs
                       //make smaller for quicker switching and larger for slower
  
  for(int i = 0; i <= 7; i++){
    int offLED = i - 1;  //Calculate which LED was turned on last time through
    if(i == 0) {         //for i = 1 to 7 this is i minus 1 (i.e. if i = 2 we will
      offLED = 7;        //turn on LED 2 and off LED 1)
    }                    //however if i = 0 we don't want to turn of led -1 (doesn't exist)
                         //instead we turn off LED 7, (looping around)
    digitalWrite(ledPins[i], HIGH);     //turn on LED #i
    digitalWrite(ledPins[offLED], LOW); //turn off the LED we turned on last time
    delay(delayTime);
  }
}
 
/*
 * inAndOut() - This will turn on the two middle LEDs then the next two out
 * making an in and out look
 */
void inAndOut(){
  int delayTime = 100; //the time (in milliseconds) to pause between LEDs
                       //make smaller for quicker switching and larger for slower
  
  //runs the LEDs out from the middle
  for(int i = 0; i <= 3; i++){
    int offLED = i - 1;  //Calculate which LED was turned on last time through
    if(i == 0) {         //for i = 1 to 7 this is i minus 1 (i.e. if i = 2 we will
      offLED = 3;        //turn on LED 2 and off LED 1)
    }                    //however if i = 0 we don't want to turn of led -1 (doesn't exist)
                         //instead we turn off LED 7, (looping around)
    int onLED1 = 3 - i;       //this is the first LED to go on ie. LED #3 when i = 0 and LED 
                             //#0 when i = 3 
    int onLED2 = 4 + i;       //this is the first LED to go on ie. LED #4 when i = 0 and LED 
                             //#7 when i = 3 
    int offLED1 = 3 - offLED; //turns off the LED we turned on last time
    int offLED2 = 4 + offLED; //turns off the LED we turned on last time
    
    digitalWrite(ledPins[onLED1], HIGH);
    digitalWrite(ledPins[onLED2], HIGH);    
    digitalWrite(ledPins[offLED1], LOW);    
    digitalWrite(ledPins[offLED2], LOW);        
    delay(delayTime);
  }
 
  //runs the LEDs into the middle
  for(int i = 3; i >= 0; i--){
    int offLED = i + 1;  //Calculate which LED was turned on last time through
    if(i == 3) {         //for i = 1 to 7 this is i minus 1 (i.e. if i = 2 we will
      offLED = 0;        //turn on LED 2 and off LED 1)
    }                    //however if i = 0 we don't want to turn of led -1 (doesn't exist)
                         //instead we turn off LED 7, (looping around)
    int onLED1 = 3 - i;       //this is the first LED to go on ie. LED #3 when i = 0 and LED 
                             //#0 when i = 3 
    int onLED2 = 4 + i;       //this is the first LED to go on ie. LED #4 when i = 0 and LED 
                             //#7 when i = 3 
    int offLED1 = 3 - offLED; //turns off the LED we turned on last time
    int offLED2 = 4 + offLED; //turns off the LED we turned on last time
    
    digitalWrite(ledPins[onLED1], HIGH);
    digitalWrite(ledPins[onLED2], HIGH);    
    digitalWrite(ledPins[offLED1], LOW);    
    digitalWrite(ledPins[offLED2], LOW);        
    delay(delayTime);
  }
}

Переделал его под кнопку при нажатии кнопки запускается первый цикл, при нажатии второй раз кнопки второй цикл и т.д, предпоследний общий, и офф. Использовал regim и flag.

А с ИК датчиком никак не могу добиться такого же результата. Просто включить выключить светодиод  без проблем.

А режим мигания например oneAfterAnotherLoop запускается и не отключается (Заметил что в компорт передает код постоянно),

или запускается проходит один цикл мигания и отключается сам.

Оставил один режим (inAndOut) для упрощения он по нажатию одной кнопки запускается. проходит 1 цикл мигания и остаются гореть 2 светодиода, по нажатию кнопки офф выкл.

//по нажатию одной кнопки запускается. проходит цикл мигания и остаются гореть 2 светодиода, по нажатию кнопки офф выкл

#include <IRremote.h>
int ledPins[] = {2,3,4,5,6,7,8,9};
int RECV_PIN = 12;

IRrecv irrecv(RECV_PIN);
decode_results results;

void setup(){
for(int i = 0; i < 8; i++)        
pinMode(ledPins[i],OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn(); // Запуск приемника
}
void loop() {
if (irrecv.decode(&results)){
Serial.println(results.value);

//_______________________3_________________________
if (results.value == 16623703)  
{
void inAndOut();
  int delayTime = 100; 
  for(int i = 0; i <= 3; i++){
    int offLED = i - 1;  
    if(i == 0) {        
      offLED = 3;       
    }                                        
    int onLED1 = 3 - i;                                    
    int onLED2 = 4 + i;                                   
    int offLED1 = 3 - offLED; 
    int offLED2 = 4 + offLED; 
    digitalWrite(ledPins[onLED1], HIGH);
    digitalWrite(ledPins[onLED2], HIGH); 
    digitalWrite(ledPins[offLED1], LOW); 
    digitalWrite(ledPins[offLED2], LOW);      
    delay(delayTime);           
  }
//______________________________________
  for(int i = 3; i >= 0; i--){
    int offLED = i + 1;  
    if(i == 3) {         
      offLED = 0;        
    }                                         
    int onLED1 = 4 - i;                                    
    int onLED2 = 3 + i;                               
    int offLED1 = 3 - offLED; 
    int offLED2 = 4 + offLED; 
    digitalWrite(ledPins[onLED1], HIGH);
    digitalWrite(ledPins[onLED2], HIGH);    
    digitalWrite(ledPins[offLED1], LOW);    
    digitalWrite(ledPins[offLED2], LOW);        
    delay(delayTime); 
  }
}

    if (results.value == 16599223)
    {
    digitalWrite(ledPins[2], LOW);    
    digitalWrite(ledPins[3], LOW); 
    digitalWrite(ledPins[4], LOW);
    digitalWrite(ledPins[5], LOW);
    digitalWrite(ledPins[6], LOW);
    digitalWrite(ledPins[7], LOW);
    digitalWrite(ledPins[8], LOW);
    digitalWrite(ledPins[9], LOW);
    delay(1000);  
  }
  irrecv.resume(); // Получаем следующее значение
  } 
  }




Как написать, чтоб по нажатию 1 кнопки запустился первый режим.  мигал пока я не нажму off.

По нажатию второй кнопки запускался второй режим.

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

faraddin
Offline
Зарегистрирован: 11.08.2013

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

rus2014
Offline
Зарегистрирован: 11.09.2014

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

faraddin
Offline
Зарегистрирован: 11.08.2013

А вы приведите оба ваших кода, который работает и который не работает

 

rus2014
Offline
Зарегистрирован: 11.09.2014

Пример мигания со страницы http://arduino.ru/tutorials/BlinkWithoutDelay мигает.

добавил датчик ИК по нажатию кнопки 1 включает и имже выключает, но не мигает.

#include <IRremote.h>

/* Blink without Delay
 2005
 by David A. Mellis
 modified 8 Feb 2010
 by Paul Stoffregen
 */

const int ledPin =  2;      // номер выхода,&nbsp;подключенного к светодиоду
// Variables will change:
int ledState = LOW;             // этой переменной устанавливаем состояние светодиода 
long previousMillis = 0;        // храним время последнего переключения светодиода
long interval = 1000;           // интервал между включение/выключением светодиода (1 секунда)
int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {
  // задаем режим выхода для порта, подключенного к светодиоду
  pinMode(ledPin, OUTPUT); 
Serial.begin(9600);
irrecv.enableIRIn(); // Запуск приемника  
}
void loop()
{
  if (irrecv.decode(&results)){
    Serial.println(results.value);
  // здесь будет код, который будет работать постоянно
  // и который не должен останавливаться на время между переключениями свето
  unsigned long currentMillis = millis();
 
  //проверяем не прошел ли нужный интервал, если прошел то
  if(currentMillis - previousMillis > interval) {
    // сохраняем время последнего переключения
    previousMillis = currentMillis;  

if (results.value == 16724175)
    // если светодиод не горит, то зажигаем, и наоборот
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(ledPin, ledState);
    
  }
  irrecv.resume(); // Получаем следующее значение
  }
}

Это скетч включается по кнопке 1, и отключается по кнопке off но не моргает. 

#include <IRremote.h>

/* Blink without Delay
 2005
 by David A. Mellis
 modified 8 Feb 2010
 by Paul Stoffregen
 */

const int ledPin =  2;      // номер выхода,&nbsp;подключенного к светодиоду
// Variables will change:
int ledState = LOW;             // этой переменной устанавливаем состояние светодиода 
long previousMillis = 0;        // храним время последнего переключения светодиода
long interval = 1000;           // интервал между включение/выключением светодиода (1 секунда)
int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {
  // задаем режим выхода для порта, подключенного к светодиоду
  pinMode(ledPin, OUTPUT); 
  Serial.begin(9600);
  irrecv.enableIRIn(); // Запуск приемника  
}
void loop()
{
  if (irrecv.decode(&results)){
    Serial.println(results.value);
  // здесь будет код, который будет работать постоянно
  // и который не должен останавливаться на время между переключениями свето
  unsigned long currentMillis = millis();
 
  //проверяем не прошел ли нужный интервал, если прошел то
  if(currentMillis - previousMillis > interval) {
    // сохраняем время последнего переключения
    previousMillis = currentMillis;  

    if (results.value == 16724175)
    {
    // если светодиод не горит, то зажигаем, и наоборот
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
    // устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(ledPin, ledState);
  }
  
   if (results.value == 16753245)
    {
      ledState = LOW;
    // устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(ledPin, ledState);
  }
  }
irrecv.resume(); // Получаем следующее значение
  }
}

Если убираю    (irrecv.resume(); // Получаем следующее значение) он начинает мигать при нажатии кнопки 1 но не отключает, в компорте при моргании код повторяется сам по себе.

faraddin
Offline
Зарегистрирован: 11.08.2013
const int ledPin =  2;      // номер выхода,&nbsp;подключенного к светодиоду 
// Variables will change: 
int ledState = LOW;             // этой переменной устанавливаем состояние светодиода  
long previousMillis = 0;        // храним время последнего переключения светодиода 
long interval = 1000;           // интервал между включение/выключением светодиода (1 секунда) 
int RECV_PIN = 12; 
IRrecv irrecv(RECV_PIN); 
decode_results results; 

void setup()
{ 
    // задаем режим выхода для порта, подключенного к светодиоду 
    pinMode(ledPin, OUTPUT);  
    Serial.begin(9600); 
    irrecv.enableIRIn(); // Запуск приемника   
} 


void loop() 
{ 
    if (irrecv.decode(&results))
    { 
        Serial.println(results.value); 
        // здесь будет код, который будет работать постоянно 
        // и который не должен останавливаться на время между переключениями свето 
        unsigned long currentMillis = millis(); 
         //проверяем не прошел ли нужный интервал, если прошел то 
        if(currentMillis - previousMillis > interval) 
        { 
            // сохраняем время последнего переключения 
            previousMillis = currentMillis;   
            if (results.value == 16724175) 
            { 
               // если светодиод не горит, то зажигаем, и наоборот 
                if (ledState == LOW) ledState = HIGH else ledState = LOW; 
                // устанавливаем состояния выхода, чтобы включить или выключить светодиод 
                digitalWrite(ledPin, ledState); 
            } 
            if (results.value == 16753245) 
            { 
                ledState = LOW; 
                // устанавливаем состояния выхода, чтобы включить или выключить светодиод 
                digitalWrite(ledPin, ledState); 
            } 
        } 
        irrecv.resume(); // Получаем следующее значение 
    } 
} 

Взгляните на мой код и на Ваш. Разница только в выравнивании. А как результат, понять "мой" код куда проще чем Ваш. В Вашем например "без ста грам" сложно определить например, к какому именно if относится irrecv.resume(); а в этих моментах коварные ошибки как раз таки и могут прятаться. Попробуйте расставить правильно табуляры или пробелы в ваших кодах и еще раз внимательно, вдумчиво просмотреть, вдруг увидете отгадку сами.

 

rus2014
Offline
Зарегистрирован: 11.09.2014

спасибо попробую-)