correr dos programas a la vez

hola, bueno yo vengo comenzando con el software de arduino y pues voy pasando los learning todavia, pero me pareció interesante cuando llegue al programa de Blink Without Delay, que este sirve para correr un código sin interrumpir otro código que se corra a la vez, pero solo se encendía un LED :~, así que no vi donde se aplicaba esto =(.

bueno decidi entonces que yo iba a combinar dos ejemplos para hacerlo mas interesante y agregue un código para mediante un pushbottom encender otro LED sin interrumpir al LED que parpadea de manera automatica, les dejo el código, espero que le sirva a los que van comenzando como yo :slight_smile:

/* Blink without Delay

*Turns on and off a light emitting diode(LED) connected to a digital *
pin, without using the delay() function. This means that other code
can run at the same time without being interrupted by the LED code.

The circuit:
* LED attached from pin 13 to ground.
* Note: on most Arduinos, there is already an LED on the board
that's attached to pin 13, so no hardware is needed for this example.

created 2005
by David A. Mellis
modified 8 Feb 2010
by Paul Stoffregen

This example code is in the public domain.

/*

  • Button*

*Turns on and off a light emitting diode(LED) connected to digital *
pin 13, when pressing a pushbutton attached to pin 2.

The circuit:
* LED attached from pin 13 to ground
* pushbutton attached to pin 2 from +5V
* 10K resistor attached to pin 2 from ground

* Note: on most Arduinos there is already an LED on the board
attached to pin 13.

created 2005
by DojoDave http://www.0j0.org
modified 30 Aug 2011
by Tom Igoe

This example code is in the public domain.

modificado 10 de septiembre de 2012
por Nelson Salinas

http://www.arduino.cc/en/Tutorial/Button */

/* este codigo fue traducido y modificado para que se realizen dos operaciones a la vez
combinando los ejemplos de Blink without Delay y Button.
Se uso un arduino nano 3.0*/
// Constantes invariantes.
// establecer los numeros de los pines:
const int ledPin = 13; // numero del pin con el LED (en la tarjeta)
const int buttonPin = 2; // numero del pin con el pushbutton
const int ledPin3 = 6; // numero del pin con el LED (externo)
// Variables:
int ledState = LOW; // ledState usado para setear el LED
long previousMillis = 0; // guardara el tiempo en que el estado

  • // del LED fue actualizado*
    int buttonState = 0; // variable para lectura del estado del

  • // pushbutton*
    // la siguiente variable se declara long debido a que el tiempo en milisegundos,
    // se convertira en un numero mas grande que el que se puede guardar en un int.
    long interval = 1000; // intervalo en que el LED parpadea(milliseconds)
    void setup() {

  • // establece el pin digital como salida:*

  • pinMode(ledPin, OUTPUT); *

  • // inicia el pin del LED(interno) como salida:*

  • pinMode(ledPin3, OUTPUT); *

  • // inicia el pin del pushbutton como entrada:*

  • pinMode(buttonPin, INPUT);*
    }

  • void loop(){*

  • //control del pushbotton*

  • // lee el valor del estado del pushbutton:*

  • buttonState = digitalRead(buttonPin);*

  • // verifica si el pushbotton es presionado.*

  • // de ser asi, buttonState se establece en HIGH:*

  • if (buttonState == HIGH) { *

  • // enciende el LED(externo): *

  • digitalWrite(ledPin3, HIGH); *

  • }*

  • else {*

  • // apaga el LED(externo):*

  • digitalWrite(ledPin3, LOW);*

  • }*

  • // aqui se pone el codigo que debe correr todo el tiempo de manera*

  • // independiente. Parpadeo del LED(interno)*

  • // verifica si es tiempo de que parpadee el LED; eso si, la diferencia*

  • // entre el tiempo actual y el ultimo tiempo en que parpadeo es mayor al*

  • // intervalo en que se quiere que este parpadee.*

  • unsigned long currentMillis = millis();*

if(currentMillis - previousMillis > interval) {

  • // guarda la ultima vez que el LED parpadeo*
  • previousMillis = currentMillis; *
  • // si el LED esta apagado, lo enciende y vice-versa:*
  • if (ledState == LOW)*
  • ledState = HIGH;*
  • else*
  • ledState = LOW;*
  • // establece el estado de ledState(HIGH o LOW en el LED (interno):*
  • digitalWrite(ledPin, ledState);*
  • }*
    }

Hacer uso de los delay() es muy cómodo pero luego a la hora de la verdad, cuando el programa ya tiene un tamaño considerable, solo dan que problemas y hay que usar para todo la funcion millis()

Te he acortado el codigo un poco, no sé si te gustara:

// Constantes:
const int ledPin    = 13; 
const int ledPin3   = 6; 
const int buttonPin = 2;

// Variables:
long previousMillis = 0;
long interval       = 1000; 

void setup(){
  pinMode(ledPin, OUTPUT);   
  pinMode(ledPin3, OUTPUT);      
}

void loop(){
  digitalWrite(ledPin3, digitalRead(buttonPin));  
 
  if( millis() - previousMillis > interval )  {
    digitalWrite(ledPin, !digitalRead(ledPin) );
    previousMillis = millis();   
  }
}

Saludos!

Yo preferiría evitar esa resta en el comparador en cada iteración:

// Constantes:
const int ledPin    = 13; 
const int ledPin3   = 6; 
const int buttonPin = 2;

// Variables:
long nextMillis = 0;

void setup(){
  pinMode(ledPin, OUTPUT);   
  pinMode(ledPin3, OUTPUT);      
}

void loop(){
  digitalWrite(ledPin3, digitalRead(buttonPin));  
 
  if( millis() > nextMillis)  {
    digitalWrite(ledPin, !digitalRead(ledPin) );
    nextMillis = millis()+1000;   
  }
}

muchas gracias por los consejos XD