Felix Maocho

Para quien le interese lo que a nosotros nos interesa

Arduino – Uso de la función condicional y simulación de fin del programa

esquema de programaPor Félix Maocho
6/1/2013

Objetivo de este post:

Ppresentar el Manual de Programación de Arduino. Aprender a utilizar la función “if” y los operadores condicionales. Profundizar en la estructura básica de los sketch o programas

Si no tienes ni idea de programación lineal, conviene que veas primero los post que escribí hace mucho tiempo sobre el tema, “Conceptos Básicos”, y “Esquemas de Programas”, en los que intento poner a un nivel de hombre de la calle los principios más profundos de la programación.

_________________

La gran mayoría de los programas obedecen al esquema mostrado en el comienzo del post y solo una minoría, los programas tipo menú principalmente, obedecen al segundo esquema posible, por lo que si llegamos a dominar este esquema seremos capaces de hacer muchísimas, pero muchísimas cosas, diferentes. El programa “Blink”, que vimos en el anterior post, es un  ejemplo de ese esquema de programas, que en este caso resuelve algo tan simple como hacer parpadear un LED, pero que en esencia seria igual para algo tan complicado, como mandar un hombre a la luna, aun que mu lógicamente, los mandatos a incluir serían millones.

Comienza este programa con una caja donde se ejecutan cosas al inicio del programa y una sola vez. Lógicamente esa caja coincide con lo que se ejecuta en el “void setup”, y continua con lo que es realmente el proceso, que se repetirá indefinidamente hasta que se que se cumple una condición, (ruta “si” del diamante), que da lugar a entrar en otros procesos que se realizan antes de finalizar una única vez para posteriormente finalizar el proceso.

La comunidad de Arduino llama a estos los programas “sketch”, (esquema).  Un sketch,  tiene una estructura  compuesta al menos de dos partes imprescindibles, la funcion “setup()” y la funcion “loop()”. En “setup()” se define fundamentalmente como van a funcionar los puertos de la placa, o sea, se define como funciona el hard en el que va a trabajar el programa, fundamentalmente si los puertos de la controladora, son puertos por donde se va a poder enviar energía, (OUTPUT)- o por el contrario, si por ellos se recibirá energía de fuera, (INPUT.) y la funcion “loop()” indica en que orden y bajo que criterios vamos a enviar o recibir energía de/a ese hardware, en cada uno de los ciclo que se ejecutan con este programa, pues la función loop,  (bucle), se ejecuta indefinidamente de forma cíclica. Así pues, mientras que la función de configuración se ejecuta al iniciarse el programa sólo una vez, y la función bucle contiene el código que se ejecutara repetidamente.

Según este patrón funciona el sketch “Blink” que hemos utilizado repetidas veces en otros post de Arduino. Nuevamente repetimos aquí su código.

programa

Como veres una parte del código se ha quedado en con fondo blanco, son los comentarios, muy útiles para la comprensión de lo que hace el programa para los humanos, pero que a efectos de programación, no tiene ninguna trascendencia. De hecho, al compilar el programa se omiten esas líneas y no pasan al procesador. La “void setup” la he puesto en color amarillo y en ella se define el hardware, en este caso solo se define el PIN llamado “led” como de salida, (OUTPUT). La “void loop” donde se define lo que se hará en cada vuelta que de el programa la he pintado con el fondo verde, en este caso manda poner en alto, (HIGH), el voltaje del PIN “led” (que definimos de salida), dejar pasar (delay) 1000 milisegundos, poner en bajo, (LOW), el voltaje del PIN “led”y mantenerlo así otros mil milisegundos.

Verán que fuera de estas dos instrucciones hay una tercera área que he pintado de crema, que es la zona donde hay que declarar todas las variables que se utilizarán en el programa indicando el tipo que tiene y eventualmente el valor inicial que las damos. En este caso definimos la variable “led” como un número entero con valor comprendido entre – 32.768 y + 32.768 , (que es lo que se puede escribir usando cuatro bits) que inicialmente damos el valor “13”

El esqueleto de un sketch de Arduino que podemos utilizar para cualquiera de nuestros programas es el siguiente:

