Curso Completo Arduino – Lección 2 – millis()

Buenas,  bienvenidos a esta segunda clase del curso completo de Arduino impartido en  Ardugeek, esta semana os traigo un solo video tutorial, pero esta vez ya es todo más práctico.En esta clase vamos a empezar a entrar un poco en el mundo de la programación usando la funcion millis().  Por ello empezaremos a ver los diferentes tipos de variables. Como declararlas, iniciarlas, y asignarle diferentes valores. También vamos a ver cómo hacer operaciones matemáticas básicas (suma, resta, multiplicación y división) así como el operador de negación. Además para darle un sentido a estas variables vamos a ver las condicionales. Y por último y no menos importante, la función millis() . Esta función nos dá el número de milisegundos que han transcurrido desde el último reset.

Como veréis el resultado es similar al obtenido en la lección anterior, esto es exactamente lo que queremos. La gran diferencia entre delay() y millis() es que la primera no nos permitirá hacer nada, mientras que con la segunda forma podemos simular un trabajo en paralelo, es decir, que se realizen dos trabajos diferentes de forma aleatoria, por ejemplo el parpadeo de un led y la lectura de datos de un sensor (Los sensores los veremos en las lecciones 6 y 7).

Y por último tenemos el ejemplo creado en la lección 2.

Por supuesto también os animo a participar de forma activa en esta comunidad, de manera que si tiene alguna duda no dude en contactar conmigo:javier.arcenegui@ardugeek.es

Video

5 comentarios en “Curso Completo Arduino – Lección 2 – millis()

  1. buenas noches por favor podrías ayudarme, tengo un problema con la programación en millis estoy programando una alarma de un vehiculo con arduino y conexión bluetooth y necesito que al activar la alarma los motores se enciendan por un tiempo (100) mili segundos y después se apaguen pero el pin de la alarma de tiene que permanecer activado es por eso que no puedo usar un delay .
    por favor me ayudarías mucho y el tutorial que subiste es muy buenoy es el que más entendí.

    Gracias

    int PuertaIpin1 = 2; //motores de las puertas
    int PuertaIpin2 = 3;
    int PuertaDpin1 = 4;
    int PuertaDpin2 = 5;
    int Alarma = 6; //pin donde va conectada la sirena
    int Luces = 8 ;

    int datos = 0;

    void setup() {
    Serial.begin(9600);
    pinMode(PuertaIpin1, OUTPUT);
    pinMode(PuertaIpin2, OUTPUT);
    pinMode(PuertaDpin1, OUTPUT);
    pinMode(PuertaDpin2, OUTPUT);
    pinMode(Luces, OUTPUT);
    pinMode(Alarma, OUTPUT);
    pinMode(13,OUTPUT);
    }

    void loop()

    {
    if(Serial.available()>0)
    {
    datos = Serial.read();
    }
    if(datos==’L’) //cuando el modulo bluetooth reciba este comando se ejecute
    { este programa pero
    {
    digitalWrite(Alarma, HIGH); //estos tiene que permanecer
    digitalWrite(13, HIGH); encendidos todo el tiempo
    }
    { // on alarma
    digitalWrite(PuertaIpin1, HIGH); // mientras que esto tiene que ejecutarse
    digitalWrite(PuertaIpin2, LOW);
    digitalWrite(PuertaDpin1, HIGH);
    digitalWrite(PuertaDpin2, LOW);
    delay (100); //durante 100 milisegundos
    digitalWrite(PuertaIpin1, LOW); // después se apagan
    digitalWrite(PuertaIpin2, LOW);
    digitalWrite(PuertaDpin1, LOW);
    digitalWrite(PuertaDpin2, LOW);
    }
    }
    if(datos==’R’) //al recibir este comando se apaga todo
    { // off alarma
    digitalWrite(PuertaIpin1, LOW);
    digitalWrite(PuertaIpin2, HIGH);
    digitalWrite(PuertaDpin1, LOW);
    digitalWrite(PuertaDpin2, HIGH);
    delayMicroseconds (5000);
    digitalWrite(PuertaIpin1, LOW);
    digitalWrite(PuertaIpin2, LOW);
    digitalWrite(PuertaDpin1, LOW);
    digitalWrite(PuertaDpin2, LOW);
    digitalWrite(13,LOW);
    digitalWrite(Alarma,LOW);
    }

    1. Buenas, creo que no hace falta millis(), tal como lo tienes planteado, si la sirena se enciende con un pin a nivel alto, entonces no debes de tener problema con el código, durante toda la ejecución del código salvo que indiques lo contrario, una salida a nivel alto se debe mantener siempre a nivel alto. Por otro lado veo algunas llaves que no tienen sentido como los que definen el encendido de la alarma.

      /*
      buenas noches por favor podrías ayudarme, tengo un problema con la programación en millis estoy programando una alarma de un vehiculo con arduino y conexión bluetooth y necesito que al activar la alarma los motores se enciendan por un tiempo (100) mili segundos y después se apaguen pero el pin de la alarma de tiene que permanecer activado es por eso que no puedo usar un delay .
      por favor me ayudarías mucho y el tutorial que subiste es muy bueno y es el que más entendí.

      Gracias
      */
      int PuertaIpin1 = 2; //motores de las puertas
      int PuertaIpin2 = 3;
      int PuertaDpin1 = 4;
      int PuertaDpin2 = 5;
      int Alarma = 6; //pin donde va conectada la sirena
      int Luces = 8 ;

      int datos = 0;

      void setup() {
      Serial.begin(9600);
      pinMode(PuertaIpin1, OUTPUT);
      pinMode(PuertaIpin2, OUTPUT);
      pinMode(PuertaDpin1, OUTPUT);
      pinMode(PuertaDpin2, OUTPUT);
      pinMode(Luces, OUTPUT);
      pinMode(Alarma, OUTPUT);
      pinMode(13, OUTPUT);
      }

      void loop() {
      if (Serial.available() > 0)
      {
      datos = Serial.read();
      }
      if (datos == 'L') //cuando el modulo bluetooth reciba este comando se ejecute este programa pero
      {
      digitalWrite(Alarma, HIGH); //estos tiene que permanecer
      digitalWrite(13, HIGH); //encendidos todo el tiempo

      digitalWrite(PuertaIpin1, HIGH); // mientras que esto tiene que ejecutarse
      digitalWrite(PuertaIpin2, LOW);
      digitalWrite(PuertaDpin1, HIGH);
      digitalWrite(PuertaDpin2, LOW);
      delay (100); //durante 100 milisegundos
      digitalWrite(PuertaIpin1, LOW); // después se apagan
      digitalWrite(PuertaIpin2, LOW);
      digitalWrite(PuertaDpin1, LOW);
      digitalWrite(PuertaDpin2, LOW);

      }
      if (datos == 'R') //al recibir este comando se apaga todo
      { // off alarma
      digitalWrite(PuertaIpin1, LOW);
      digitalWrite(PuertaIpin2, HIGH);
      digitalWrite(PuertaDpin1, LOW);
      digitalWrite(PuertaDpin2, HIGH);
      delayMicroseconds (5000);
      digitalWrite(PuertaIpin1, LOW);
      digitalWrite(PuertaIpin2, LOW);
      digitalWrite(PuertaDpin1, LOW);
      digitalWrite(PuertaDpin2, LOW);
      digitalWrite(13, LOW);
      digitalWrite(Alarma, LOW);
      }
      }

      Sin esas comillas debe quedar así. No se si he entendido bien la pregunta o si lo que quieres es hacer otra cosa. Con este código lo que haces es que al recibir ‘L’ enciendes la alarma y enciendes los motores en una dirección por 100ms (la alarma quedará encendida) y al recibir ‘R’ enciendes los motores en la direccion opuesta por 5ms y apagas la alarma.

      Si ese no es el funcionamiento que le quieres dar te ruego que me lo vuelvas a explicar.

      Muchas gracias por seguir mi curso, y disculpa por tardar en contestar, últimamente ando con muy poco tiempo libre.

  2. saludos javier necesito por favor que me ayudes con un peque;o codigo estoy siguiendo tu curso y me parece muy interesante el codigo es el siguiente.

    si envio por ejemplo una A necesito que me encienda el led 7 junto con el led 6 pero el led 6 solo dures 5 segundo encendido y luego este se apague y no encienda hasta que se le de la misma orden.

    Gracias de antemano.

    Saludos desde Rep. Dominicana

  3. hola, tengo un caso en el que quiero que despues de mandar una letra por bluetooth funcione un motor por 10 segundos y luego se detenga, parase sencillo pero no he podido hacerlo. por ahora solo e logrado encender los motores, hacerlo girar a la inversa pero sin que paren… y agrege un bucle para que lo haga e los dos sentidos… este es mi codigo odrias ayudarme?… tiene una libreria de una placa shield

    #include
    AF_DCMotor motor1(1);
    AF_DCMotor motor2(2);
    AF_DCMotor motor3(3);
    AF_DCMotor motor4(4);

    int estado=0;
    void setup()
    {
    Serial.begin(9600);
    motor1.setSpeed(250); //Velocidad estándar de 250, máxima velocidad posible 255
    motor2.setSpeed(250);
    motor3.setSpeed(250);
    motor4.setSpeed(250);
    }

    //void pausal(){
    //motor1.run(RELEASE);
    //if(estado==’2′)
    // {
    // pausal();
    //}
    //else
    //{
    // loop();
    // }
    //}
    void loop(){
    if(Serial.available()>0){
    estado = Serial.read();
    }
    delay(2000);
    if (estado ==’1′){
    motor1.run(FORWARD);
    delay(2000);
    motor1.run(RELEASE);
    delay(2000);
    motor1.run(BACKWARD);
    delay(2000);
    motor1.run(RELEASE);
    delay(2000);
    }
    if(estado==’2′){
    motor1.run(FORWARD);
    }
    if (estado ==’3′){
    motor1.run(BACKWARD);
    }
    if(estado==’4′){
    motor1.run(RELEASE);
    }
    }

  4. error… el codigo anterior apenas estoy modificandolo para ver si puedo hacerlo con pausa… el siguiente es elque hace lo que le mensione

    #include
    AF_DCMotor motor1(1);
    AF_DCMotor motor2(2);
    AF_DCMotor motor3(3);
    AF_DCMotor motor4(4);

    int estado=0;
    void setup()
    {
    Serial.begin(9600);
    motor1.setSpeed(250); //Velocidad estándar de 250, máxima velocidad posible 255
    motor2.setSpeed(250);
    motor3.setSpeed(250);
    motor4.setSpeed(250);
    }

    void loop(){
    if(Serial.available()>0){
    estado = Serial.read();
    }
    if (estado ==’1′){
    motor1.run(FORWARD);
    delay(2000);
    motor1.run(RELEASE);
    delay(2000);
    motor1.run(BACKWARD);
    delay(2000);
    motor1.run(RELEASE);
    delay(2000);
    }
    if(estado==’2′){
    motor1.run(FORWARD);
    }
    if (estado ==’3′){
    motor1.run(BACKWARD);
    }
    if(estado==’4′){
    motor1.run(RELEASE);
    }
    if(estado ==’5′){
    motor2.run(FORWARD);
    delay(2000);
    motor2.run(RELEASE);
    delay(2000);
    motor2.run(BACKWARD);
    delay(2000);
    motor2.run(RELEASE);
    delay(2000);
    }
    if(estado==’6′){
    motor2.run(FORWARD);
    }
    if(estado ==’7′){
    motor2.run(BACKWARD);
    }
    if(estado==’8′){
    motor2.run(RELEASE);
    }
    if(estado ==’9′){
    motor3.run(FORWARD);
    delay(2000);
    motor3.run(RELEASE);
    delay(2000);
    motor3.run(BACKWARD);
    delay(2000);
    motor3.run(RELEASE);
    delay(2000);
    }
    if(estado==’a’){
    motor3.run(FORWARD);
    }
    if(estado==’b’){
    motor3.run(BACKWARD);
    }
    if(estado==’c’){
    motor3.run(RELEASE);
    }
    if(estado==’d’){
    motor4.run(FORWARD);
    delay(2000);
    motor4.run(RELEASE);
    delay(2000);
    motor4.run(BACKWARD);
    delay(2000);
    motor4.run(RELEASE);
    delay(2000);
    }
    if(estado==’e’){
    motor4.run(FORWARD);
    }
    if(estado ==’f’){
    motor4.run(BACKWARD);
    }
    if(estado==’g’){
    motor4.run(RELEASE);
    }
    if(estado==’t’){
    motor1.run(FORWARD);
    motor2.run(FORWARD);
    motor3.run(FORWARD);
    motor4.run(FORWARD);
    delay(2000);
    motor1.run(RELEASE);
    motor2.run(RELEASE);
    motor3.run(RELEASE);
    motor4.run(RELEASE);
    delay(2000);
    motor1.run(BACKWARD);
    motor2.run(BACKWARD);
    motor3.run(BACKWARD);
    motor4.run(BACKWARD);
    delay(2000);
    motor1.run(RELEASE);
    motor2.run(RELEASE);
    motor3.run(RELEASE);
    motor4.run(RELEASE);
    delay(2000);

    }
    if(estado==’u’){
    motor1.run(RELEASE);
    motor2.run(RELEASE);
    motor3.run(RELEASE);
    motor4.run(RELEASE);
    }
    }

Deja un comentario

Tu dirección de correo electrónico no será publicada.