Nodemcu freertos 学习之路 -- GPIO口控制LED灯开关

1.环境介绍

如果创建项目请看第2篇 led闪烁.  ESP8266实现开关功能。这里利用线程获取gpio的状态. 从而控制led灯 亮或灭

2.软件消抖

关于led灯的控制和GPIO口状态的读取 在第2篇中都有介绍了,这里主要处理软件消抖

软件消抖的原理是,当获取到按键按下的状态时。延迟20ms再获取一次状态,当第二次的状态同样为按下时。就判断为没有抖动了。即为按下状态。最后等待按键松开即可。

代码

void key_handler_task(void  *pvParameters){
key_init();
for(;;){
uint32_t bit;
if (GPIO_INPUT_GET(15) == 0x01){
vTaskDelay(20 / portTICK_RATE_MS);
if( GPIO_INPUT_GET(15) == 0x01){
led_toggle();
while( GPIO_INPUT_GET(15) == 0x01 );
}
}
vTaskDelay(100 / portTICK_RATE_MS);
}
vTaskDelete(NULL);
}

3.查看结果


查看到led of led on 同时LED灯跟据开关次数不停迁换


FreeRTOS是一个流行的实时操作系统,用于嵌入式系统的开发。在FreeRTOS中实现按键控制LED可以通过以下步骤实现: 1. 配置按键和LED引脚的GPIO。 2. 创建一个任务,用于检测按键是否按下。 3. 当检测到按键按下时,通过消息队列或信号量向LED控制任务发送消息。 4. 创建另一个任务,用于控制LED开关。 5. 当收到LED控制任务发送的消息时,控制LED开关状态。 以下是一个简单的示例代码: ``` // 配置按键和LED引脚的GPIO #define KEY_GPIO GPIOA #define KEY_PIN GPIO_Pin_0 #define LED_GPIO GPIOB #define LED_PIN GPIO_Pin_5 // 创建一个任务,用于检测按键是否按下 void key_task(void* pvParameters) { while (1) { if (GPIO_ReadInputDataBit(KEY_GPIO, KEY_PIN) == Bit_RESET) { // 当检测到按键按下时,通过消息队列或信号量向LED控制任务发送消息 xQueueSend(xQueue, "LED_ON", portMAX_DELAY); } vTaskDelay(10 / portTICK_RATE_MS); } } // 创建另一个任务,用于控制LED开关 void led_task(void* pvParameters) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = LED_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(LED_GPIO, &GPIO_InitStructure); char buf[10]; while (1) { // 等待接收LED控制任务发送的消息 if (xQueueReceive(xQueue, buf, portMAX_DELAY) == pdTRUE) { // 控制LED开关状态 if (strcmp(buf, "LED_ON") == 0) { GPIO_SetBits(LED_GPIO, LED_PIN); } else if (strcmp(buf, "LED_OFF") == 0) { GPIO_ResetBits(LED_GPIO, LED_PIN); } } } } int main(void) { xQueue = xQueueCreate(10, sizeof(char[10])); xTaskCreate(key_task, "key_task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); xTaskCreate(led_task, "led_task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); vTaskStartScheduler(); while (1); } ``` 在这个示例中,通过xQueueCreate函数创建一个消息队列,用于存储LED控制任务发送的消息。在key_task任务中检测按键是否按下,当检测到按键按下时,通过xQueueSend函数向LED控制任务发送消息。在led_task任务中等待接收消息,当收到消息时,通过GPIO_SetBits和GPIO_ResetBits函数控制LED开关状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值