2 votos

Tengo 2 programas Arduino que funcionan por separado. ¿Cómo puedo fusionarlos?

Programa 1

2 LED rojos y 1 LED verde se encienden durante 4 segundos y luego se apagan durante 4 segundos. Rojo es entonces alta durante 4 segundos y luego baja durante 4 segundos y luego se repite.

int  LedR = 10;
int  LedG = 11;

void setup() {
// put your setup code here, to run once:
pinMode (LedR, OUTPUT);
pinMode (LedG, OUTPUT);
}

void loop() {
// put your main code here, to run repeatedly:
digitalWrite (LedG, HIGH); //Light Greed Led
delay (4000); //delay 4s

digitalWrite(LedG, LOW);//Low Greed Led

delay (4000); //delay 4s

digitalWrite(LedR, HIGH);//Light Red Led

delay (4000); //delay 4s

digitalWrite (LedR, LOW); //Low Greed Led
delay (4000); //delay 4s`

}

Programa 2

El servo gira 20 grados espera 4 segundos vuelve a 0 grados espera 4 segundos y repite.

#include <Servo.h> 

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup() {
myservo.attach(9);  // attaches the servo on pin 9 to the servo object

}

void loop() {

delay(4000);

for (pos = 0; pos <= 20; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos);              // tell servo to go to position in variable 'pos'
delay(15);                       // waits 15ms for the servo to reach the position
}delay(4000);

for (pos = 20; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
myservo.write(pos);              // tell servo to go to position in variable 'pos'
delay(15);                       // waits 15ms for the servo to reach the position

}
}

Ambos programas funcionan de forma independiente pero son imposibles de integrar ya que el Arduino no permite bucles múltiples.

He intentado aprender la función millis sin éxito.

¿Hay alguna forma de conseguir que los LEDs se enciendan consecutivamente al mismo tiempo que gira el servo?

Por favor, ayúdeme. Este es el código que no funciona:

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position
int  LedR = 10;
  int  LedG = 11;

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  pinMode (LedR,OUTPUT);
pinMode (LedG,OUTPUT);

}

void loop() {

  digitalWrite (LedG, HIGH); //Light Greed Led 
delay (4000); //delay 4s

digitalWrite(LedG, LOW);//Low Greed Led

delay (4000); //delay 4s

digitalWrite(LedR, HIGH);//Light Red Led

delay (4000); //delay 4s

digitalWrite (LedR, LOW); //Low Greed Led

delay (4000); //delay 4s

  delay(4000);

6voto

Toor Puntos 777

En lugar de utilizar una función de retardo que lo retenga todo, configura o accede a un periférico temporizador que siga contando en segundo plano independientemente de lo que esté haciendo el Arduino y cuyo valor puedas comprobar siempre que lo necesites.

Por ejemplo: https://www.arduino.cc/reference/en/language/functions/time/millis/

Ese temporizador se activa cada 50 días, así que si no piensas dejarlo funcionando tanto tiempo, puedes tratarlo como temporizador por tiempo absoluto. Si está ejecutando más de 50 días, entonces usted tiene que añadir algunos extra if else cheques para cuando el temporizador se envuelve alrededor.

A continuación, utilice dos sentencias condicionales para sus otras dos funciones en el bucle para sondear ese temporizador para ver si deben hacer algo en esa iteración de bucle en particular. Esas funciones pueden registrar un valor del reloj en eventos de importancia y compararlo con el valor actual para ver si ha transcurrido suficiente tiempo. Puedes usar variables globales para esto, pero estático (si Arduino las permite) son más seguras ya que sólo son visibles dentro de la función y retienen su valor entre llamadas a la función. Usted también no tiene tiempo de mantenimiento de variables globales flotando alrededor de cada función que son accesibles a todo.

De esa manera, si el Arduino no se supone que debe estar haciendo nada en ese momento en particular para esa acción en particular, puede seguir adelante y hacer otra cosa en lugar de girar los pulgares esperando alrededor y la celebración de todo después de que hasta. Prácticamente nunca use una función de retardo que sólo mantiene el procesador impidiéndole hacer cualquier otra cosa si se puede. Tira ese delay() a la basura donde pertenece el 99% de las veces.

¡Bienvenido al mundo de la multitarea!

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X