Autor Tema: Ejecutar 2 funciones el void_loop() que contienen delay().  (Leído 2064 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado wbueso

  • PIC10
  • *
  • Mensajes: 6
Ejecutar 2 funciones el void_loop() que contienen delay().
« en: 26 de Diciembre de 2020, 19:04:07 »
Estoy haciendo un dispositivo (en arduino uno) que me activa 4 relay en diferentes momentos, esto es hasta que termina un delay() que los activa.
He creado un timer que cuenta el tiempo que está activado el relay, el caso es que los cree cada uno de ellos aparte --void _time() y void _crono()--, cada uno de ellos contiene uno o más delay(), pero al llamarlos desde void _loop() solo se ejecuta el primero y el segundo se ejecuta hasta que termina el primero y sé que es porque contienen delay().
Quisiera que al activarse un relay comenzara a correr el cronometro, ¿alguien puede ayudarme?
Tengo que decir que soy completamente nuevo en esto y este sería mi primer proyecto en electrónica y en programación con arduino IDE.
Aun no sé si se pueden ejecutar fuera de void _loop().
O ejecutarlo una sola vez o ejecutarlos al mismo tiempo.
Porfa ayúdenme se los agradeceré mucho, soy de honduras y tengo 52 años, soy tec. en electronica, Dios les bendiga.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Ejecutar 2 funciones el void_loop() que contienen delay().
« Respuesta #1 en: 27 de Diciembre de 2020, 06:35:13 »
Hola wbueso, bienvenido al foro.

Creo que lo que quieres hacer es que se ejecuten varias rutinas a la vez con delays. La manera más sencilla de hacer eso es con un sistema en tiempo real para tareas concurrentes. Yo utilizo Scoop. Es un poco antiguo y lleva tiempo sin actualizaciones pero funciona bastante bien. Te adjunto también la librería para que la instales en Arduino.

Te dejo un programa de ejemplo que enciende dos salidas con tiempos distintos y una tercera salida respondiendo a comandos que se le envíen desde el puerto serie.

Código: C
  1. #include <SCoop.h>
  2.  
  3. int led1 = 13;
  4. int led2 = 12;
  5. int led3 = 11;
  6.  
  7.  
  8. void setup() {
  9.    Serial.begin(9600);
  10.  
  11.    // Setup the 3 pins as OUTPUT
  12.    pinMode(led1, OUTPUT);
  13.    pinMode(led2, OUTPUT);
  14.    pinMode(led3, OUTPUT);
  15.  
  16.    // Start scheduler
  17.    mySCoop.start();
  18. }
  19.  
  20. // Task 1: blink LED with 1 second delay.
  21. void loop() {
  22.    digitalWrite(led1, HIGH);
  23.    mySCoop.delay(1000);
  24.  
  25.    digitalWrite(led1, LOW);
  26.    mySCoop.delay(1000);
  27. }
  28.  
  29.  
  30. // Task 2: blink LED with 0.3 second delay.
  31. defineTaskLoop(loop2) {
  32.  
  33.    digitalWrite(led2, HIGH);
  34.    mySCoop.delay(300);
  35.  
  36.    digitalWrite(led2, LOW);
  37.    mySCoop.delay(300);
  38. }
  39.  
  40.  
  41. // Task 3: accept commands from Serial port
  42. // '0' turns off LED
  43. // '1' turns on LED
  44. defineTaskLoop(loop3) {
  45.    if (Serial.available()) {
  46.       char c = Serial.read();
  47.       if (c == '0') {
  48.          digitalWrite(led3, LOW);
  49.          Serial.println("Led turned off!");
  50.       }
  51.       if (c == '1') {
  52.          digitalWrite(led3, HIGH);
  53.          Serial.println("Led turned on!");
  54.       }
  55.    }
  56. }

Un saludo.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Ejecutar 2 funciones el void_loop() que contienen delay().
« Respuesta #2 en: 27 de Diciembre de 2020, 06:50:15 »
¿Y usando millis(); ?.

  Activas un rele. Tomas el valor de millis() y lo memorizas para ese rele en una variable de tipo unsigned long. 
 
Activas otro y lo mismo pero lo memorizas en otra variable del mismo tipo.

   Calculas la diferencia entre el valor de millis y el tiempo que quieres tener ese rele activado.
 
 En el bucle vas comprobando constantemente millis y cuando coincida o su valor sea superior al calculado, apagas el rele que toque.

 Saludos.
« Última modificación: 27 de Diciembre de 2020, 06:53:12 por remi04 »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Ejecutar 2 funciones el void_loop() que contienen delay().
« Respuesta #3 en: 27 de Diciembre de 2020, 07:02:25 »
Esa es la solución cuando no tienes un RTOS (Real Time Operating System). Con Scoop la programación se vuelve mucho más sencilla e intuitiva porque todos esos cálculos los hace Scoop por ti.

Desconectado wbueso

  • PIC10
  • *
  • Mensajes: 6
Re:Ejecutar 2 funciones el void_loop() que contienen delay().
« Respuesta #4 en: 27 de Diciembre de 2020, 22:55:01 »
Agradesco la ayuda, voy a provar, solo que ahora ya no puedo ni hacer que funcione la pantalla LCD.
este es el codigo y me da error al compilarlo.

#include  <Wire.h>
#include  <LiquidCrystal_I2C.h>

// Constructor de la librería de LCD 16x2
// Aqui se configuran los pines asignados a la pantalla del PCF8574
#define GPIO_ADDR   0x27
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); <<< aqui es donde me da error y no se como resolverlo
 
