Módulo IoT Lora desde la entrada hasta la competencia (2) Bombilla LED intermitente y luz de respiración

Tabla de contenido

I. Introducción

2. Practica y codifica

        1. LED brillante eléctrico1

        2. Apagar LED1

        3. Voltear el nivel de LED

        4. LED1 y LED2 parpadean alternativamente

        5. Luz de respiración LED1

3. Código de programa


I. Introducción

        El contenido de este artículo pertenece al desarrollo del módulo Lora del New World Internet of Things. Utiliza la rutina básica dada de Lora y completa el desarrollo basado en ella, y puede proporcionar ideas para aprender otras versiones de Lora.

2. Practica y codifica

        1. LED brillante eléctrico1

        

        2. Apagar LED1

 

        3. Voltear el nivel de LED

        4. LED1 y LED2 parpadean alternativamente

        En el fichero led_light.c que nos proporciona se define el método de parpadeo:

#define HELF_SECOND 50
uint16_t helfSecondCnt = 0;
bool isLed1Lighted = true;
bool isHelfSecondLedBlinkEnable = false;
void blinkPerHelfSecond() {
    if (!isHelfSecondLedBlinkEnable)
        return;

    helfSecondCnt ++;
    if (helfSecondCnt > HELF_SECOND) {
        helfSecondCnt = 0;
        isLed1Lighted = !isLed1Lighted;
    }

    if (isLed1Lighted) {
        GpioWrite( &Led1, 0 );
        GpioWrite( &Led2, 1 );
    }
    else {
        GpioWrite( &Led1, 1 );
        GpioWrite( &Led2, 0 );
    }
}

void startLedBlink() {
    isHelfSecondLedBlinkEnable = true;
    GpioWrite( &Led1, 1 );
    GpioWrite( &Led2, 1 );
}

void stopLedBlink() {
    isHelfSecondLedBlinkEnable = false;
    GpioWrite( &Led1, 1 );
    GpioWrite( &Led2, 1 );
}

        A través del análisis de código anterior, podemos saber que si queremos habilitar el parpadeo, primero debemos llamar a la función startLedBlink(), y luego debemos seguir llamando a blinkPerHelfSecond() en la función principal para lograr el efecto de parpadeo.

        Se puede ver en el código que cuando se llama a la función blinkPerHelfSecond() 50 veces, el LED cambiará el nivel, por lo que solo necesitamos controlar el intervalo de llamada para completar el tiempo fijo de parpadeo.

        El código anterior logra el efecto de parpadeo alternativo cada 0,5 s llamando a la función blinkPerHelfSecond() cada 10 ms.

        5. Luz de respiración LED1

         También en led_light.c, también se define el método sobre la luz de respiración:

#define LED_ILLUMINATION_LEVEL 8
#define LED_LEVEL_TIMER				LED_ILLUMINATION_LEVEL/2
#define DEVIDE_VALUE 16

uint8_t levelCount = LED_ILLUMINATION_LEVEL;
uint8_t led_levet_timer = LED_LEVEL_TIMER;
uint8_t devideCount = DEVIDE_VALUE;
uint8_t level = 1;
uint8_t timeTic = 0;
bool isUprise = true;
bool isLed1BreathEnable = false;
bool isLed2BreathEnable = false;

void setBreathLedArg(uint8_t levelCnt, uint8_t levelUpDevide){
	levelCount = levelCnt;
	led_levet_timer = levelCount/2;
	devideCount = levelUpDevide;
}

void resetLedPwm() {
    timeTic = 0;
    if (isLed1BreathEnable)
        GpioWrite( &Led1, 0 );
    if (isLed2BreathEnable)
        GpioWrite( &Led2, 0 );
}

void pwmLevelUp() {
    static unsigned long led_level_tick = 0;
    led_level_tick++;
    if (led_level_tick > led_levet_timer) {
        led_level_tick = 0;
        if (isUprise)
            level++;
        else
            level--;
        if (level > levelCount) {
            level = levelCount;
            isUprise = false;
        } else if (level == 0) {
            isUprise = true;
        }
    }
}

void pwm() {
    timeTic++;
    if (timeTic > level) {
        if (isLed1BreathEnable)
            GpioWrite( &Led1, 1 );
        if (isLed2BreathEnable)
            GpioWrite( &Led2, 1 );
    }
    if (timeTic > levelCount) {
        resetLedPwm();
    }
}

uint8_t timeDevice = 0;
void breathLed() {
    timeDevice++;
    if (timeDevice >= devideCount) {
        timeDevice = 0;
        pwmLevelUp();
    }
    pwm();
}

void switchLed1Breath() {
    isLed1BreathEnable = !isLed1BreathEnable;
}

void switchLed2Breath() {
    isLed2BreathEnable = !isLed2BreathEnable;
}

void startLedBreath() {
    isLed1BreathEnable = true;
    isLed2BreathEnable = true;
    GpioWrite( &Led1, 1 );
    GpioWrite( &Led2, 1 );
}

void stopLedBreath() {
    isLed1BreathEnable = false;
    isLed2BreathEnable = false;
    GpioWrite( &Led1, 1 );
    GpioWrite( &Led2, 1 );
}

        De acuerdo con el código anterior, podemos ver que la función setBreathLedArg() se usa para la inicialización. El primer parámetro es la gradación del brillo, que se recomienda que sea 100, y el segundo es el número de llamadas para cambiar el nivel de brillo. , que se recomienda que sea 50. Luego use startLedBreath() para comenzar a respirar ligero, y luego simplemente llame a la función breathLed() todo el tiempo en el programa principal. La función switchLed1Breath se puede usar de manera similar a startLedBreath(), que puede activar de forma independiente la bandera de respiración de una determinada luz de respiración.

3. Código de programa

/**
 * Main application entry point.
 */
int main( void )//任务4
{
    Init();
		startLedBlink();
    while( 1 )
    {
			HAL_Delay(10);
			blinkPerHelfSecond();
    }
}

int main( void )//任务5
{
    Init();
		setBreathLedArg(100,50);
		switchLed1Breath();
    while( 1 )
    {
			breathLed();
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_39724355/article/details/131142399
Recomendado
Clasificación