Menú
Foros
Nuevos mensajes
Buscar en foros
Novedades
Nuevos mensajes
Nuevos recursos
Última actividad
Recursos
Últimas revisiones
Buscar recursos
Acceder
Registrarse
Novedades
Buscar
Buscar
Buscar sólo en títulos
De:
Nuevos mensajes
Buscar en foros
Menú
Acceder
Registrarse
Install the app
Instalar
Foros
Diseño digital
Microcontroladores y sistemas embebidos
Arduino y Raspberry Pi
Tutorial y proyectos con Arduino
JavaScript está desactivado. Para una mejor experiencia, por favor, activa JavaScript en el navegador antes de continuar.
Estás usando un navegador obsoleto. No se pueden mostrar este u otros sitios web correctamente.
Se debe actualizar o usar un
navegador alternativo
.
Responder al tema
Mensaje
[QUOTE="mecatrodatos, post: 1080038, member: 13417"] Arduino usa un pequeño micro-controlador, que ejecuta un programa a la vez, pero puede hacer tareas simultáneamente. Vamos a desear que Arduino realice programas perceptibles a nosotros (como en el caso, del parpadeo de un led), Mientras la placa Arduino está ejecutando un delay no se pueden, leer eventos ejemplo sensores. Recuerdas el código de Blink? [code] /* int led = 13; void setup() { pinMode(led, OUTPUT); } void loop() { digitalWrite(led, HIGH); delay(500); digitalWrite(led, LOW); delay(500); } [/code] [B]¿Por qué no al delay?[/B] A pesar de que es lo primero que aprendimos a programar con Arduino y es muy sencillo, resulta que congela el procesador por completo y no hará más tareas hasta pasado el delay. Cuando tenemos un código de varias líneas que contiene una instrucción delay para esperar a que pase un tiempo determinado nos encontramos que Arduino está inoperativo la mayor parte del tiempo y tiene que estar esperando el resto del tiempo sin capacidad de responder a ninguno de los eventos que suceden a su alrededor. Este ejemplo de Aduino se la pasa casi todo el tiempo en la función delay, Por ese motivo vamos controlar el tiempo que está encendido el LED sin recurrir a la función delay() . [code] /* Parpadeo sin delay() Enciende y apaga un LED conectado a un pin digital sin utilizar la función delay(). Esto significa que otro código se puede ejecutar al mismo tiempo sin ser interrumpido por el código que controla el parpadeo del LED Circuito: Un LED conectado entre el pin 13 y el pin GND. Nota: en muchos Arduinos hay un LED en la placa conectado al pin 13, por lo que no sería necesario un LED externo para este ejemplo.*/ // Las constantes no cambian. Las usamos aquí para establecer los números de los pines. int ledPin = 13; // el número del pin conectado al LED // variables que cambiarán de valor. int ledState = LOW; // ledState se usará para establecer el estado del LED long previousMillis = 0; // almacenará la última vez que el estado del LED //se actualizó // La siguiente variable es del tipo long porque el tiempo medido en // milisegundos supera rápidamente al número que puede ser almacenado en una // variable del tipo int long interval = 1000; // intervalo del parpadeo (en milisegundos) void setup() { // establece el pin digital como salida: pinMode(ledPin, OUTPUT); } void loop() { // Aquí es donde se consigna el código que debe ejecutarse // Se comprobará si es el momento de parpadear el LED, esto es, si la // diferencia entre el tiempo transcurrido y el tiempo en que parpadeó // por última vez el LED es mayor que el intervalo que establecimos en // la declaración de variables. unsigned long currentMillis = millis(); // Se toma el tiempo actual // se comprueba si el tiempo actual menos el tiempo en que el LED cambió // de estado por última vez es mayor que el intervalo. if (currentMillis - previousMillis > interval){ // Si se cumple la condición se guarda el nuevo tiempo // en el que el LED cambia de estado previousMillis = currentMillis; // Y ahora cambiamos de estado el LED, si está encendido a // apagado o viceversa. if (ledState == LOW) ledState = HIGH; else ledState = LOW; // Hacemos que el contenido de la variable llegue al LED digitalWrite(ledPin, ledState); } } [/code] Por defecto, Arduino utiliza el timer0 para las funciones de tiempo por el software báse: delay(), millis() y micros(). El timer1 lo utiliza la librería servo. Y el timer2 lo utiliza la función tone(). La función millis() nos devuelve el tiempo en milisegundos transcurridos desde que trabaja la placa Arduino con el programa actual. Esta función establece un unsigned long, es decir un número de 32 bits. Puesto que la función millis() cuenta milisegundos, la precisión es suficiente para la mayoría de los proyectos habituales. Si necesitamos más precisión recurriremos a la función micros (). Algunos dirán es un código demasiado complicado para una tarea tan sencilla de parpadeo de un LED. Es un código complejo, pero eficiente. Si deseas que tu placa de Arduino no se quede al hacer tareas. Aquí hay un código multitarea que nos abre el camino a la programación Orientada a Objetos [code]//No se requiere nada adicional para poder ejecutar este código en tu Arduino int ledPin1 = 13; // LED VERDE int ledState1 = HIGH; // Inicialmente está apagado unsigned long previousMillis1 = 0; //Sera el que almacene en que ms fue la última vez que se encendió o apago long OnTime1 = 300; //Tiempo que el led VERDE permanecerá encendido long OffTime1 = 800; // Tiempo que el led VERDE permanecerá apagado int ledPin2 = 14; // LED AZUL int ledState2 = HIGH; // Inicialmente está apagado unsigned long previousMillis2 = 0; //Sera el que diga en que ms fue la última vez que se encendio o apago long OnTime2 = 250; //Tiempo que el led AZUL permanecerá encendido long OffTime2 = 500; //Tiempo que el led AZUL permanecerá apagado void setup() { pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); } void loop() { //Revisa si es momento de apagar el LED unsigned long currentMillis = millis(); if((ledState1 == LOW) && (currentMillis - previousMillis1 >= OnTime1)) //Si el LED VERDE esta prendido y la última vez que se encendió fue hace más de 300 ms entonces vamos a apagarlo! { ledState1 = HIGH; // Cambia el valor de la variable para luego escribirla previousMillis1 = currentMillis; // "La última vez fue AHORA" digitalWrite(ledPin1, ledState1); // Hace efectivo el cambio en el LED } else if ((ledState1 == HIGH) && (currentMillis - previousMillis1 >= OffTime1)) { ledState1 = LOW; previousMillis1 = currentMillis; digitalWrite(ledPin1, ledState1); } if((ledState2 == HIGH) && (currentMillis - previousMillis2 >= OnTime2)) { ledState2 = LOW; previousMillis2 = currentMillis; digitalWrite(ledPin2, ledState2); } else if ((ledState2 == LOW) && (currentMillis - previousMillis2 >= OffTime2)) //Si el LED AZUL está apagado y la última vez que se apago fue hace más de 500 ms entonces vamos a prenderlo! { ledState2 = HIGH; // Cambia el valor de la variable para luego escribirla previousMillis2 = currentMillis; // "La última vez fue AHORA" digitalWrite(ledPin2, ledState2); // Hace efectivo el cambio en el LED } } [/code] [/QUOTE]
Verificación
Responder
Foros
Diseño digital
Microcontroladores y sistemas embebidos
Arduino y Raspberry Pi
Tutorial y proyectos con Arduino
Arriba