/*
Título del programa
Breve descripción de su funcionamiento
*/

// arrea de definición de variables utilizadas en el proceso
// ponerlas un nombre relacionado con su uso y explicar para que se utiliza cada una de las variables
// lo correcto es utilizar el tipo de funcion que menos bits precise en función del tipo de uso que la vamos a dar

// La función setup  fundamentalmente definir los port de entrada y salida que utilizamos :
void setup() {
// mandatos de la funcion setup()
}

// La función loop se ejecuta una y otra vez para siempre.
void loop() {
// mandatos que se ejecutarán en un ciclo de programa
}

Si han probado este programa verán que funciona perfectamente, pero que tiene, lo que para mi es un defecto, no acaba nunca. Para que se pare, hay que desenchufar la tarjeta, quitando el cable USB o la pila que sirve de fuente de energía a la tarjeta y entiendo que esa no puede ser la forma que habitualmente utilicemos para finalizar un proceso, o el proceso llega su fin porque ha acabado el trabajo encomendado. o le damos algún tipo de señal para que acabe, por ejemplo con un interruptor, por tanto nos falta en este programa para que actúe normalmente una instrucción que el squetch del loop cuando por ejemplo ya haya dado 100 intermitencias.

Manual de Programación

Manual de Programacion de Arduino

He encontrado algo que creo que os debéis descargar , el Arduino programing notebook, de Brian Evans, un libro en PDF de introducción a la programación de sketchs para Arduino  gratuito y traducido al castellano que podemos bajar de Ardumanía con solo pinchar en la imagen igual a la que enseño.Cuando tengas un rato echarle un vistazo para ir conociendo que es lo que contiene y aprender a encontrar lo que buscáis con cierta facilidad.

Al menos debes conocer el indice de materias pàra que sepas donde buscar una instrucción que haga lo que quieres hacer.

Arduino_programing_notebook_ES03 1

Arduino_programing_notebook_ES03 1

Por ejemplo, hay en todos los lenguajes de programación de informática un mandato condicional que permite hacer cosas del tipo “Si ocurre tal cosa, haz esto”. Por ejemplo, “si hace sol , baja la persiana”. Estos mandatos se llaman generalmente “if” (si), vamos a buscar algo así en el Manual de Brian Evans. Allí en efecto encontramos el mandato “if” sobre el que dice en la página 21 lo siguiente, (traducido del lenguaje técnico a “roman paladino”):

if (si condicional)

if es un mandato que se utiliza para mirar si se produce una determinada condición,

como por ejemplo averiguar si una variable supera determinado valor.
Si se cumple la condición se ejecutan los mandatos que están dentro de las llaves.
En caso contrario se saltan esos mandatos.

El formato para if es el siguiente:

if (unavariable ?? valor)
{
ejecutaInstrucciones;
}

En el ejemplo anterior se compara según indica el símbolo  ”??” el valor de la variable  “unavariable” con “valor” que puede ser otra variable o una constante. Si la condición entre paréntesis se cumple, (es cierta), se ejecuta todo lo que este dentro de los corchetes. En caso contrario el programa salta sobre los mandatos.

El símbolo  puede ser cualquiera de los operadores condicionales que tiene la siguiente estructura:

  • x == y   // x es igual a y
  • x != y    // x no es igual a y
  • x < y     // x es menor que y
  • x > y     // x es mayor que y
  • x <= y  // x es menor o igual que y
  • x >= y  // x es mayor o igual que y

Observen que la comparación “igual” es doble igual “==”. La razón es que el simple igual “=” se utiliza para dar a una variable el valor de lo que tenga a la derecha. Por ejemplo si  “x” vale 6 e “y” vale 12

x = y      // indicaría que el valor de x pase de 6 a 12 pues ese es el valor de y (en este instante),

en cambio

x == y    // indicaría que compara x (valor 6) con y (valor 12)  que como son diferentes no se cumple la condición por lo que, los mandatos que hay entre corchetes se saltarían

Ejemplo

Vista la función “if” vamos a modificar  programa “Blink” creando otro programa parecido llamado “Blinlk2” en el que para que resalte lo más importante de los cambio en ROJO aunque se escribirán en la realidad en negro como todo el texto