void setup()
{
  // Indicar a la libreria que tenemos conectada una pantalla de 16x2
  lcd.begin(16, 2); << aqui tambien me da error
  lcd,init();
  // Mover el cursor a la primera posición de la pantalla (0, 0)
  lcd.home ();
  // Imprimir "Hola Mundo" en la primera linea
  lcd.print("Hola Mundo");
  // Mover el cursor a la segunda linea (1) primera columna
  lcd.setCursor ( 0, 1 );
  // Imprimir otra cadena en esta posicion
  lcd.print("Test");
  // Esperar un segundo
  delay(1000);
}

void loop()
{
  // EN EL CICLO PRINCIPAL SOLAMENTE RECORREMOS EL MENSAJE DE UN LADO A OTRO
  // Variable para conteo de ciclos
  int i;

  // Desplazar la pantalla a la derecha 2 veces
  for ( int i = 0; i < 5; i++ ) {
    //lcd.scrollDisplayRight();
    delay (1000);
  }

  // Desplazar la pantalla a la izquierda 2 veces
  for ( int i = 0; i < 5; i++ ) {
    //lcd.scrollDisplayLeft();
    delay (1000);
  }
}
« Última modificación: 28 de Diciembre de 2020, 00:03:35 por wbueso »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Ejecutar 2 funciones el void_loop() que contienen delay().
« Respuesta #5 en: 28 de Diciembre de 2020, 10:35:53 »
Fíjate en los ejemplos para ver cómo se configura el LCD:
https://github.com/johnrickman/LiquidCrystal_I2C/blob/master/examples/HelloWorld/HelloWorld.pde

Código: C
  1. //YWROBOT
  2. //Compatible with the Arduino IDE 1.0
  3. //Library version:1.1
  4. #include <LiquidCrystal_I2C.h>
  5.  
  6. LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display
  7.  
  8. void setup()
  9. {
  10.   lcd.init();                      // initialize the lcd
  11.   // Print a message to the LCD.
  12.   lcd.backlight();
  13.   lcd.setCursor(3,0);
  14.   lcd.print("Hello, world!");
  15.   lcd.setCursor(2,1);
  16.   lcd.print("Ywrobot Arduino!");
  17.    lcd.setCursor(0,2);
  18.   lcd.print("Arduino LCM IIC 2004");
  19.    lcd.setCursor(2,3);
  20.   lcd.print("Power By Ec-yuan!");
  21. }
  22.  
  23.  
  24. void loop()
  25. {
  26. }