ESP32教程(基于Arduino IDE)3-基本操作

ESP32教程系列
1 - 认识ESP32
2 - Arduino IDE安装&配置
3 - 基本操作
4 - WiFi配网
5 - WebServer①
6 - Web Server②控制输出
7 - Web Server③ HTML&CSS基础
8 - Web Server④ 在Arduinio中添加HTML&CSS
9 - 异步网页服务器 Asynchronous Web Server(DHT11)
10 - OTA ESP32无线升级,告别数据线

ESP32实战系列
WiFi遥控小车

ESP32 Homekit系列
Homekit & Homespan介绍
点亮一颗LED
调节LED亮度

前言

Arduino之所以受众广,其有完整的一套SDK,市面上的STM32的Nucleo系列开发板,ESP32等第三方开发板均会将自带的库函数封装成Arduino函数,这样不论你换了什么单片机,代码书写无任何影响。
由于网络上针对Ardunio基本操作的教程已有很多,本系列就不再重复造轮子,因此本节仅做一些基本操作介绍。

准备内容

ESP32开发板
USB线
LED
电阻若干
电位器
PIR人体传感器
杜邦线若干

一、Arduino函数架构

当我们新建一个sketch时,会出现如下代码块。在这里插入图片描述

void Setup()
{
//此处为外设的配置,如GPIO输入输出的设置
}

