# 3.学会使用按键-GPIO输入 你好,我是爱吃鱼香ROS的小鱼。上一节完成了LED灯的控制,本节我们学习下如何使用按键。 ## 一、 按键检测原理 ![image-20221219032725959](3.%E5%AD%A6%E4%BC%9A%E4%BD%BF%E7%94%A8%E6%8C%89%E9%94%AE-GPIO%E8%BE%93%E5%85%A5/imgs/image-20221219032725959.png) 上面的原理图就是我们MicroROS开发板的BOOT按键的原理图,该按键的位置在板子的左下角。 ![image-20221219032833035](3.%E5%AD%A6%E4%BC%9A%E4%BD%BF%E7%94%A8%E6%8C%89%E9%94%AE-GPIO%E8%BE%93%E5%85%A5/imgs/image-20221219032833035.png) 简单的看下原理图可知 - 当`BOOT`按下时,1,2就被联通了,此时`ESP_IO2`就连接到了`GND`上,也就是连接到`GND`,`ESP_IO2`的电平被拉低了。 - 当`BOOT`没有按下时,`ESP_IO0`通过`R10`连接到了`3.3V`,`ESP_IO2`引脚上的电压就被拉高了。 ## 二、 使用按键控制LED灯(按着开松开关) 新建`example03_key`工程,在`main.cpp`输入代码。 ```c++ /** * @file main.cpp * @author fishros@foxmail.com * @brief 使用按键控制LED灯,按着开,松开关 * @version 0.1 * @date 2022-12-19 * * @copyright Copyright (c) 2022 * */ #include void setup() { Serial.begin(115200); pinMode(0, INPUT); // 设置2号引脚模式为OUTPUT模式 pinMode(2, OUTPUT); // 设置2号引脚模式为OUTPUT模式 } void loop() { if (digitalRead(0) == LOW) { Serial.println("LED ON"); digitalWrite(2, LOW); // 低电平,打开LED灯 } else { Serial.println("LED OFF"); digitalWrite(2, HIGH); // 高电平,关闭LED灯 } } ``` 接着将代码编译烧录到开发板上,按下按键,查看LED灯。 ## 三、使用按键控制LED(自锁开关) 所谓自锁,就是按下开,再按一下关,看一下代码实现 ```c++ /** * @file main.cpp * @author fishros@foxmail.com * @brief 使用按键控制LED灯,按着开,松开关,自锁开关 * @version 0.1 * @date 2022-12-19 * * @copyright Copyright (c) 2022 * */ #include bool status = false; void setup() { Serial.begin(115200); pinMode(0, INPUT); // 设置2号引脚模式为OUTPUT模式 pinMode(2, OUTPUT); // 设置2号引脚模式为OUTPUT模式 } void loop() { // 自锁开关 if (digitalRead(0) == LOW) { delay(50); // 休眠50ms再次判断,防止误触 if (digitalRead(0) == LOW) { status = !status; while (digitalRead(0) == LOW) // 死循环等待放开按键 ; } } if (status == true) { digitalWrite(2, LOW); // 低电平,打开LED灯 } else { digitalWrite(2, HIGH); // 低电平,打开LED灯 } /* // 按着开,松开关 if (digitalRead(0) == LOW) { Serial.println("LED ON"); digitalWrite(2, LOW); // 低电平,打开LED灯 } else { Serial.println("LED OFF"); digitalWrite(2, HIGH); // 高电平,关闭LED灯 } */ } ``` 这里稍微复杂一些,当按键按下时我们需要休眠50ms,防止误触,接着反置状态,等待按键松开。 将代码下载到开发板,按下按键,测试一下。 ## 四、总结 本节我们通过学习按键的使用,掌握了GPIO的输入,下一节我们将尝试进阶使用DAC,测量电池的电。