Browse Source

feat(chapt13): 学会使用按键-GPIO输入

鱼香ROS 2 năm trước cách đây
mục cha
commit
873406fa3b

+ 138 - 0
docs/humble/chapt13/basic/3.学会使用按键-GPIO输入.md

@@ -0,0 +1,138 @@
+# 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 <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,测量电池的电。

BIN
docs/humble/chapt13/basic/3.学会使用按键-GPIO输入/imgs/image-20221219032725959.png


BIN
docs/humble/chapt13/basic/3.学会使用按键-GPIO输入/imgs/image-20221219032833035.png