|
@@ -0,0 +1,138 @@
|
|
|
+# 3.学会使用按键-GPIO输入
|
|
|
+
|
|
|
+你好,我是爱吃鱼香ROS的小鱼。上一节完成了LED灯的控制,本节我们学习下如何使用按键。
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 一、 按键检测原理
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+上面的原理图就是我们MicroROS开发板的BOOT按键的原理图,该按键的位置在板子的左下角。
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+简单的看下原理图可知
|
|
|
+
|
|
|
+- 当`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 <Arduino.h>
|
|
|
+
|
|
|
+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 <Arduino.h>
|
|
|
+
|
|
|
+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,测量电池的电。
|