es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué el programa en C se salta mi bucle if para programar raspberrypi?

Estoy intentando crear un programa en C que programe la Raspberry Pi para encender/apagar/parpadear el LED de un protoboard. Hay un botón en el protoboard que uso la función digitalRead para “presionarlo”. Idealmente, el programa debería funcionar de la siguiente manera: al presionar el botón una vez, el LED se encenderá. Al presionar de nuevo, se apagará la luz. Al presionar una vez más, parpadeará unas cuantas veces y se repetirá el ciclo. Sin embargo, cuando uso este programa, parece que los primeros 2 condicionales están siendo saltados. Y cuando presiono el botón, solo parpadea. ¿Alguien sabe por qué?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en la lógica del programa. Las primeras dos declaraciones if requieren que counter tenga un valor determinado y que se haya presionado el botón, pero como counter comienza en 1, esas condiciones no se cumplen en la primera iteración del bucle. En su lugar, se ejecuta la tercera declaración if, haciendo que el LED parpadee. Para solucionar el problema, puedes agregar una declaración delay(100) al final de cada iteración del bucle para darle tiempo al hardware de responder a las pulsaciones del botón. Además, puedes cambiar la primera declaración if para que verifique si counter es igual a 1 y el botón acaba de ser presionado (usando una variable de bandera). La segunda declaración if también puede ser cambiada para que verifique si counter es igual a 2 y el botón acaba de ser presionado. Aquí hay una versión actualizada del programa:

    int main (int argc, char **argv){
    
    wiringPiSetupGpio();
    int counter=1;
    pinMode(PIN_LED, OUTPUT);
    pinMode(PIN_BUTTON, INPUT);
    printf("Los pines LED y botón han sido configurados.\n");
    
    while (1)
    {   
        if ((counter==1) && digitalRead(PIN_BUTTON) && !button_pressed) {
            digitalWrite(PIN_LED, HIGH);
            counter++;
            button_pressed = 1;
        }
        if ((counter==2) && digitalRead(PIN_BUTTON) && !button_pressed){
            digitalWrite(PIN_LED, LOW);
            counter++;
            button_pressed = 1;
        }
        if ((counter==3) && digitalRead(PIN_BUTTON) && !button_pressed){
            digitalWrite(PIN_LED, HIGH);
            delay(500);
            digitalWrite(PIN_LED, LOW);
            delay(500);
            digitalWrite(PIN_LED, HIGH);
            delay(500);
            digitalWrite(PIN_LED, LOW);
            delay(500);
            digitalWrite(PIN_LED, HIGH);
            delay(500);
            digitalWrite(PIN_LED, LOW);
            delay(500);
            counter=1;
            button_pressed = 1;
        }
        delay(100);
        if (!digitalRead(PIN_BUTTON)){
            button_pressed = 0;
        }
    }
    

Comments are closed.