我对微控制器编程和一般编程相当陌生。我目前正在使用 Nucleo 开发板开发一个个人项目,但我很困惑接下来需要编写哪些代码才能获得我想要的功能。
这个想法是在开关打开时打开 LED,在开关关闭时关闭 LED,这就是我遇到困难的地方,每次再次打开开关时都会循环显示不同的颜色。
目前我无法获取切换到下一种颜色的模式。
所有 LED 均设置为 TIM3(红、绿、蓝)。
我的开关设置为下拉式。
这是我到目前为止所拥有的:
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3); // Red
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); // Green
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4); // Blue
int mode = 0;
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
// Check to see if the switch is pressed.
if (HAL_GPIO_ReadPin(Toggle_Switch_GPIO_Port, Toggle_Switch_Pin) == GPIO_PIN_SET) {
mode++;
if(mode == 1) {
// Red
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 230); // Red
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); // Green
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 0); // Blue
} else if (mode == 2) {
// Red
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 0); // Red
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 230); // Green
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 0); // Blue
}
} else {
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 0); // Red
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); // Green
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 0); // Blue
}
}
任何帮助或建议都会很棒!再说一次,我对此很陌生,所以如果我错过了需要提供的重要信息,请告诉我。谢谢!
您可能不希望颜色在循环中每次都发生变化(循环可能每秒执行数千次)。我假设按钮从“关闭”到“打开”的转换应该只改变一次颜色。
我还将假设您想在红色、绿色和蓝色之间循环。由于您似乎正在使用 PWM(和三个 LED),因此可以有更多颜色,但您没有告诉我们您真正需要什么。
所以你似乎想要某种状态机来跟踪按钮的状态以及你想要显示的颜色。像这样的东西(完全未经测试的伪代码):
// Track the current state of the button
enum button_state_e {
BUTTON_NOT_PRESSED,
BUTTON_JUST_PRESSED,
BUTTON_PRESSED
};
static enum button_state_e button_state = BUTTON_NOT_PRESSED;
// The colour to show next - 0 = red, 1 = green, 2 = blue, for example
static uint8_t button_colour;
while (1)
{
bool pressed = (HAL_GPIO_ReadPin(Toggle_Switch_GPIO_Port, Toggle_Switch_Pin) == GPIO_PIN_SET);
switch (button_state)
{
case BUTTON_NOT_PRESSED:
if (pressed)
button_state = BUTTON_JUST_PRESSED;
break;
case BUTTON_JUST_PRESSED:
if (pressed)
{
button_state = BUTTON_PRESSED;
switch_on_leds_for(button_colour);
button_colour = (button_colour + 1) % 3;
}
else
button_state = BUTTON_NOT_PRESSED;
break;
case BUTTON_PRESSED:
if (!pressed)
{
button_state = BUTTON_NOT_PRESSED;
switch_off_all_leds();
}
break;
}
ms_delay(10); // delay 10 ms to make debounce work
}
这实现了基本的去抖动功能,以防止按钮上的故障意外触发颜色变化。这就是为什么你想要循环延迟的原因。如果您仍然看到反弹,请增加延迟时间。
因为你只有三种颜色,所以你需要包裹你的
button_colour
,这样在2
之后它又回到0
,因此是模数。
我省略了一些功能,但你想要类似的功能:
void switch_off_all_leds(void)
{
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 0); // Red
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); // Green
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 0); // Blue
}
void switch_on_leds_for(int colour)
{
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, colour == 0 ? 230 : 0); // Red
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, colour == 1 ? 230 : 0); // Green
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, colour == 2 ? 230 : 0); // Blue
}