
注:本系列为个人学习 ESP32 的记录,主要通过再记录的方式学习,参考和搬运转载极客侠 GeeksMan 的文章。
著作权归极客侠 GeeksMan 所有,基于 GPL 3.0 协议。原文链接:https://docs.geeksman.com/esp32/Arduino/01.esp32-arduino-intro.html
ESP32 开发板上有一类引脚叫 GPIO 引脚, 负责输入/输出电压。开发板上 D 开头的引脚都是这种引脚, 比如 D2、D4、D15 等等。
什么是电平?
电路上某点的电压(对公共参考点)或电位是高还是低。比如在逻辑电路中,高于某个数值的电位称其为高电位,或高电平,低于某个数值的,为低电位或低电平。比如 ESP32 中,高电平的数值大于2.5V,低电平的数值小于0.5V,具体的数值最好通过测试研究来确定。
LED(light-emitting diode) 即发光二极管。通过 5mA 左右电流即可发光,电流越大,其亮度越强,但若电流过大,会烧毁二极管,一般我们控制在 3mA-20mA 之间,通常我们会在 LED 管脚上串联一个电阻,目的就是为了限制通过发光二极管的电流不要太大,因此这些电阻又可以称为限流电阻。当发光二极管发光时,测量它两端电压约为 1.7V,这个电压又叫做发光二极管的导通压降。
发光二极管正极又称阳极,负极又称阴极,电流只能从阳极流向阴极。直插式发光二极管长脚为阳极,短脚为阴极。
注:长阳短阴
LED 的正极接开发板的 D12 引脚,并串联一个电阻,负极接 GND,如下图:

注意
一定要接电阻,不然会由于电流过大,烧坏 LED。
想要点亮这颗 LED 的话,只需要先设定相关引脚为输出模式,然后给这个引脚赋值一个高电平即可。
// 设置 LED 引脚为12
int led_pin = 12;
void setup() {
// 设置LED的引脚模式为输出模式
pinMode(led_pin, OUTPUT);
// 点亮 LED,在LED的数字引脚上写入数字值为高电平
digitalWrite(led_pin, HIGH);
}
void loop() {
}
实现 LED 闪烁的原理很简单,就是在 loop 函数中使用延时函数 delay。先设置高电平,延时 X 秒,再设置低电平,延时 X 秒,之后就不断循环该语句即可。
// 设置 LED 引脚为12
int led_pin = 12;
void setup() {
// 设置LED的引脚模式为输出模式
pinMode(led_pin, OUTPUT);
}
void loop() {
// 点亮 LED,在LED的数字引脚上写入数字值为高电平
digitalWrite(led_pin, HIGH);
// 延时1000毫米(1秒)
delay(1000);
// 关闭 LED,在LED的数字引脚上写入数字值为低电平
digitalWrite(led_pin, LOW);
// 延时1000毫米(1秒)
delay(1000);
}
每一个 LED 的正极与开发板一个 GPIO 引脚相连,并串联一个电阻,负极接 GND,如下图:

因为我们要用到多个 GPIO 引脚,所以,我们最好把所有的 GPIO 引脚放在一个数组中,然后遍历这个数组
// 定义 GPIO 引脚数组,创建一个数组并设定五个GPIO 引脚
int pin_list[5] = {13, 12, 14, 27, 26};
// 获取数组长度,sizeof(arr) 获取数组总字节数,sizeof(arr[0]) 获取单个元素字节数,二中相除(10/2)即可得到数组长度
int size = sizeof(pin_list) / sizeof(pin_list[0]);
void setup() {
// 逐个设定 GPIO 引脚为输出模式
for (int i=0; i<size;i++) {
pinMode(pin_list[i], OUTPUT);
}
}
void loop() {
// 正向循环遍历,将所有引脚设置为高电平并设置延时50毫秒
for (int i=0;i<size;i++) {
digitalWrite(pin_list[i], HIGH);
delay(50);
}
// 正向循环遍历,将所有引脚设置为低电平并设置延时50毫秒
for (int i=0;i<size;i++) {
digitalWrite(pin_list[i], LOW);
delay(50);
}
}
我们还可以对该程序进行微调,比如之前是依次改变流水灯的状态,现在,修改为让流水灯往复亮。
// 定义 GPIO 引脚数组,创建一个数组并设定五个GPIO 引脚
int pin_list[5] = {13, 12, 14, 27, 26};
// 获取数组长度,sizeof(arr) 获取数组总字节数,sizeof(arr[0]) 获取单个元素字节数,二中相除(10/2)即可得到数组长度
int size = sizeof(pin_list) / sizeof(pin_list[0]);
void setup() {
// 逐个设定 GPIO 引脚为输出模式
for (int i=0; i<size;i++) {
pinMode(pin_list[i], OUTPUT);
}
}
void loop() {
// 正向循环遍历,将所有引脚设置为高电平并设置延时50毫秒
for (int i=0;i<size;i++) {
digitalWrite(pin_list[i], HIGH);
delay(50);
}
// 反向循环遍历,将所有引脚设置为低电平并设置延时50毫秒
for (int i=size-1;i>=0;i--) {
digitalWrite(pin_list[i], LOW);
delay(50);
}
}
让 LED 实现平移的效果是这样实现的,每次在我点亮这颗 LED 的时候,同时把上一颗 LED 的状态改为低电平,并且当索引值为 0 时,让最后一颗 LED 状态改为低电平代码如下:
// 定义 GPIO 引脚数组,创建一个数组并设定五个GPIO 引脚
int pin_list[5] = {13, 12, 14, 27, 26};
// 获取数组长度,sizeof(arr) 获取数组总字节数,sizeof(arr[0]) 获取单个元素字节数,二中相除(10/2)即可得到数组长度
int size = sizeof(pin_list) / sizeof(pin_list[0]);
void setup() {
// 逐个设定 GPIO 引脚为输出模式
for (int i=0; i<size;i++) {
pinMode(pin_list[i], OUTPUT);
}
}
void loop() {
// 正向循环遍历,将所有引脚设置为高电平
for (int i=0;i<size;i++) {
digitalWrite(pin_list[i], HIGH);
//判断当前LED是否不是第一个LED,若不是则为上一个LED的状态改为低电平
if (i > 0){
digitalWrite(pin_list[i-1], LOW);
//否则即目前LED为第一个LED, 则让上一颗LED也就是最末尾的LED的状态改为低电平
}else {
digitalWrite(pin_list[size-1], LOW);
}
delay(250);
}
}
系列导航:返回目录索引 | 上一篇:01. Arduino 编程基础与开发准备 | 下一篇:03. 数码管显示:单位与四位数码管
Article Navigation System © 2025
欢迎来到我的留言板,留下你的足迹,与我分享你的想法和感受。
点击文本框会有惊喜哦`(。•̀ᴗ-)✧