
对GPIO的简单操作
2024年12月29日大约 5 分钟
对GPIO的简单操作
点个灯先,成为点灯大师
GPIO — Arduino-ESP32 2.0.14 documentation
GPIO是什么? General Purpose Input Output 通用功能输出输出,用于电信号在电路中的输入输出,以方便控制电路 部件。 GPIO就是从芯片内部引出来一根功能复用的口线(电线) 功能复用是指:GPIO的引脚可以由CPU配置成不同的功能 比如:输入功能 输出功能 模拟功能 复用功能等等
1. 工程模板
#include <Arduino.h>
void setup()
{
}
void loop()
{
}
2. 函数讲解
setup()
Arduino板子通电或复位后,即会开始执行setup() 函数中的程序,该部分只会执行一次。通常我们会在 setup() 函数中完成 Arduino的初始化设置,如配置I/O口状态,初始化串口等 操作。可以简单理解为配置 外设
loop()
在setup() 函数中的程序执行完后,Arduino会接着执行loop() 函数中的程序。而loop()函数是一个死循 环,其中的程序会不断的重复运行。通常我们会在loop() 函数中完成程序的主要功能,如驱动各种模块, 采集数据等。
pinMode()
函数原型:
void pinMode(uint8_t pin, uint8_t mode);
/*
pinMode函数是一个非常基础且重要的函数,它用于设置特定引脚(pin)的工作模式。Arduino开发板上的每个引脚都可以被配置为输入(INPUT)、输出(OUTPUT)或输入并启用内部上拉电阻(INPUT_PULLUP)模式。正确设置引脚模式是进行任何I/O操作前的必要步骤。
*/
参数:
- pin:引脚的编号
- mode:引脚的工作模式
- INPUT_PULLUP 启用内部上拉电阻的上拉输入
- INPUT_DOWN 启用内部下拉电阻的下拉输入
- OUTPUT 将引脚配置为输出模式。在这种模式下,引脚可以输出高电平或低电平信号,用于控制外部电路。
digitalWrite()
函数原型
void digitalWrite(uint8_t pin, uint8_t value);
/*
digitalWrite() 函数在Arduino编程中用于向指定的引脚(pin)写入数字高电平(HIGH)或低电平(LOW)。这个函数只能用于之前已经通过 pinMode() 函数设置为输出(OUTPUT)模式的引脚。
*/
参数:
- pin:需要写入数字值的引脚编号。
- value:要写入的数字值,可以是以下两种之一:
- HIGH:向引脚输出高电平,通常对应于Arduino板的VCC电压(例如5V或3.3V,取决于板子)。
- LOW:向引脚输出低电平,通常对应于地(GND)电压,即0V。
上述HIGH和LOW分别可以用1和0代替
delay()
void delay(unsigned long ms);
/*
delay() 函数是一个非常基本且常用的函数,用于在程序中创建一个暂停或等待的时间间隔。这个函数使得程序的执行在指定的毫秒数内暂停,不执行任何其他操作
注意,这个延时函数是阻塞性的,这种阻塞行为意味着,如果你的程序中有多个任务需要并发执行,或者你需要在延时期间响应外部事件(如按钮按下或传感器读数变化),使用delay()函数可能会导致问题。例如,如果你在一个循环中使用delay()来控制LED的闪烁,那么在延时期间,程序将无法处理其他输入或执行其他任务。
*/
参数:
- ms:需要暂停的时间,单位是毫秒(ms)。1秒等于1000毫秒
3. 直接点灯
了解以上函数后,就可以开启我们的点灯之旅了
点灯1----点灯
#include <Arduion,h>
#define LED_R 3
#define LED_G 4
#define LED_B 5
void setup()
{
pinMode(LED_R, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_B, OUTPUT);
}
void loop()
{
digitalWrite(LED_R, 1);
digitalWrite(LED_G, 1);
digitalWrite(LED_B, 1);
delay(1000);
digitalWrite(LED_R, 0);
digitalWrite(LED_G, 0);
digitalWrite(LED_B, 0);
delay(1000);
}
点灯2----流水灯1
#include <Arduion,h>
#define LED_R 3
#define LED_G 4
#define LED_B 5
void setup()
{
pinMode(LED_R, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_B, OUTPUT);
}
void loop()
{
digitalWrite(LED_R, 1);
delay(750);
digitalWrite(LED_G, 1);
delay(750);
digitalWrite(LED_B, 1);
delay(750);
digitalWrite(LED_R, 0);
delay(750);
digitalWrite(LED_G, 0);
delay(750);
digitalWrite(LED_B, 0);
delay(750);
}
点灯3----流水灯2
#include <Arduion,h>
#define LED_R 3
#define LED_G 4
#define LED_B 5
void setup()
{
pinMode(LED_R, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_B, OUTPUT);
}
void loop()
{
digitalWrite(LED_R, 1);
delay(500);
digitalWrite(LED_R, 0);
delay(500);
digitalWrite(LED_G, 1);
delay(500);
digitalWrite(LED_G, 0);
delay(500);
digitalWrite(LED_B, 1);
delay(500);
digitalWrite(LED_B, 0);
delay(500);
}
按键控制点灯

下面是是翻转电平的宏定义函数
#define digitalToggle(x) digitalWrite(x, !digitalRead(x))
#include <Arduion,h>
// 宏定义主要是一种代码替换的机制,能够提高代码的可读性和可维护性
// 而变量定义则是用于在程序中存储和管理数据的标识符。
// 下面是宏定义
#define LED_R 3
#define LED_G 4
#define LED_B 5
#define LED_R_key 12
void setup()
{
pinMode(LED_R_key, INPUT_PULLUP);
pinMode(LED_R, OUTPUT);
}
void loop()
{
if(digitalRead(LED_R_Key) == 0)
{
delay(15);
while(digitalRead(LED_R_Key) == 0);
delay(15);
digitalWrite(LED_R, 1);
delay(2000);//等待2秒看现象,不然循环速度太快,灯还没来得及亮就灭了。
}
else if()
{
//其他逻辑
//delay(20);
//while();
}
}
读取灰度传感器

简单说一下,就是通过调节电位器来调节阈值,使得传感器在收到颜色信号后能通过DO引脚输出高/低电平.
控制蜂鸣器
我们买的是无源蜂鸣器,即内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它
/*
ESP32S3
接线说明:无源蜂鸣器的信号引脚接单片机任意一个支持PWM输出的引脚
*/
#include <Arduino.h>
#define buzzer 14 // 示例代码宏定义GPIO14为控制的引脚
int freq = 2000;// 设置频率
int channel = 0;// 通道号,取值0 ~ 7
int resolution = 8;// 分辨率,2的8次幂=256
void setup() {
Serial.begin(115200);
ledcSetup(channel, freq, resolution);
ledcAttachPin(buzzer, channel);
}
void loop() {
ledcWriteTone(channel, 2000);
for (int dutyCycle = 0; dutyCycle <= 255; dutyCycle = dutyCycle + 10) {
ledcWrite(channel, dutyCycle);
delay(1000);
}
ledcWrite(channel, 125);
for (int freq = 255; freq < 10000; freq = freq + 250) {
ledcWriteTone(channel, freq);
delay(1000);
}
}