LEDs Serial - Flasheo

Hola buenas tardes, soy nuevo en ésto de arduino, tengo un problema con una parte de mi código.
Tengo arduino UNO, conectados 4 leds, mi proyecto es de hacerlos prender y apagar en diferente órden, todo bien, pero en un método que me piden no se como hacerlo por más que busque. Es uno llamado “Flash” que es para que los 4 LEDs se apaguen y se prendan medio segundo, pero sin parar. Espero me puedan ayudar, muchas gracias.
Adrián Félix

/*
  blinkSerial2.ino

  Este programa hace que el led de status del Arduino UNO o un led
  conectado entre el pin 13 y tierra, se encienda o apague
  controlado
  por comandos recibidos por el puerto serie
*/
#include <string.h>
int led [] = {10, 11, 12, 13};
/*const unsigned int PIN_LED = 13;
  const unsigned int PIN_LED2 = 12;
  const unsigned int PIN_LED3 = 11;
  const unsigned int PIN_LED4 = 10;*/
const unsigned int BAUD_RATE = 9600;

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(led[i], OUTPUT);
  }
  /*pinMode(PIN_LED, OUTPUT);
    pinMode(PIN_LED2, OUTPUT);
    pinMode(PIN_LED3, OUTPUT);
    pinMode(PIN_LED4, OUTPUT);*/
  // Establece la velocidad de transmisión del puerto serie al
  // valor BAUD_RATE
  Serial.begin(BAUD_RATE);
}

void loop() {
  char comando[6];

  // Si hay caracteres disponibles para lectura en el puerto serie
  if (Serial.available() > 0) {

    // Lee a lo mas 5 caracteres del puerto serie o hasta que se
    // presione la tecla Enter y los guarda en el arreglo
    // comando.
    int n = Serial.readBytesUntil('\n', comando, 5);

    // Todas las cadenas en C/C++ terminan en el carácter de fin
    // de cadena, ‘\n’.
    comando[n] = '\0';

    // Escribe el comando al puerto serie
    Serial.println(comando);

    // Si se lee el comando "on"
    if (!strcmp(comando, "on")) {
      // Enciende el led conectado al pin PIN_LED
      for (int y = 4; y >= 0; y--) {
        digitalWrite(led[y], HIGH);
      }

      // Escribe al puerto serie
      Serial.println("LEDs encendidos");
    }
    else
      // Si se lee el comando "off"
      if (!strcmp(comando, "off")) {
        // Apaga el led conectado al pin PIN_LED
        for (int y = 4; y >= 0; y--) {
          digitalWrite(led[y], LOW);
        }

        // Escribe al puerto serie
        Serial.println("LEDs apagados");

      } else
        // Si se lee el comando "ltr"
        if (!strcmp(comando, "ltr")) {

          for (int y = 4; y >= 0; y--) {
            delay(20);
            digitalWrite(led[y], LOW);
            delay(20);
          }
          for (int y = 3; y >= 0 && y <= 20; y--) {
            digitalWrite(led[y], HIGH);
            delay(500);
            digitalWrite(led[y], LOW);
            delay(500);

          }
          //"left-to-right”, produce un corrimiento de un LED de izquierda a derecha.
          Serial.println("LEDs left to rigth");

        } else
          // Si se lee el comando "rtl"
          if (!strcmp(comando, "rtl")) {
            while (1) {
              for (int y = 4; y >= 0; y--) {
                delay(20);
                digitalWrite(led[y], LOW);
                delay(20);
              }
              for (int y = 0; y < 4; y++)
              {
                digitalWrite(led[y], HIGH);
                delay(500);
                digitalWrite(led[y], LOW);
                delay(500);
              }
              //“right-to-left”, produce un corrimiento de un LED de derecha a izquierda.
              Serial.println("LEDs right to left");
              break;
            }
          } else 
          // Si se lee el comando "flash"
          if (!strcmp(comando, "flash")) {
            for (int n = 0; n < 4; n++) {
              digitalWrite(led[n], HIGH);
            }
            delay(1000); // Wait for 1000 millisecond(s)
            for (int n = 0; n < 4; n++) {
              digitalWrite(led[n], LOW);
            }
            delay(1000); // Wait for 1000 millisecond(s)
          }
          else {
            // Escribe al puerto serie
            Serial.print("Comando desconocido: ");
            Serial.println(comando);
          }
  }
}

Hola, Si no me he equivocado al comprender tu código, prueba a cambiar el if donde se detecta la lectura del comando “flash” por este otro.

// Si se lee el comando "flash"
          if (!strcmp(comando, "flash")) {         
            while (strcmp(comando, "offla")) {
              int b = Serial.readBytesUntil('\n', comando, 5);
              comando[b] = '\0';
              digitalWrite(10, HIGH);
              digitalWrite(l1, HIGH);
              digitalWrite(12, HIGH);
              digitalWrite(13, HIGH);
              delay(500);
              digitalWrite(10, LOW);
              digitalWrite(l1, LOW);
              digitalWrite(12, LOW);
              digitalWrite(13, LOW);
              delay(500);
            }
          }

Aver que pasa. Saludos.

Vaya si me funcionó!
Muchas gracias, solo una cosa más, el bucle es infinito, sabes que tengo que agregar para que cuando yo mande otro comando se interrumpa el ciclo (Por ejemplo: “on”, “off”, etc) ??
Creo que tengo que declarar que lea el Serial, pero no se como, buscaré, y si encuentro te aviso
Gracias aún así!!!

Ah ya entendí, el “offla” dentro del while es para detener el ciclo entonces. Disculpa, es que como puse antes, soy nuevo en esto, saludos
Ahora solo lo modificaré para que se detenga con cualquier palabra, saludos!

¿Has probado con el comando que yo defino?, y el bucle no es infinito:

while (strcmp(comando, "offla")) {
              int b = Serial.readBytesUntil('\n', comando, 5);
              comando[b] = '\0';

Cuando te esten parpadeando introduce el comando “offla”
Saludos.
PD: Has tardado menos en enterderlo que yo en escribir esto y te has adelantado con el utimo post, veo que has pillado correctamente mi código.

1 Like

Si me di cuenta, lo siento no me había percatado
Pero sabes que puedo poner para que se interrumpa si pongo los otros comandos?? Por ejemplo si están parpadeando, ahora pondré el comando “on” y termina el ciclo del flash y ahora el “on” está activo. Pero quiero que se interrumpa con cualquier otro comando.
Intenté algo así pero no me funcionó.
Aún así no te molestes si no quieres, aún así ya me ayudaste con el problema de arriba, gracias!!

 while (strcmp(comando, "on") || strcmp(comando, "off") || strcmp(comando, "ltr")) {
              int b = Serial.readBytesUntil('\n', comando, 5);
              comando[b] = '\0';

Ese codigo no funciona correctamente. solo puede hacer comparaciones con palabras recibidas de 5 caracteres, ni los if else te funcionan, por ejemplo para que esto:
"if (!strcmp(comando, “off”)) " funcione deberia decir: "if (!strcmp(comando, "off ")) " y mandar por el puerto serie los 5 caracteres "off ". Esto es debido a que comando es un array de 5 caracteres.
A ver si te comprendo, ¿que intentas hacer con la linea que dice… comando[n] = ‘\0’;?
Saludos.

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