Funcion MILLIS con microservo y leds

Hola!

Tengo un problemilla y no se porque mi código no funciona.
Apenas llevo unos días con Arduino por lo que disculpenme si el error es muy evidente.

Esta es mi consulta:
Quiero encender y apagar un led de mantera intermitente cada 1 segundo de forma indefinida y controlar un servo con delays de manera que los delays no afecten a la temporizacion del led.

Es decir, que el led parpadée mientras se ejecuta el resto del código sin que los delays afecten a la intermitencia del led.

Este es el codigo:

#include <Servo.h>          //INCLUYE LIBRERIA CTRL SERVOS
Servo servo1;               
unsigned long tx=0;
unsigned long tiempo1;
int estadoL1=LOW;           //ESTADO INICIAL EN LOW PARA LED1

void setup() {
  
  pinMode (5, OUTPUT);      //DEFINE PIN 5 SALIDA LED1
  servo1.attach(8);         //DEFINE PIN 8 SERVO
}

void loop(){
  digitalWrite(5, estadoL1);
  tiempo1=millis();

  if (tiempo1-tx==150) {    //COMPROBACION TIEMPO
    tx=tiempo1;
    estadoL1=!estadoL1;     //CABIA ESTADO LED1 AL OPUESTO
}
  
	delay (1000);             //DELAY 1S
	servo1.write(90);        //POSICIONA SERVO A 90 GRADOS
delay (1000);             //DELAY 1S
	servo1.write(135);        //POSICIONA SERVO A 135 GRADOS
  
 }

Con este código el servo funciona (indefinidamente va rotando entre 90 y 135º), pero el led no hace nada.

Si modifico las cuatro últimas lineas añadiendo // delante para que las ignore, el led ya funciona pero como consecuencia el servo deja de hacerlo y no entiendo porque me pasa esto ni como hacer que ambas cosas funcionen.

¿Alguien me ayuda?
Muchas gracias.

Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>

Perdón, ya está editado correctamente. Me salió un mensaje de advertencia al publicar, pero no entendí lo que se me estaba diciendo. Me lo anoto para siguientes ocasiones. Gracias.

Lo que esta mal es esto

if (tiempo1-tx==150) {    //COMPROBACION TIEMPO
    tx=tiempo1;
    estadoL1=!estadoL1;     //CABIA ESTADO LED1 AL OPUESTO
}

reemplaza por esto.
Al ponerle = 150 solo funcionará la única que vez en la que enciendes el Arduino y trancurridos exactamente 150mseg pasa por ahi y cambie el estado y luego nunca mas se da la condición.

if (tiempo1-tx >=150UL) {    //COMPROBACION TIEMPO
    tx=tiempo1;
    estadoL1=!estadoL1;     //CABIA ESTADO LED1 AL OPUESTO
}

Genial, muchas gracias, ahora el led sí se enciende. Vamos avanzando.

Sin embargo los retardos que introduzco para el control del servo sí me afectan a la duración de los estados alto y bajo del led.

Quisiera que el led esté encendido 0,5 segundos y el mismo tiempo apagado y que repita esto indefinidamente y poder introducir retardos entre los movimientos del servo sin que ello afecte a los tiempos de encendido y apagado del led.

Así es como llevo el código ahora:

#include <Servo.h>          //INCLUYE LIBRERIA CTRL SERVOS
Servo servo1;               
unsigned long tx=0;
unsigned long tiempo1;
int estadoL1=LOW;           //ESTADO INICIAL EN LOW PARA LED1

void setup() {
  
  pinMode (5, OUTPUT);      //DEFINE PIN 5 SALIDA LED1
  servo1.attach(8);         //DEFINE PIN 8 SERVO
}

void loop(){
  digitalWrite (5, estadoL1);
  tiempo1=millis();

  if (tiempo1-tx >=500UL) {    //COMPROBACION TIEMPO
    tx=tiempo1;
    estadoL1=!estadoL1;     //CABIA ESTADO LED1 AL OPUESTO
}
  	delay (1000);             //DELAY 1S
	servo1.write(0);        //POSICIONA SERVO A 0 GRADOS
	delay (1500);             //DELAY 1,5S
	servo1.write(90);        //POSICIONA SERVO A 90 GRADOS
	delay (2000);             //DELAY 2S
	servo1.write(135);        //POSICIONA SERVO A 135 GRADOS
  
 }

Muchas gracias por la ayuda.

Es que si usas millis() no puedes usar delay(). Hay muchos hilos en este foro al respecto.
En documentación tenes dos temas para leer.. millis() que ya sabes usarlo o lo copiaste y pegaste porque mezclar millis() con delay() me hace dudar que lo entiendas.
Y lo otro que debes leer es máquina de estados.
Basicamente reemplaza delay() por millis() usando una máquina de estados.

Levo apenas unos días, apenas entiendo nada, todo se me hace confuso, pero creí entender que MILLIS servia para repetir un proceso cada cierto tiempo sin importar el resto del programa, es decir, contaba los milisegundos transcurridos desde el inicio y ejecutaba una accion por ejemplo cada 500 milisegundos. En mi caso encender un led y cambiar su estado a los 500ms indefinidamente.

Se que esto se me escapa por mis limitados conocimientos y es muy distinto a los PIC16F84A que se usaban en mi epoca estudiantil.

Gracias por tu ayuda, seguiré dandole vueltas a ver si descubro cómo hacerlo.

Un saludo!

No es muy distinto a los PIC.
En los PIC si pones un delay que frena el código ocurre lo mismo.
Ve a Documentación y lee sobre máquina de estados.
Busca en la lupa maquina de estados.
Yo mismo he hablado del tema en numerosos hilos y convertido códigos como el tuyo a máquina de estados.

EDITO: te dejo un ejemplo de conversión de código, bucando maquina de estados en la lupa

EDITO 2: En realidad en cualquier microcontrolador si pones un retardo haciendo nada, tendrás el mismo resultado que con delay() de arduino.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.