Saludos Amigos.
Mi nombre es Carlos, y les escribo desde Argentina.
Estoy trabajando en un proyecto personal de DOMOTICA y la idea inicial era utilizar PLC, pero me tope con Arduino y decidí aventurarme.
Como he visto en varios post, y me he topado en con el problema de varios, TAREAS SIMULTANEAS.
El problema puntual es el siguiente.
Decidí iluminar los escalones de una escalera con LEDS, utilizando 2 sensores de movimiento, uno puesto en la parte inferior de la escalera, y otro en la superior, encendiendo los escalones en secuencia, dependiendo de cual de los sensores se active primero, y mateniendo la iluminación durante 15-20 segundos. Hasta acá todo bien.
El problema surge cuando a la vez quiero por ejemplo bajar una persiana, o hacer un dimmer a una luz, o lo que sea. Debo esperar a que el evento de la escalera finalice para realizar otra tarea.
en la función de la escalera he utilizado delays, se que esto no es compatible con tareas simultaneas, pero no se como resolverlo.
Espero se entienda.
Aguardo sus comentarios y de ante mano muchas gracias!.
Revisa el ejemplo de blink sin delays
CharlyBrown:
Saludos Amigos.
Mi nombre es Carlos, y les escribo desde Argentina.
Estoy trabajando en un proyecto personal de DOMOTICA y la idea inicial era utilizar PLC, pero me tope con Arduino y decidí aventurarme.
Como he visto en varios post, y me he topado en con el problema de varios, TAREAS SIMULTANEAS.
El problema puntual es el siguiente.
Decidí iluminar los escalones de una escalera con LEDS, utilizando 2 sensores de movimiento, uno puesto en la parte inferior de la escalera, y otro en la superior, encendiendo los escalones en secuencia, dependiendo de cual de los sensores se active primero, y mateniendo la iluminación durante 15-20 segundos. Hasta acá todo bien.
El problema surge cuando a la vez quiero por ejemplo bajar una persiana, o hacer un dimmer a una luz, o lo que sea. Debo esperar a que el evento de la escalera finalice para realizar otra tarea.
en la función de la escalera he utilizado delays, se que esto no es compatible con tareas simultaneas, pero no se como resolverlo.
Espero se entienda.
Aguardo sus comentarios y de ante mano muchas gracias!.
Como ya te mencionaron no uses delays, un delay detiene por completo tu arduino no lo deja hacer nada mas. Usa la funcion millis no es igual, deja busco ejemplo y te lo muestro
RodrigoZamora:
Como ya te mencionaron no uses delays, un delay detiene por completo tu arduino no lo deja hacer nada mas. Usa la funcion millis no es igual, deja busco ejemplo y te lo muestro
No busques nada, lee lo que otros han puesto porque PeterKantropus ya lo posteo como blink sin delays
Lo prometido es deuda, aquí un ejemplo:
/**VARIABLES PARA MULTITAREA**/
long tiempoPrevioHilo1 = 0;
long tiempoPrevioHilo2 = 0;
long intervaloHilo1 = 200L;
long intervaloHilo2 = 2000L;
/**VARIABLES DEL PROGRAMA**/
int ledX = 13;
int ledY = 12;
//variables de estado
char estadoledX = 'H';
char estadoledY = 'L';
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(ledX, OUTPUT);
pinMode(ledY, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
multiTarea();
}
void multiTarea(){
long tiempoAct = millis();
if (tiempoAct - tiempoPrevioHilo1 > intervaloHilo1) {
tiempoPrevioHilo1 = tiempoAct;
hilo1();
}
if (tiempoAct - tiempoPrevioHilo2 > intervaloHilo2) {
tiempoPrevioHilo2 = tiempoAct;
hilo2();
}
Serial.println("otra actividad");
}
void hilo1(){
if (estadoledX=='H'){
digitalWrite(ledX, LOW);
estadoledX = 'L';
Serial.println("X - Low");
}
else{
digitalWrite(ledX, HIGH);
estadoledX = 'H';
Serial.println("X - High");
}
}
void hilo2(){
if (estadoledY=='H'){
digitalWrite(ledY, LOW);
estadoledY = 'L';
Serial.println("Y - Low");
}
else{
digitalWrite(ledY, HIGH);
estadoledY = 'H';
Serial.println("Y - High");
}
}
Saludos.