Go Down

Topic: Switch Case y Millis (Read 296 times) previous topic - next topic

Ronald_Rosales

Jan 12, 2020, 08:13 am Last Edit: Jan 12, 2020, 05:28 pm by Ronald_Rosales
Este código lo hice como pude y a lo que estado aprendiendo con los tutoriales (links) que surbyte hizo el favor mandarme y orientarme en esto de los millis en Arduino. y agradesco mucho !!!

Voy al grano en este código en el primer case intento de alguna forma hacer que encienda y apague por lapsos de tiempo lo cual me funciono (a la forma que yo lo hice no se si este bien) , ahora al intentar que parpadee el led quise en una loca idea tratar de poner una función con millis dentro del case 1 (led papardee) que es donde con esa función hago que papadee un led pero no funciono esa idea, si alguien puede orientarme si lo que estoy haciendo esta bien o mejor ni me meto con el Switch Case.



Code: [Select]

const int PinLedRojo = 13;                         // Numero de Pin del Led guardado en la variable "PinLedRojo"
unsigned long TiemmpoActualMillis = millis();     // Tiempo Actual de millis se guardada en Actual Millis
int EstadoLedRojo = LOW;                          // Estado del Led                      
unsigned long TiempoAnteriorMillis = 0;          // Almacenará la última vez que se actualizó el Led
unsigned long intervaloEncendidoLed = 500;        // A los 500 se enciende el Led
unsigned long intervaloApagadoLed = 20000;        // Tiempo que dura el Led para apagarse

void setup() {
  pinMode(PinLedRojo, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  Luz();
}

void Luz(void)
{
  // Variables Locales
  static int Estado = 0;
  // Tiempo transcurrido en milisegundos
unsigned long TiemmpoActualMillis = millis();

  // Implementación del Diagrama de Estados
  switch (Estado)
  {
    case(0):  // Led Encendido
    // Salidas
    digitalWrite(PinLedRojo,EstadoLedRojo);
      // Condiciones
  if(millis() < intervaloEncendidoLed) { //Serial.println("EncenderLed");
     TiempoAnteriorMillis = millis();  
      if (EstadoLedRojo == LOW)
      EstadoLedRojo = HIGH;  
  }
  if(millis() >= intervaloApagadoLed) { //Serial.println("ApagarLed");
     TiempoAnteriorMillis = millis();  
      if (EstadoLedRojo == HIGH)
      EstadoLedRojo = LOW;  
    }
      break;

      case(1):  // Led Papadea minimo 3 a 5 veces
    // Salidas
    
    // Condiciones  
    
      break;

      case(2):  // Led Apagado
    // Salidas
    
    // Condiciones
    
      break;
  }
}




surbyte

Para comenzar en tu código los parametros de los case no se escriben entre paréntesis () sino solos indicando una constante.

Code: [Select]
case(0):

va como

Code: [Select]
case 0:

El código corregido

Code: [Select]
#include <Arduino.h>

const int PinLedRojo = 13;                         // Numero de Pin del Led guardado en la variable "PinLedRojo"
unsigned long TiemmpoActualMillis = millis();     // Tiempo Actual de millis se guardada en Actual Millis
int EstadoLedRojo = LOW;                          // Estado del Led                     
unsigned long TiempoAnteriorMillis  = 0;          // Almacenará la última vez que se actualizó el Led
unsigned long intervaloEncendidoLed = 500;        // A los 500 se enciende el Led
unsigned long intervaloApagadoLed   = 20000;        // Tiempo que dura el Led para apagarse

void setup() {
  pinMode(PinLedRojo, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  Luz();
}

void Luz(void) {
  // Variables Locales
  static int Estado = 0;
  // Tiempo transcurrido en milisegundos
  unsigned long TiemmpoActualMillis = millis();

  // Implementación del Diagrama de Estados
  switch (Estado)  {
    case 0: // Led Encendido
            // Salidas
            digitalWrite(PinLedRojo,EstadoLedRojo);
            // Condiciones
            if (millis() < intervaloEncendidoLed) { //Serial.println("EncenderLed");
                TiempoAnteriorMillis = millis(); 
                if (EstadoLedRojo == LOW)
                   EstadoLedRojo = HIGH; 
            }
            if (millis() >= intervaloApagadoLed) { //Serial.println("ApagarLed");
                TiempoAnteriorMillis = millis(); 
                if (EstadoLedRojo == HIGH)
                    EstadoLedRojo = LOW; 
            }
            break;

    case 1: // Led Papadea minimo 3 a 5 veces
            // Salidas

            // Condiciones 

            break;

    case 2:  // Led Apagado
             // Salidas
             // Condiciones
             break;
  }
}


Para hacer que parpadee el led debes armar una máquina de estados restringida a dicho case.
Ademas las condiciones de millis() no son como las has escrito sino debieran ser asi

Code: [Select]
if (millis() - TiempoAnteriorMillis < intervaloEncendidoLed)

Ronald_Rosales

#2
Jan 13, 2020, 06:24 am Last Edit: Jan 13, 2020, 09:37 am by Ronald_Rosales
Ok, entiendo pero tube un error cuando cambie lo que me dijiste:


Code: [Select]

if (millis() - TiempoAnteriorMillis < intervaloEncendidoLed)


Aqui en el código:

Code: [Select]

case 0: // Led Encendido
            // Salidas
            digitalWrite(PinLedRojo,EstadoLedRojo);
            // Condiciones
           if (millis() < intervaloEncendidoLed)
           //if (millis() - TiempoAnteriorMillis < intervaloEncendidoLed) { // ** Si funciona
                TiempoAnteriorMillis = millis();
                if (EstadoLedRojo == LOW)
                   EstadoLedRojo = HIGH;
            } .                                                      // ** Cuando pongo los dos  No funciona  
            if (millis() >= intervaloApagadoLed) {
           // if (millis() - TiempoAnteriorMillis >= intervaloApagadoLed) { <---  **No funciona
                TiempoAnteriorMillis = millis();
                if (EstadoLedRojo == HIGH)
                    EstadoLedRojo = LOW;
            }
            break;

    case 1: // Led Papadea minimo 3 a 5 veces
            // Salidas

            // Condiciones

            break;



Aqui me comentaste de una máquina de estados restringida, te refieres a que dentro del case poner un While ?


Code: [Select]

case 1: // Led Papadea minimo 3 a 5 veces
            // Salidas
            int x = 0;
                 do {
                  x++;
              } while (x < 0);
            // Condiciones

            break;





ElEspanol

#3
Jan 17, 2020, 11:10 pm Last Edit: Jan 17, 2020, 11:11 pm by ElEspanol
While es en este caso muy mal, porqué bloquea el Sketch mientras esta ejecutando el while.
While solamente usas, cuando sepas muy bien que haces.

Ronald_Rosales

Solo era un ejemplo de el while

Go Up