Elabore um projeto com a placa NUCLEO-G474RE que:
5. Dois botões B1 e B2 ligados em pull-up e pull-down externos respectivamente são usados para variar o brilho de um led. Enquanto B1 estiver pressionado, o brilho do led aumenta. Enquanto B2 estiver pressionado, o brilho do led diminui.

Passo 1

Primeiro, vamos entender o que você precisa fazer. O exercício pede para criar um projeto usando a placa NUCLEO-G474RE que controla o brilho de um LED usando dois botões, B1 e B2. Enquanto o botão B1 estiver pressionado, o brilho do LED deve aumentar, e enquanto o botão B2 estiver pressionado, o brilho deve diminuir. Para resolver isso, vamos precisar entender conceitos de programação de microcontroladores, especificamente usando PWM (Modulação por Largura de Pulso) para controlar o brilho do LED e como ler o estado dos botões.

Passo 2

Vamos começar configurando o hardware. Na placa NUCLEO-G474RE, conecte o LED a um pino que suporte PWM, por exemplo, o pino PA5. Certifique-se também de conectar o botão B1 com um resistor de pull-up externo e o botão B2 com um resistor de pull-down externo. Isso garante que os botões tenham estados definidos (alto ou baixo) quando não estiverem pressionados.

Passo 3

Agora, vamos configurar o PWM no microcontrolador. O PWM permite controlar a intensidade do LED ajustando a largura dos pulsos de energia que chegam a ele. No código, você vai inicializar o timer que gera o sinal PWM e configurar a frequência e a resolu��ão adequada. Por exemplo:
TIM_HandleTypeDef htim2;

void MX_TIM2_Init(void) {
    // Configurações do timer para PWM
}

Passo 4

Em seguida, vamos configurar os pinos dos botões como entradas digitais. O botão B1 estará conectado com um resistor de pull-up, então seu estado padrão será alto (1) e baixo (0) quando pressionado. O botão B2, com resistor de pull-down, terá estado baixo (0) por padrão e alto (1) quando pressionado. Isso ajuda a evitar leituras flutuantes.
GPIO_InitTypeDef GPIO_InitStruct = {0};

// Configurar B1 como entrada com pull-up
GPIO_InitStruct.Pin = GPIO_PIN_X; // Substitua X pelo pino correto
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOX, &GPIO_InitStruct);

// Configurar B2 como entrada com pull-down
GPIO_InitStruct.Pin = GPIO_PIN_Y; // Substitua Y pelo pino correto
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOY, &GPIO_InitStruct);

Passo 5

Agora, vamos ao coração do projeto: o loop principal onde vamos ler os estados dos botões e ajustar o brilho do LED. Usaremos o PWM para alterar o ciclo de trabalho, que determina o brilho do LED. Se B1 estiver pressionado, aumentamos o brilho incrementando o ciclo de trabalho até um máximo de 100%. Se B2 estiver pressionado, diminuímos o brilho decrementando o ciclo de trabalho até 0%.
uint32_t pwmCycle = 0;

while (1) {
    if (HAL_GPIO_ReadPin(GPIOX, GPIO_PIN_X) == GPIO_PIN_RESET) { // B1 pressionado
        if (pwmCycle < 100) {
            pwmCycle += 10; // Aumenta o brilho
            __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwmCycle);
            HAL_Delay(100); // Pequena pausa para não alterar muito rápido
        }
    }
    if (HAL_GPIO_ReadPin(GPIOY, GPIO_PIN_Y) == GPIO_PIN_SET) { // B2 pressionado
        if (pwmCycle > 0) {
            pwmCycle -= 10; // Diminui o brilho
            __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwmCycle);
            HAL_Delay(100); // Pequena pausa para não alterar muito rápido
        }
    }
}

Resposta

Com esses passos, você terá um projeto na placa NUCLEO-G474RE onde dois botões controlam o brilho de um LED. O botão B1 aumenta o brilho enquanto estiver pressionado, e o botão B2 diminui o brilho. Isso é feito usando PWM para ajustar a intensidade do LED e lendo os estados dos botões para determinar quando aumentar ou diminuir o brilho.

Exercícios relacionados