Go Down

Topic: Entender millis y no morir en el intento (Read 5580 times) previous topic - next topic

carlospastran

Excelente! buscaba una guía para entender mejor este tema, gracias por tomarte el tiempo de explicarlo detalladamente.

apacher

Muy claro victorjam. Muchas gracias por tu tiempo.

Metaconta

#17
Jul 04, 2020, 06:12 pm Last Edit: Jul 05, 2020, 09:06 pm by surbyte Reason: Citar no es repetir todo el msg que ya se lee.
Dejo un programa "chorra" que he desarrollado para que jugueis un rato


Hola:

Muy bien explicado eso de los milis.

¿Qué programa o qué lenguaje hiciste esta aplicación?

Saludos.

victorjam

Hay un PD en el post que lo pone: free pascal, usando el IDE lazarus.

Metaconta

Hola:

¿Puedes poner el código fuente de pascal?

Gracias. lo intentaré adaptarlo al Delphi 10, ya que lo tengo instalado.

Saludos.

victorjam

No tengo el código, pero si eres programador en delphi, debes saber que Lazarus es en realidad un clon de Delphi de código abierto y usando el compilador de freepascal. Iba a hacer el programa usando mi querido borland pero no lo encontraba por ningún sitio, así que descargué Lazarus.

En el programa hay un TForm que tiene contiene los siguientes componentes:

  • Un componente TTimer cuyo evento OnTimer() se ejecuta cada segundo y lo que hace es incrementar una variable llamada millis
  • 3 componentes TLabel fijos cuyo Caption son "millis()", "t=millis()", "millis()-t".
  • 3 componentes TLabel dinámicos cuyo Caption son los valores de millis, t y millis()-t. Estos caption
    se actualizan en cada llamada a la función OnTimer de TTimer.
  • Un componente TButton que al pulsar guarda en una variable t el valor de millis().


Cómo ves es francamente sencillo y si eres programador de Delphi adaptarlo no es un problema.




Metaconta

Ya no soy programador de Delphi pero si hago cositas para no dejarlo atrás, en su ía me gustaba mucho.

[TUTORIAL] Arduino Delphi 10.2 y Puerto serie


Seguiré haciendo más tutoriales sobre ello, esta vez me falta lectura de entradas y salidas analógicas.

Gracias.


juanjnd

Como puedes simular varios delay y que el periodo no sea un inconveniente entre ellos.

Por ejemplo:
Encender luz 2 segundos, apagar a los 2 segundos
después, Encender ventilador por segundos y apagarlo,
por último encender humificador por dos segundos.

Con delay es muy simple, pero cuando realizo con millis los tiempos se cruzan,

Utilice esta sintaxis pero tengo problemas
void loop() {
    task1();
    task2();
    task3();
}

void  task1() {
    //{period}: Periodo de Tiempo en el cual se va a ejecutar esta tarea
    unsigned long period=200; //En Milisegundos

    static unsigned long previousMillis=0;

    if((millis()-previousMillis)>period){
        // ---------------------------------
        // TODO:
        // Codigo de la Tarea
        // ...
        // ---------------------------------
        previousMillis += period;
    } 
}

void  task2() {
    //{period}: Periodo de Tiempo en el cual se va a ejecutar esta tarea
    unsigned long period=500; //En Milisegundos

    static unsigned long previousMillis=0;

    if((millis()-previousMillis)>period){
        // ---------------------------------
        // TODO:
        // Codigo de la Tarea
        // ...
        // ---------------------------------
        previousMillis += period;
    } 
}

victorjam

#23
Jul 28, 2020, 09:28 pm Last Edit: Jul 28, 2020, 09:29 pm by victorjam
En tu código lo que planteas son tres tareas diferentes task1, task2 y task3 que se van a ejecutar "concurrentemente" y no es el efecto que buscas.

Tu secuencia es:

paso1: encender luz, 2000ms
paso2: apagar luz, 2000ms
paso3: encender ventilador, 2000ms
paso4: apagar el ventilador y encender el humificador, 2000ms
paso5: apagar el humificador.

Ya tenemos los pasos y la duración de cada uno de ellos, así que necesitamos una variable para controlar el paso y como el tiempo es igual para todas no necesitamos almacenarlo, por ejemplo en un array.

Así el código podría ser parecido a este:

Code: [Select]

unsigned long t;
int paso=1;

void setup() {
  paso=1;
 digitalWrite(pinLuz, HIGH);
}

void loop() {
  if ( millis()-t > 2000 ) {
  paso ++; // aumentamos el paso.
 switch ( paso ) {
  case 2:
  digitalWrite(pinLuz, LOW);
 break;
  case 3:
  digitalWrite(pinVentilador);
 break;
 case 4:
  digitalWrite(pinVentilador, LOW);
 digitalWrite(pinHumificador, HIGH);
 break;
  case 5:
  digitalWrite(pinHumificador, LOW);
 break;
  default:
  break;
 }
 t=millis();
 }
 


En la sección de DOCUMENTACION hice un tutorial llamado Una forma sencilla de realizar secuencias, en la que explico como se pueden hacer este tipo de secuencias, con libreria incluida.

PD. El código que postees metelo entre las etiquetas CODE, para que los demas podamos trabajar sobre el.

Mikms

Felicitarte  Victorjam, por la molestia de dejarnos a todos una ayuda a entender unas de las cosas complicadas de esto, y felicitarte más aún por el trabajo de explicarlo todo paso a paso y a nivel de que todo el mundo lo pueda llegar a entender, que eso ha tenido que llevar bastante tiempo. GRACIAS.

Go Up