Comenzamos preparando el circuito, Como sabemos ya , (sin lugar a dudas; que el PIN13 deja salir 5 voltios , montamos pues un minicircuito en la protoboard formado por una resistencia de 220 homios y en serie el LED saliendo del PIN13, (la pata larga hacia el PIN13 y la corta mirando a tierra)  y acabando en el PIN de tierra (CND). Tal como indica el esquema.

bilnk2_bb

Ahora os escribo el software del programa resaltando en ROJO lo que he cambiado del programa original

/*

Blink2
Enciende un LED on por un cuarto de segundo, luego lo apaga por 0,25  segundo, repetidamente.
Cuando haya parpadeado 10 veces pasara a quedarse encendido fijo un 0,25 minutos  para después
de una pequeña pausa de un segundo repetir todo el ciclo.
Este código es de dominio público.

*/

// Pin 13 tiene un LED conectado en la mayoría de las placas Arduino.
// Darle un nombre, basta con que sea un entero pequeño:
int led = 13;
// Necesitamos un contador de loops para saber cuando llevamos 10 parpadeos.
// Le llamamos “cont” y le inicializamos a cero
int cont = 0;

// La función setup se ejecuta una vez cuando arrancas el programa:
void setup() {
// inicializa el pin digital  led, (=13),  como de salida.
pinMode(led, OUTPUT);
}

// La función loop se ejecuta una y otra vez para siempre.
void loop() {
digitalWrite(led, HIGH);      // Enciende el LED (HIGH es nivel ALTO de voltaje)
delay(250);                            // Espera 0,25 segundos
digitalWrite(led, LOW);       // Apaga el LED poniendo el voltaje al nivel BAJO (LOW)
delay(250);                            // Espera 0,25 segundos
 cont = cont +1;                     // Sumamos 1 al contador de bucles
     // Si han pasado 10 vueltas (cont es igual a diez ) encendemos por 0,25 minutos el Led
     // luego lo apagamos 0,25 segundos
     if (cont ==10)
    {
         digitalWrite(led, HIGH);   // Enciende el LED (HIGH es nivel ALTO de voltaje)
         delay(15000);                     // Espera 0,25 minuto
         digitalWrite(led, LOW);    // Apaga el LED poniendo el voltaje al nivel BAJO (LOW)
         delay(250);                         // Espera 0,25 segundos
         cont = 0;                             // y volvemos a poner el contador “cont” a cero para otra serie de parpadeos rápidos
     }
}

Consideraciones sobre el programa

• Cambié los periodos de un segundo por periodos de 0,25 segundos para dar más agilidad al experimento.

• El uso de las expresiones matemáticas no tiene el mismos sentido que en la aritmética clásica. En aritmética clásica la expresión cont = cont +1 indicaría que hemos llegado en nuestro razonamiento a algo absurdo, nada puede ser simultáneamente igual a si mismo + 1, sin embargo en la programación se tiene en cuenta los ciclos del reloj interno del procesador y esto quiere decir que hablamos de dos ciclos de reloj diferente, en la primera  “cont” tiene un determinado valor mientras que en un ciclo posterior “cont” ha adquirido el valor que tenía antes más 1, de la misma forma que tu hoy tiene la edad que la edad que tenias hace un año más uno. Esta diferencia de criterio con las matemáticas clásicas hay que aceptarla para llegar a entender lo que hace el programa

• Si escribo    Tu edad = X  y   X = X+1  no tiene sentido , pero si escribo  X(2012) =X(2011) +1 adquiere su correcto sentido

•  Algo a tener en cuenta es el indentado del texto, en programación se abusa del indentado con el fin de resaltar todos los mandatos que quedan encuadrados en una misma acción, así todos los mandatos de Loop quedan indentados cuatro espacios pero los mandatos afectados solo por el mandato If  los indentamos otro cuatro espacios para que resalte cuales son.

• Por último resaltar que la función loop se ejecuta indefinidas veces pero eso no quiere decir que en cada pase del bucle haga lo mismo, pues al poder adquirir las variables que actúan en bucle, valores diferentes, lo efectuado afectado por esas variables, puede variar de un ciclo a otro, como ocurre en este caso que despues de nueve bucles iguales, (que parpadean), aparece uno que hace cosas diferentes, (que mantiene encendida la luz), esto es precisamente lo que da una terrible flexibilidad a los squetch.

• No hay que olvidar que cada línea de comandos acaba con “;”, que toda “{“ tiene que tener su pareja “}” y que en esta programación no se utilizan mayúsculas  “IF” o “If” no funciona, hay que poner “if” todos estos errores de sintaxis son detectados por el editor al mandar compilarlo pero los mensajes de error que devuelve la compilación con frecuencia nada tiene que ver con el error verdadero, sino que es lo que “deduce” el compilador al atascarse. Con frecuencia el error se ha producido varias líneas más arriba.

Vean un pequeño vídeo con la actuacion del programa:

Me falta por ultimo conseguir finalizar el proceso, pues no he encontrado, (aun), una funcion tipo end o stop que finalice la ejecución del programa, no obstante podemos hacer algo que asemeje que ha acabado el programa. Realmente no ha acabado el programa pues siguen ejecutandose loops indefinidameente, pero ya no se ejecuta ningun mandato, aparte del “if”, por lo que en la prtactica parece que el programa ha terminado.

Si eliminamos actualizar el contador y colocamos una función “if” en la parte superior de la función loop que permita que se ejecuten los mandatos cuando el contador “cont” sea menor que 10 pero a partir de que cont alcance el valor 10 pasara al final del loop y como allí no hay mandatos, aunque realmente el loop se siga ejecutando indefinidamente  el programa no hará nada. Este se un medio que , (de momento), podemos ejecutar cuando deseemos parar el proceso, colocar un IF que bajo la condición de fin le hace saltar todos los mandatos. Vean como quedaría el programa el programa con el cambio. Resalto en ROJO lo que he cambiado del programa anterior Blink2

/*

Blink3
Enciende un LED on por un cuarto de segundo, luego lo apaga por 0,25  segundo, repetidamente.
Cuando haya parpadeado 10 veces pasara a quedarse apagado definitivamente
Este código es de dominio público.

*/

// Pin 13 tiene un LED conectado en la mayoría de las placas Arduino.
// Darle un nombre, basta con que sea un entero pequeño:
int led = 13;
// Necesitamos un contador de loops para saber cuando llevamos 10 parpadeos.
// Le llamamos “cont” y le inicializamos a cero
int cont = 0;

// La función setup se ejecuta una vez cuando arrancas el programa:
void setup() {
// inicializa el pin digital  led, (=13),  como de salida.
pinMode(led, OUTPUT);
}

// La función loop se ejecuta una y otra vez para siempre.
void loop() {
// Solo se ejecutará las 10 primeras veces, Luego no hará nada
if (cont < 10) {
digitalWrite(led, HIGH);      // Enciende el LED (HIGH es nivel ALTO de voltaje)
delay(250);                            // Espera 0,25 segundos
digitalWrite(led, LOW);       // Apaga el LED poniendo el voltaje al nivel BAJO (LOW)
delay(250);                            // Espera 0,25 segundos
cont = cont +1;                     // Sumamos 1 al contador de bucles
    }
// He eliminado el mandato condicional if que había y todo su contenido
}

En este video pueden ver como funcionan este segundo programa

Observarán que utilizo un pequeño truco que es sujetar con una goma elástica el Arduino a la placa protoboard, con el fin de que permanezca suficientemente solidario y estable todo el circuito y los cables no se salgan.

Félix Maocho

Post Data

Arduino no solo hace feliz a quien lo posee, sino a toda su familia. Una de las cosas mas difíciles que existe en este mundo es encontrar “un detalle” para regalo de Reyes, o sea, un objeto que no llega por su presupuesto, a la categoría de regalo, pero que hace sentir al agraciado, que importa a los parientes y amigos más próximos. Cuando eres coleccionista de algo, no importa si de sellos, o de figuritas con forma de búho, se lo pones fácil a tus familiares, solo tiene que buscar una pieza dentro de su presupuesto para acrecentar tu colección, igual ocurre si tienes una actividad conocida, ya sea fumar o un hacer deporte, siempre es posible regalarte algo relacionado con tu actividad que no se te salga de presupuesto.

Lo malo es regalar algo, a quien aparentemente no tiene caprichos, y digo aparentemente, porque todos tenemos caprichos, pero otra cosa es que nuestro entorno nos los capte. Desde que dejé de fumar, yo he sido esa odiosa persona sin caprichos ni aficiones, con los que el tener “un detalle”, se transforma en una molesta obligación que te obliga peregrinar a por cien tiendas para al final saber que lo que regalas fa a ser poco apreciado.

Afortunadamente, Arduino les ha facilitado la vida, pues el mercado esta lleno de pequeños “gadgets” adecuados a cualquier presupuesto, desde el mas modesto, como puede ser regalar un LED, o un rollo de cable fino, a los de alto precio, como regalar una tarjeta de conexión por wifi, o un osciloscopio,  Regalos que además de ser de lo más variado, muchos de ellos tiene la virtud de ser acumulables, por lo que no nace falta estar al tanto en detalle de su afición para acertar, como los mencionados LEDs, o los interruptores, por lo que siempre serán bien recibidos.

Aprovechando mi nueva afición, mis parientes se han apresurado a explotar el filón y al multímetro que me regaló mi hijo , del que hablé en el post anterior, se han unido dos motores paso a paso y una carcasa de protección de Arduino que paso a mostrarles. De momento no se muy bien como funcionan los motores paso a paso pero no tengan la menor duda que en su momento recibirán noticia precisa de cómo lo hacen. En cuanto a la carcasa, su uso no genera mayor dificultad , pero y hay una dificultad inesperada que no se aun como solucionaré, dentro de la carcasa el botón de “reset” es inalcanzable. Calculo que haré un pequeño orificio encima de el para que sea alcanzable con un palillo o algo semejante. Ya tendrán tambien información sobre el “invento”

motores

carcasa

 

Todos los post de arduino apareceran en Robótica bajo el subepigrafe Arduino o bien pinchando en este banner

7 enero 2013 - Posted by | Robotica | , ,

15 comentarios »

  1. Hola. Estoy siguiendo este blog con mucho interés. Comenzé por el tema del Meccano y ahora con éste de Arduino.
    Me gustaría hacer una puntualización sobre el debatido pin nº 13. Yo no lo tengo tan claro. Hasta ahora las mediciones de voltaje que se han hecho han sido con el circuito abierto (la resistencia interna del polímetro cuando se usa como voltímetro es muy grande, para no interferir en la medida con el propio circuito) con lo cual, la corriente que circula es muy pequeña. Si es verdad que existe una resistencia en el pin nº 13 que hace caer la tensión, al ser esta corriente muy pequeña, también lo va a ser la caida de tensión en la referida resistencia y, por tanto, el voltaje que vamos a medir es prácticamente los cinco voltios iniciales. Por lo tanto, la prueba así hecha no es concluyente, hay que hacerla con un circuito externo conectado.
    Yo no tengo ahora mismo la tarjeta a mi disposición pues soy marino mercante y ahora estoy escribiendo desde mi barco. Pero me la ha comprado mi hermano en una tienda de La Coruña, CETRONIC. En febrero, iré de vacaciones y empezaré a experimentar. A falta de ella, hice la prueba de la caída de tensión con un simulador.
    Bueno, un saludo y espero vuestras opiniones.

    Comentario por susoneira | 19 enero 2013 | Responder

    • Me hace ilusión su comentario dos cosas: La primera es saber que tengo un lector que es marino mercante, que encuentra en mi blog una distracción para sus ratos de ocio encerrado en el buque, Con cierta frecuencia, las estadísticas me informan de personas que han entrado en mi blog desde puntos para mi sorprendentes, como lo puede ser Ghana, o Turquía, el saber que puedo tener “lectores Itinerantes”, aclara un poco lo que para mí era un misterio.

      Por otra parte me alegro tener un seguidor fiel de Meccano y Arduino, pues el peso del, (relativo), éxito de este blog, se lo lleva en primera instancia el huerto y en segundo lugar el área literaria, criticas de libros, hemeroteca y cosas parecidas, siendo la parte técnica, la cenicienta del blog. Me alegro saber que en estos temas para mi tan gratos, no soy un predicador en el desierto, pues aunque pocos tengo gente que me sigue en estos temas.

      Como dije no doy por cverrado el tema de si el PIN!3 emite 3’5 o 5 voltios porque no encuentro una respuesta clara en los tutoriales de Arduino, en unas, (los más), dan por sentado que produce 3,5 Volts y otros o no indican nada raro para ese PIN o dicen que produce 5 voltios como los demás. Debería haber elevado una consulta sobre el tema al Foro de Arduino, pero la verdad es que he andado muy atareado en estas navidades y se me ha pasado. Montaré el circuito que indica y mediré nuevamente el voltaje con el multímetro, Y ya kle contare. Le aconsejo que se suscriba a los comentarios de este post pos aquí sera donde escriba lo que encuentre

      Comentario por felixmaocho | 19 enero 2013 | Responder

  2. Gracias por la pronta respuesta. Seguiré atentamente los comentarios. Saludos.

    Comentario por susoneira | 19 enero 2013 | Responder

  3. Hola, me ha gustado mucho toda la informacion que he encontrado aqui.
    Estoy enfrascado en la construccion de una maquina con unos 100 I/O y voy a
    implementar arduino para su control.
    Seguro que con gente como tu aportando su conocimiento los demas aprenderemos
    a sacar el maximo rendimiento a nuestro arduino.

    Comentario por mentefractal | 3 marzo 2013 | Responder

  4. como hago para que el programa se repita consecutivamente

    Comentario por murasakibara | 27 junio 2014 | Responder

    • No entiendo bien tu pregunta. Todo lo que está dentro de la función “loop” se repite costantemeente sin que tu hagas nada, cuando llega al final de la función vuelve aa comenzar por la primera sentencia de “loop”

      Como la pregunt me la haces en un post que se llama “Arduino – Uso de la función condicional y simulación de fin del programa” silo que quieres es qe se repita una funcion condcional indefinidamente utiliza la función For con una condición de terminacion que nunca se cumpla con lo que habrás hecho un bucle inacabable por ejemplo
      for (int i=1; i >0 ; i++){
      println(x);
      delay(10);
      }
      Como inicializas i con valor 1 y eb cada vuelta sumas 1 a I y dices qu se x cumpla si I >0, la condicion se cumple en cualqqier circunstancia y repetirá y repetirá
      este bucle escribiendo en cada vuelta el número de vuelta que hace´

      Comentario por felixmaocho | 27 junio 2014 | Responder

    • Hola. Ten en cuenta que una variable int no tiene infinitos valores positivos posibles, ya que es un rango entre -32mil setecientos algo y +32mil setecientos algo, y cuando incrementas “indefinidamente” su valor en realidad llegas al máximo positivo y “retrocedes” al máximo negativo para seguir incrementando valores negativos hasta cero, continuando con valores positivos hasta 2 elevado a 15. Lamentablemente la comparación es verdadera solo si la variable es positiva, y ya que al llegar al límite superior se hará negativa, la condición será falsa, por tanto el ciclo acabará.
      Saludos.

      Comentario por mario | 12 diciembre 2014 | Responder

  5. Muy cierto y muy buena observación no podemos dejar que “cont” llegue a valer más de 32.768. Por tanto hay que incluir en la programación de loop otra condicional “if” para que cuando pase un determinado valor, como por ejemplo 32.000, le vuelva a poner un valor bajo, pero superior a 10 para que la luz continúe apagada Podemos dar el valor 11.
    Las instrucciones a añadir tendram este aspecto:
    if cont >32000
    {
    cont=10 :
    }

    Muchas gracias, cuando tenga un rato lo incluyo en el programa

    Comentario por felixmaocho | 12 diciembre 2014 | Responder

  6. hola que tal buenos dias, como le podria hacer agregue otro led (simulando que son valvulas) que entran y salen con un conteo de 5 veces que entre y salga pero como le puedo hacer para agregar otra mas solamente que esta al iniciar el ciclo se quede fija y al terminar el conteo de 5 se apague junto con las valvulas que entran y salen de antemano gracias.

    int ENTRADAVALVULA1 = 2;
    int SALIDAVALVULA2 = 3;

    int cont = 0;

    void setup() {

    pinMode(ENTRADAVALVULA1, OUTPUT);
    pinMode(SALIDAVALVULA2, OUTPUT);
    }

    void loop() {
    if (cont < 5) {
    digitalWrite(ENTRADAVALVULA1, HIGH);
    delay(1900);
    digitalWrite(ENTRADAVALVULA1, LOW);
    delay(1000);
    digitalWrite(SALIDAVALVULA2, HIGH);
    delay(1000);
    digitalWrite(SALIDAVALVULA2, LOW);
    delay(1000);

    cont = cont +1;
    }

    }

    Comentario por armando banda | 17 diciembre 2014 | Responder

    • A ver si he entendido la pregunta que me haces, emtiendo que quieres añadir un led más que se encienda antes de iniciar el ciclo de 5 veces que se encienden y apagan las otras dos y que acabado ese ciclo se apaga y permanece apagada hasta que se inicia un nuevo ciclo completo.

      Si es así, me lo pones demasiado fácil por lo que supongo que no he entendido lo que me querías preguntar. Contesto a lo que creo que preguntas.

      int ENTRADAVALVULA1 = 2;
      int SALIDAVALVULA2 = 3;
      int LEDINICIOCICLO = 4;

      int cont = 0;

      void setup() {

      pinMode(ENTRADAVALVULA1, OUTPUT);
      pinMode(SALIDAVALVULA2, OUTPUT);
      pinMode(LEDINICIOCICLO, OUTPUT);
      }

      void loop() {
      // Si cont = 0 encendemos el LED de inicio del ciclo antes de la funcion “if”
      if (cont = 0) {
      digitalWrite(LEDINICIOCICLO, HIGH);
      }
      // Iniciamos el conteo del ciclo de abrir y cerrar vallvulas que se repetira 5 veces
      if (cont < 5) {
      digitalWrite(ENTRADAVALVULA1, HIGH);
      delay(1900);
      digitalWrite(ENTRADAVALVULA1, LOW);
      delay(1000);
      digitalWrite(SALIDAVALVULA2, HIGH);
      delay(1000);
      digitalWrite(SALIDAVALVULA2, LOW);
      delay(1000);
      }
      //Fin de el ciclo
      // Apagamos el LED inicio del ciclo cuando cont = 5
      if (cont = 5) {
      digitalWrite(LEDINICIOCICLO, LOW)
      }
      cont = cont +1;
      /* Ahora si cont = 6 podemos optar por las siguientes continuaciones
      A) si queremos que se repita todo el proceso al cabo de un tiempo. Ponemos un delay del tiempo que queramos y nuevamente ponemos el contador a cero. por ejemplo
      if (cont = 6) {
      delay(1900);
      cont = 0
      }
      B) si queremos que no se repita nunca más el proceso y que todas las luces queden apagadas indefinidamente ponemos por ejemplo algo que no haga nada y que mantenga el valor de cont a 5, dará vueltas sin hacer nada en ningún punto salvo sumar uno al contador para volver a quedar a 5 algo más abajo
      if (cont = 6) {
      delay(1900);
      cont =5;
      }
      //fin de todo el loop
      }

      No se si es lo que querías pero espero al menos que haya quedado claro lo que intentaba decir. (Ojo, no lo he probado y mi experiencia me dice que seguro que tiene algún pequeño error que se me pasó por alto). Saludos

      Comentario por felixmaocho | 18 diciembre 2014 | Responder

      • estoy realizando un programa que prenda y apague un led pero no e podido detener el ciclo for. quiero que el led solo encienda y se apague 5 veces. mi programa lo apaga y lo encien indefinidamente. como prodria realizar este programa? espero que alguin me pueda ayudar

        Comentario por jovas | 5 septiembre 2015

      • El problema de Arduino es que la fución “loop” se repite como su nombre indica indefinidamente. Por tanto si quieres que un suceso se produzca solo cinco veces tienes que introducir en ·lop·algo que cuente el número de veces que se enciende y evite que se encienda despues de la quinta hacer los siguientes cosas:

        En la funcio “setup” añadir una sentencia que defina una variable entera con valor inicial “0” Por ejemplo algo como esto

        int contador = 0

        En la funció “loop” hay que escribir la parte que enciende el LED dentro de una funcion condicional del tipo “if” que se cumpla solo cuando el valor la variable anterior en nuestro caso de “contador” sea menor a que “6” Por ejemplo·

        if contador 5 }
        delay (2000);
        contador = 0 ;
        }

        Esto haría que después de una parada de dos minutos, volviera a encenderse por cinco veces. O al menos eso creo, pero puede que me haya confundido en algo porque no lo he probado.

        Saludos.

        Comentario por felixmaocho | 5 septiembre 2015

  7. hola, de donde puedo descargar algun libro que me explique sobre rfid de arduino? gracias!

    Comentario por agustin | 13 octubre 2015 | Responder

  8. saludos, quisiera saber como puedo usar el comando if (si es que es el correcto) para usarlo con un control remoto, específicamente para bajar y aumentar la intensidad de un LED. el punto es que cuando se deja apretado cualquier botón manda 2 codigos, uno que cambia dependiendo de que botón sea y lo emite una vez por pulsación y otro que siempre es el mismo, quisiera saber como lograr indicarle al arduino que cuando reciba el segundo código repita el primero que recibió (el segundo código es siempre el mismo, solo cambia el primero dependiendo que tecla presione) espero me haya logrado explicar 🙂 estoy usando este código

    //#include “global_def.h” // These don’t seem to work. They should.
    //#include “ms_remote_map.h” // These don’t seem to work. They should.
    #include

    //#define ms_remote_map.h

    //below mappings are for Microsoft Media Center Remote
    #define OK_POS1 0xFF6897
    #define OK_POS2 0xFF9867
    #define VOL_DWN_POS1 0xFFB04
    #define VOL_DWN_POS2 0xFF30CF
    #define VOL_UP_POS1 0xFF18E7
    #define VOL_UP_POS2 0xFF7A85
    #define MAX_BRIGHT 0xFF10EF
    #define SL_BD_RT 9600
    #define RET FFFFFFFF // el codigo que se repite

    #define RECV_PIN 11
    #define LED_PIN 5 // choose the pin for the LED

    byte ledState;
    IRrecv irrecv(RECV_PIN);
    decode_results results;
    boolean power_state = LOW;

    void setup(){
    Serial.begin(SL_BD_RT);
    irrecv.enableIRIn(); // Start the receiver
    pinMode(LED_PIN, OUTPUT); // declare LED as output
    }

    void loop() {
    if (irrecv.decode(&results)) { //If IR receive results are detected
    // Serial.println(results.value, HEX);
    switch (results.value) {

    //Power
    case OK_POS1:
    // Serial.println(“Power”);
    ledState = 125;
    digitalWrite(LED_PIN, LOW); // turn LED ON
    break;

    case OK_POS2:
    digitalWrite(LED_PIN, HIGH); // turn LED ON
    break;

    //Dim
    case VOL_DWN_POS1:
    ledState -= 10;
    if (ledState > 0){
    analogWrite(LED_PIN, ledState); // Dim LED
    }
    break;

    case VOL_DWN_POS2:
    ledState -= 10;
    if (ledState > 0){
    analogWrite(LED_PIN, ledState); // Dim LED
    }
    break;

    //Brighten
    case VOL_UP_POS1:
    if (ledState < MAX_BRIGHT){
    ledState += 10;
    }
    analogWrite(LED_PIN, ledState); // Brighten LED
    break;

    case VOL_UP_POS2:
    if (ledState < MAX_BRIGHT){
    ledState += 10;
    }
    analogWrite(LED_PIN, ledState); // Brighten LED
    break;
    //default:
    // Serial.println("");
    }

    delay(200); // 1/5 second delay for arbitrary clicks. Will implement debounce later.
    irrecv.resume(); // Receive the next value
    }
    }

    Comentario por El Alquimista Molnar | 30 noviembre 2015 | Responder


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: