Las funciones:

     

    Una función es un bloque de código reutilizable diseñado para realizar una tarea específica. Las funciones permiten a los programadores escribir código modular, lo que significa que pueden dividir el código en partes más pequeñas y manejables. Cada función puede recibir entradas, realizar algún procesamiento y luego devolver un resultado.

    Las funciones pueden devolver varios tipos de resultados diferentes dependiendo del propósito de la misma. A continuación se desglosan los principales tipos de retorno que existen.

     Tipo

    Descripción 

     Void

    No retorna ningún valor pero puede ejecutar acciones como poner en alta un pin 

    int 

    Devuelve un valor de tipo entero de 2 bytes

    float Devuelve un valor de tipo decimal
    double Devuelve un valor de tipo decimal pero con más precisión que "float"
    long Devuelve un entero de 4 bytes
    unsigned int Devuelve un entero sin signo de 2 bytes
    unsigned long Devuelve un entero sin signo de 4 bytes
    byte Devuelve un byte
    bool  Devuelve un valor lógico, 0 o 1
    char Devuelve un carácter

    Además de los tipos vistos en la tabla de antes hay más tipos de funciones que pueden retornar otros tipos de variables o de datos de forma diferente.

    A la hora de crear una función, también se puede indicar que dicha función necesita recibir parámetros o valores de entrada para poder ejecutar la función. También se debe indicar de que tipo son estos parámetros. A continuación se muestran unos ejemplos de funciones:
    A continuación se muestra una función de tipo Void. como se vio anteriormente este tipo de
    función no devuelve ningún valor

    void parpadear_pin(){
      digitalWrite(PIN,HIGH);
      delay(300);
      digitalWrite(PIN,LOW);
    }

    Aunque sea una función que no devuelve ningún valor, sí que puede recibirlos, en el siguiente
    se ejecuta la misma función que en código de arriba pero seleccionando el pin.

    void parpadear_pin(int PIN){
      digitalWrite(PIN,HIGH);
      delay(300);
      digitalWrite(PIN,LOW);
    }
    A continuación se muestra una función de tipo int. Esta función devuelve un valor de tipo entero
    En este caso además va a recibir dos valores más, los cuales debe sumar.

    int sumar(int valor_a, int valor_b){
      int resultado;
      resultado = a + b;
      return resultado;
    }
    A continuación se pueden ver dos funciones, al igual que en el caso anterior, una función
    que se encarga de hacer una suma y otra que se encarga de hacer un producto. La idea es obtener
    el resultado de la suma del cuadrado de carada número.

    int product(int product_a, int product_b){
      int resultado;
      resultado = product_a * product_b;
      return resultado;
    }

    int sumar(int valor_a, int valor_b){
      int resultado;
      int a = product(valor_a, valor_a);
      int b = product(valor_b, valor_b);
      resultado = a + b;
      return resultado;
    }

    Como se puede ver, se puede llamar a una función desde dentro de otra

     

     

    El uso apropiado de funciones puede simplificar enormemente la programación y depuración de un código. También proporciona mejoras en el espacio requerido para almacenar un determinado código. Por estas razones siempre es recomendable trabajar con funciones en la medida de lo posible.

    La primera actividad para el uso de funciones consistirá en hacer encender el LED RGB de un color aleatorio cuando se pulse uno de los pulsadores.

    #define RGB_Rojo 9
    #define RGB_Verde 10
    #define RGB_Azul 11
    #define Pulsador 2

    void LED_RGB(){
      int red = random(0,255);
      int green = random(0,255);
      int blue = random(0,255);
      analogWrite(RGB_Rojo,red);
      analogWrite(RGB_Verde,green);
      analogWrite(RGB_Azul,blue);
    }

    void setup() {
      pinMode(Pulsador, INPUT);
      pinMode(RGB_Rojo, OUTPUT);
      pinMode(RGB_Verde, OUTPUT);
      pinMode(RGB_Azul, OUTPUT);
    }

    void loop() {
      if(digitalRead(Pulsador)==HIGH){
        while(digitalRead(Pulsador)==HIGH){}
        LED_RGB();
      }
    }

     

     

    La segunda actividad planteada consistirá en solicitar dos valores por monitor serial, dichos valores deben ser multiplicados. El resultado se devolverá por monitor serial.

    #include <Servo.h>
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>

    // Configuración de la pantalla LCD I2C
    LiquidCrystal_I2C lcd(0x27, 16, 2);  // Dirección I2C 0x27 para una pantalla LCD de 16x2

    // Pines
    const int potPin = A0;
    const int enterButtonPin = 2;
    const int clearButtonPin = 3;
    const int ledRedPin = 9;
    const int ledGreenPin = 10;
    const int ledBluePin = 11;
    const int servoPin = 6;

    Servo myServo;

    // Variables de estado
    bool isBoxOpen = false;          // Estado de la caja (cerrada por defecto)
    int enteredDigit = 0;            // Dígito introducido por el potenciómetro
    int enteredCode[4];              // Código introducido por el usuario
    int currentDigitIndex = 0;       // Índice del dígito actual
    const int correctCode[4] = {6, 6, 6, 6};  // Código correcto (por ejemplo, 1234)

    void setup() {

        Serial.begin(9600);
      // Inicializar pantalla LCD
        lcd.init();
        lcd.backlight();
        lcd.clear();

        // Configuración de pines
        pinMode(potPin, INPUT);
        pinMode(enterButtonPin, INPUT_PULLUP);
        pinMode(clearButtonPin, INPUT_PULLUP);

        pinMode(ledRedPin, OUTPUT);
        pinMode(ledGreenPin, OUTPUT);
        pinMode(ledBluePin, OUTPUT);
        myServo.attach(servoPin);

        // Inicializar LED y servo
        digitalWrite(ledRedPin, HIGH); // Encender LED rojo
        digitalWrite(ledGreenPin, LOW); // Apagar LED verde
        digitalWrite(ledBluePin, LOW); // Apagar LED azul
        myServo.write(0); // Mover el servo a la posición de bloqueo

        // Mostrar mensaje inicial en LCD
        lcd.setCursor(0, 0);
        lcd.print("Dial:");
        lcd.setCursor(0, 1);
        lcd.print("Code:");
    }

    void loop() {
        // Leer el valor del potenciómetro
        int potValue = analogRead(potPin);
        enteredDigit = map(potValue, 0, 1023, 0, 9);

        // Mostrar el dígito en la pantalla LCD
        lcd.setCursor(5, 0); // Colocar el cursor en la columna 5, fila 0
        lcd.print(enteredDigit);

        // Leer los estados de los pulsadores
        bool enterButtonState = digitalRead(enterButtonPin) == LOW;
        bool clearButtonState = digitalRead(clearButtonPin) == LOW;


        if (clearButtonState) {
        resetCode();
        updateLCD();
        delay(300); // Para evitar rebotes
        }


        // Introducir el dígito si se presiona el botón de introducir dígito
        if (enterButtonState && currentDigitIndex < 4) {
            enteredCode[currentDigitIndex] = enteredDigit;
            currentDigitIndex++;
            updateLCD();
            delay(300); // Esperar para evitar lecturas múltiples por rebote
        }

        // Verificar el código si se han introducido 4 dígitos
        if (currentDigitIndex == 4) {
            if (checkCode()) {
            openBox();
            } else {
            resetCode();
            updateLCD();
            }
        }

        // Esperar un poco antes de la siguiente lectura
        delay(100);
    }

    void resetCode() {
        currentDigitIndex = 0;
        for (int i = 0; i < 4; i++) {
            enteredCode[i] = 0;
        }
    }

    void updateLCD() {
        lcd.setCursor(5, 1); // Colocar el cursor en la columna 5, fila 1
        for (int i = 0; i < 4; i++) {
            if (i < currentDigitIndex) {
            lcd.print(enteredCode[i]);
            } else {
            lcd.print("_");
            }
        }
    }

    bool checkCode() {
        for (int i = 0; i < 4; i++) {
            if (enteredCode[i] != correctCode[i]) {
            return false;
            }
        }
        return true;
    }

    void openBox() {
        isBoxOpen = true;
        digitalWrite(ledRedPin, LOW);    // Apagar LED rojo
        digitalWrite(ledGreenPin, HIGH); // Encender LED verde
        digitalWrite(ledBluePin, LOW);   // Apagar LED azul
        myServo.write(90);  // Mover el servo a la posición de desbloqueo
    }

    void closeBox() {
        isBoxOpen = false;
        digitalWrite(ledRedPin, HIGH);   // Encender LED rojo
        digitalWrite(ledGreenPin, LOW);  // Apagar LED verde
        digitalWrite(ledBluePin, LOW);   // Apagar LED azul
        myServo.write(0);  // Mover el servo a la posición de bloqueo
    }
    Vistas
    1 Número de vistas
    1 Vistas de miembros
    0 Vistas públicas
    Acciones
    0 Gustos
    0 No me gusta
    0 Comentarios
    Compartir en redes sociales
    Compartir enlace
    Compartir por correo

    Por favor iniciar sesión para compartir esto webpage por correo.