ESP32_DAY12 数位输入输出-函式介绍

讯号的种类

https://ithelp.ithome.com.tw/upload/images/20210927/20140433JIoOYGajbs.png
我们身处的世界中,任何随着时间或空间变化的量都是潜在的讯号,他们可以提供物理系统的状态资讯、或不同物体之间传达的讯息。

术语「讯号」包括音讯、视讯、语音、图像、通讯、地球物理、声纳、雷达、医疗和音乐讯号等。
来源: IEEE讯号处理汇刊

讯号可以分为数位讯号、类比讯号两种。

  • 数位讯号(Digital signal)
    数位讯号是指使用离散(不连续)的0、1来表示资讯,例如:「电脑是只有0和1的世界」,在电脑中0、1分别代表了「低电位(LOW)」、「高电位(HIGH)」,以大部分ESP32的脚位电压来说,也能说是「0V」、「3.3V」。
  • 类比讯号(Analog signal)
    相对於数位,类比讯号是使用一个连续的范围代表资讯,大自然中的一切讯号,例如:声音、影像、温度,都是属於类比讯号,通常我们为了要测量某种类比讯号的变化,会透过量取该类讯号的感测器之电压大小来得到,例如:为了量测温度可以使用热敏电阻来换算。

数位讯号相关函式

今天只会先来介绍ESP32中的数位输入、输出函式,在之前的LED闪烁范例中,已经使用过了数位输出了!也就是pinModedigitalWrite的部分,那与digitalWrite相对的就是digitalRead,函式的取名非常直白,分别是「脚位模式」、「数位写出」、「数位读取」。
请注意:函式的大小写很重要!千万不要拼错了,拼错的话会编译失败喔!!
请注意:函式的大小写很重要!千万不要拼错了,拼错的话会编译失败喔!!
请注意:函式的大小写很重要!千万不要拼错了,拼错的话会编译失败喔!!
https://ithelp.ithome.com.tw/upload/images/20210927/20140433HpwMAh9mWD.png

pinMode(pin, mode)

你选择的GPIOs(pin)编号,根据ESP32的脚位功能,除了GPIOs 6~11(以连接SPI flash)与GPIOs 34、35、36、39(仅提供input功能)等脚位外,都能自由选择下列四种模式:INPUT:、OUTPUT、INPUT_PULLUP、INPUT_PULLDOWN

  1. INPUT: 可以接受电压输入,范围为0~3.3V
  2. OUTPUT: 可以送出3.3V电压
  3. INPUT_PULLUP: 开启上拉电阻功能,根据官方文件,电阻值为45kΩ
  4. INPUT_PULLDOWN: 开启下拉电阻功能,根据官方文件,电阻值为45kΩ
    请注意:四种模式的参数均为大写

digitalWrite(pin, value)

如果模式选择了OUTPUT後,可以透过digitalWrite来控制要送出高电位(3.3V)或低电位(0V),对应之参数值分别为HIGH、LOW,选择使用1、0来当参数也是可行的。
请注意:HIGH、LOW均为大写

digitalRead(pin)

digitalWrite相反,digitalRead会读出此脚位被送入的电位为高电位(3.3V)或低电位(0V),也就是HIGH或LOW(1或0)。在类比讯号中也有类似的函数analogRead,但後者读取的是连续变化的电压值,之後在类比讯号的函式介绍中再介绍。

除了上述三个函式外,你可以再搭配delay(ms)函式来达到延迟的效果,里面的参数要延迟多少毫秒,如果没有适当的使用此函式,可能会造成高低电位切换太快导致看不效果的情况!

霹雳灯

在霹雳灯的练习中,我是使用LEDBar来取代10颗单独的LED灯,可以看看自己手边来决定要如何配置你的霹雳灯~
霹雳灯的效果是LED灯会依序从左到右(反之亦然)点亮再熄灭。

const int ledCount = 10;    // 总共有几颗灯

int ledPins[] = {
  16, 17, 5, 18, 19, 21, 3, 1, 22, 23
};   // 使用一阵列来记录所使用的GPIOs


void setup() {
  // 用一个for回圈来设定所有的LED模式
  for (int thisLed = 0; thisLed < ledCount; thisLed++) {
    pinMode(ledPins[thisLed], OUTPUT);
  }
}

void loop() {
    for (int thisLed = 0; thisLed < ledCount; thisLed++){
      digitalWrite(ledPins[thisLed], HIGH);
      delay(50);
      digitalWrite(ledPins[thisLed], LOW);
      delay(50);
    }
      for (int thisLed = ledCount-1; thisLed >= 0; thisLed--){
      digitalWrite(ledPins[thisLed], HIGH);
      delay(50);
      digitalWrite(ledPins[thisLed], LOW);
      delay(50);
    }

}

https://s19.aconvert.com/convert/p3r68-cdx67/wpb4w-qzhuw.gif
(我把影片转为.gif,所以看起来有点卡卡的><)

太空船介面(练习)

太康船介面的效果是,当A脚位未接收到高电位时,两颗红灯会交错闪烁,直到A脚位确实收到高电位,则两颗红灯停止闪烁,换成绿灯长亮。如果你有按钮的话,可以将A脚位串接上按钮来控制开关,如果没有的话,可以直接使用一条杜邦线拔插,是一样的效果,只是要注意杂讯的问题,至於如何处理杂讯,请参考「ESP32_DAY9 开发好夥伴-电阻
https://s27.aconvert.com/convert/p3r68-cdx67/rork4-8giim.gif
(又是.gif)
给不熟C++的人小提示: 可以用if else来判断读取到的是高或低电位


<<:  知识工作者的管理

>>:  #12 No-code 之旅 — 在 Next.js 专案中显示 RSS 的资料 ft. RSS Parser

【Day 19】- 让 Selenium 去 Dcard 上爬文! (实战 Selenium 模拟使用者划手机 1/2)

前情提要 前一篇与大家介绍了 Selenium 的基本运用,并在补充资料中给予了语法的资源。 开始之...

GitHub Action YAML 撰写技巧 - 环境变数(Environment Variables) 与 秘密 (Secrets)

今天要提到一些关於 GitHub Action 内撰写 YAML 一些技巧,环境变数 (Enviro...

[Day22] Follow Along Links

[Day22] Follow Along Links 需要用到的技巧与练习目标 1.getBound...

Day3 - numpy(2) 基本索引

今天的重点 索引 基本索引: 先建立一个4x3的ndarray来让我们实际操作 阵列索引是由外而内的...

Day 03-Terraform State 之你的 Local State 不是我的 State

Terraform State 之你的 Local State 不是我的 State State 是...