void loop()
{
//主循环
//书写主体逻辑

二、GPIO口数字输入输出

  • 相关函数

  • digitalWrite():
    用于控制数字输出,接受两个参数,分别是要操作的 GPIO 引脚和状态(HIGH 或 LOW)
    ※注意大写

  • digitalRead():
    用于读取数字输入,接受一个参数,即要读取的 GPIO 引脚

  • Demo
    实现功能:按下按键时LED灯亮,松手即灭。

电路接线
在这里插入图片描述

代码

int buttonState = 0;
void setup() {
  pinMode(4, INPUT);
  pinMode(5, OUTPUT);
}

void loop() {
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}

二、ESP32 脉冲宽度调制(PWM)

  • PWM 介绍
    ESP32 的 LED PWM 控制器有 16 个独立通道,可以配置生成不同特性的 PWM 信号。通过设置 PWM 通道、信号频率、占空比分辨率以及指定输出引脚等步骤,可以实现对 LED 亮度的控制。
  • 相关函数
    ledcSetup():用于配置 PWM 通道的属性如通道号、频率和分辨率。
    ledcAttachPin():将 PWM 通道连接到指定的 GPIO 引脚,参数为引脚及通道号。
    ledcWrite():用于控制 PWM 信号的占空比,参数为通道号和占空比。
  • Demo
    实现功能:呼吸灯效果

电路接线图
在这里插入图片描述

代码:

int ledPin = 18;	//LED灯的引脚
int freq = 5000;	//频率
int pwmChannel = 0;	//PWM的通道,0~15
int resolution = 8;	//计数位数,2^8 = 256

void setup() {
  ledcSetup(pwmChannel, freq, resolution);//设置LED的驱动PWM,通道为16,频率为5kHz,占空比为8%
  ledcAttachPin(ledPin, ledChannel);//将上述PWM适用到LED的pin脚上
}

void loop() {
  for (int dutyCycle = 0; dutyCycle <= 255; dutyCycle++) {//逐渐增大占空比,亮度逐渐增加
    ledcWrite(ledChannel, dutyCycle);//更改占空比
    delay(15);
  }
  for (int dutyCycle = 255; dutyCycle > 0; dutyCycle--) {//逐渐减小占空比,亮度逐渐增加
    ledcWrite(ledChannel, dutyCycle);//更改占空比
    delay(15);
  }
}

三、ESP32 模拟输入

  • 模拟输入介绍
    ESP32 可以读取 0V 到 3.3V 之间的模拟电压值,并将其转换为 0 到 4095 之间的数字值。但 ESP32 的 ADC 引脚存在非线性行为,需要注意。
  • 相关函数
    analogRead():读取模拟输入值,参数为 GPIO 引脚。
  • Demo
    实现功能:读取电位器上的电压并在串口中显示

电路接线图
在这里插入图片描述

代码

int potPin = 34;	//设置电位器连接的pin脚
int potValue = 0;

void setup() {
  Serial.begin(115200);	//初始化串口,通信速率为115200bps
  delay(1000);
}

void loop() {
  potValue = analogRead(potPin);	//	读取电位器的电压
  Serial.print(potValue);	//在串口中打印电压值
  Serial.println("V");	//在串口中打印单位
  delay(500);
}

四、ESP32 中断和定时器

  • 中断介绍
    使用attachInterrupt()函数设置中断,参数为GPIO 引脚、要执行的函数名和中断模式作为。
    中断模式包括 LOW(低电平)、HIGH(高电平)、CHANGE(电平变化)、FALLING(下降沿) 和 RISING(上升沿)。
  • 定时器介绍
    使用millis()函数获取从程序开始运行到当前所经过的毫秒数,可以通过一些计算来实现定时器功能,避免使用delay()函数阻塞代码。
  • Demo

**实现功能:**利用 Arduino 的中断机制来检测人体传感器(PIR)的触发事件。当检测到人体运动时,点亮 LED,并开始计时。如果在 10 秒内没有再次检测到人体运动,则熄灭 LED。

电路接线图:
在这里插入图片描述

代码

#define timeSeconds 10	// 定义一个常量timeSeconds,单位为秒
int led = 19;    //LED引脚
int motionSensor = 18;    //PIR人体传感器接到18引脚
unsigned long now = millis();    //获取程序运行时间,单位为ms
unsigned long lastTrigger = 0;    //定义一个触发,用于记录上一次触发事件发生的时间

boolean startTimer = false;    //定义一个布尔型变量,用于控制事件触发相关的逻辑是否开始

//中断函数的配置
void IRAM ATTR detectsMovement() {
  Serial.println("检测到有人!!!");    // 串口输出
  digitalWrite(led, HIGH);	//点亮LED灯
  startTimer = true;  // 将startTimer变量设置为true,表示计时相关的操作应该开始了
  lastTrigger = millis();  // 更新lastTrigger变量为当前的时间,用于记录本次触发事件发生的时间
}

void setup() {
  Serial.begin(115200);	  // 初始化串口通信,设置波特率为115200
  pinMode(motionSensor, INPUT_PULLUP);  // 将连接人体传感器的引脚设置为输入上拉模式
  attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING);// 为motionSensor引脚注册一个中断,当引脚电平从低电平变为高电平时(RISING),会调用detectsMovement函数
  pinMode(led, OUTPUT);// 将连接LED的引脚设置为输出模式
  digitalWrite(led, LOW);  // 初始化时将LED设置为低电平,也就是熄灭LED
}

void loop() {
  now = millis();  // 在每次循环中,更新now变量为当前的程序运行时间
  if (startTimer && (now - lastTrigger > (timeSeconds * 1000))) {  // 如果startTimer为true(表示触发事件已经发生且计时应该开始),并且当前时间now减去上一次触发时间lastTrigger大于timeSeconds(值为10)乘以1000毫秒(也就是10秒)
    Serial.println("无人");// 通过串口输出字符串"Motion stopped..."
    digitalWrite(led, LOW);// 将LED引脚设置为低电平,熄灭LED
    startTimer = false;// 将startTimer变量设置为false,表示计时相关操作结束
  }
}

总结

以上为Arduino IDE下对单片机的常规操作的函数介绍。至于条件语句等与C语言一致,因此,需要一点C语言基础。
以上内容,如有错误,欢迎指正。
如果如果喜欢,欢迎关注微信公众号:+大钱硬件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值