Hacer dos cosas a la vez con diferente frecuencia

Hola que tal, mi proyecto trata de manipular la intensidad de un motor de AC y una lampara de AC, todo el hardware ya lo tengo, ya puedo controlar la velocidad del motor y la intensidad de la lampara por separdo, pero al unir los dos programas es ahi donde todo se me dificulta, como puedo manipular los dos al mismo tiempo?, he leido que con interrupciones internas como los timers, pero no me sale, como puedo hacer el famoso multitask ya que no puedo hacer dos cosas en paralelo :/ Saludos.!

Hola, si pusieras el código, nos ayudaría a comprender tu problema.

Seria que despues de una interrupcion se ejecutaran dos funciones que srian estas

void activarTRIAC1(){ digitalWrite(agitador,HIGH); delayMicroseconds(5000); digitalWrite(agitador,LOW); Timer1.stop(); }

void activarTRIAC2(){ digitalWrite(resistencia,HIGH); delayMicroseconds(5); digitalWrite(resistencia,LOW); Timer1.stop(); }

pero como se pude observar una espera 5000microsegunds y la otra 5.!

y esta interrupcion se ejecutaria 60 veces por segundo.

el problema es que mientras una espera los 5000 microsegundos la otra se queda pausada que ya nomas requiere 5 micros

Hola, para eso mejor no usar delay Mira la página http://arduino.cc/es/Tutorial/BlinkWithoutDelay

En resumen, cuando enciendas el agitador empiezas a contar milisegundos_agitador, y con la resistencia lo mismo.

Con Arduino no podras hacer jamas multitask ,al menos con los que yo tengo ,el UNO y el MEGA,ya que la ejecucion de instrucciones es secuencial,una tras otra ,pero nunca en multitarea o multihilo,por lo tanto jamas podras hacer dos o mas cosas al mismo tiempo(si una tras otra sin delays y como el arduino es tan rapido ,parece que las ejecuta al mismo tiempo).Las interrupciones ejecutan las funciones que hayas programado pero detieniendo el sketch ,ejecuta la funcion y continua ejecutando el sketch por donde se habia quedado.

A muy bien, ok entonces definitivamente es secuancial el arduino y al ponerle interrupciones internas y externas, me afecta en perdida de tiempo ya que detiene todo para ir a la funcion.

Ya ando trabajando en la eliminacion de la funcion delay() para ahorrarme mas tiempo, porque si todavia le pongo sensores para que me valla leyendo las RPM del agitador y un sensor de luz para la resistencia, el codigo se va sobre cargar y no va poder hcer todo al mismo tiempo :/... no tienen alguna sugerencia para poder lograr eso? yo tengo el arduino mega, le pongo dos arduinos? o me compro otro arduino que pueda hacer el multitask?

Las interrupciones se usan cuando necesitamos procesar algo que es prioritario sin importar que parte del sketch se este ejecutando,por ejemplo en un robot que ha de detectar una pared para canviar de direccion y no chocar,la señal de ,por ejemplo,un sensor de distancia por ultrasonidos deberia ser tratada inmediatamente en caso de proximidad de un obstaculo,pero si la lectura de este sensor la metes en el loop y todo el programa tarda 5 segundos en ejecutarse ,solo podras evaluar si hay un obstaculo cada 5 segundos lo cual puede ser insuficiente, por lo que en esta situacion seria aconsejable usar una interrupcion,no se si me he explicado bien.

Hola triplevic, fijate que yo he estado tratando de hacer funcionar unos motores al mismo tiempo y a diferentes velocidades y creo que lo tuyo vendria siendo algo parecido. Prueba con este código y espero que te sirva .

unsigned long previousMicrosTriac1 = 0;
unsigned long previousMicrosTriac2 = 0;

const long intervalTriac1 = 5000;
const long intervalTriac2 = 5;

const int agitador = 5;
const int resistencia = 6;

int agitadorState = HIGH;
int resistenciaState = HIGH;

void setup()
{
  pinMode(agitador, OUTPUT);
  pinMode(resistencia, OUTPUT);
  
  digitalWrite(agitador, agitadorState);
  digitalWrite(resistencia, resistenciaState);

}//fin de void setup

void loop()
{
  unsigned currentMicros = micros();
  
  //Temporizador para agitador de 5000 microsegundos
  if(currentMicros - previousMicrosTriac1 >= intervalTriac1){
    previousMicrosTriac1 = currentMicros;
    
    if(agitadorState == HIGH)
      agitadorState = LOW;
    else
      agitadorState =HIGH;
      
   digitalWrite(agitador, agitadorState);
  
  }
  
  //Temporizador para resistencia de 5 microsegundos
  if(currentMicros - previousMicrosTriac2 >= intervalTriac2){
    previousMicrosTriac2 = currentMicros;
    
    if(resistenciaState == HIGH)
      resistenciaState = LOW;
    else
      resistenciaState =HIGH;
      
   digitalWrite(resistencia, resistenciaState);
  
  }
  
  
}//Fin de bucle loop

jose te explicaste excelente lo unico malo como dices es que detiene todo lo que esta haciendo para tomar eso como prioridad y en mi caso eso me afecta porque tengo un sensor que simpre me esta dando lecturas y por esa cuestion las lecturas me las da con cierto error :confused:

alexcrauser woow ese codigoo me impresiono no lo habia visto de esa manera, mi codigo es un poco mas complejo pero me diste una super ideaa muchas gracias.

gracias a ambos por su tiempo, voy a trabjar en eso y les aviso como me fue :slight_smile:

hola que tal a todos espero que esten bien la verdad no soy muy bueno en arduino bueno mi profesor de electronica digital nos dejo hacer un turnomatico, nosotros, pues decidimos comprar una pnatalla LCD 16x2 una matriz de 7x5 un sensor de movimiento PIR un teclado matricial de 4x4 y un buzzer
bueno nuestra idea es esta un usuario digitara por medio del teclado una opcion cuando tenga la opcion
y pase que el sensor lo detecte y suene el buzer y en la matriz digite turno o caja, tenemos el codigo de cada uno, lo que no puedo es unir todos ya intente poniendolo por funciones y llamarlo en el void loop y no me digita lo que quiere, quisiera ver si me puden ayudar

letras_caja_1-2.ino (16.3 KB)

Alarma_con_Sensor_de_Movimiento_PIR_-_Buzzer.ino (1.11 KB)

menu_lcd.ino (3.38 KB)

Cuando escribiste esta consulta no recibiste un mensaje de advertencia en letras Rojas?

El mensaje dice que hace mas de 120 dias que este tema no tiene movimientos.

Desde el 06-02-2014, 13:30:57 en este caso nadie responde en este hilo.

Deberías crear un nuevo tema.