03-基础例程3

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

基础例程3

01、外部中断

ESP32的外部中断有上升沿、下降沿、低电平、高电平触发模式。

实验目的

使用外部中断功能实现按键控制LED的亮灭

按键按下为0。【即下降沿】

 * 接线说明按键模块-->ESP32 IO
 *         (K1-K4)-->(14,27,26,25)
 *         
 *         LED模块-->ESP32 IO
 *         (D1-D4)-->(15,2,0,4)

软件程序

  • 对于主函数
/* 深圳市普中科技有限公司PRECHIN 普中
   技术支持www.prechin.net
 * 实验名称外部中断实验
 * 接线说明按键模块-->ESP32 IO[输入]
 *         (K1-K4)-->(14,27,26,25)
 *         
 *         LED模块-->ESP32 IO[输出]
 *         (D1-D4)-->(15,2,0,4)
 * 
 * 实验现象程序下载成功后操作K1键控制D1指示灯亮灭操作K2键控制D2指示灯亮灭
            操作K3键控制D3指示灯亮灭操作K4键控制D4指示灯亮灭 
 */

#include "public.h"
#include "exti.h"


//定义LED控制引脚
#define led1_pin  15
#define led2_pin  2
#define led3_pin  0
#define led4_pin  4

//定义全局变量

void setup() {
  pinMode(led1_pin, OUTPUT);//设置引脚为输出模式
  pinMode(led2_pin, OUTPUT);
  pinMode(led3_pin, OUTPUT);
  pinMode(led4_pin, OUTPUT);
  exti_init();
}

void loop() {
  digitalWrite(led1_pin,key1_sta);
  digitalWrite(led2_pin,key2_sta);
  digitalWrite(led3_pin,key3_sta);
  digitalWrite(led4_pin,key4_sta);
}

  • 对于中断函数
#include "exti.h"

volatile u8 key1_sta=0;
volatile u8 key2_sta=0;
volatile u8 key3_sta=0;
volatile u8 key4_sta=0;

//端口初始化
void exti_init(void)
{
  pinMode(key1_pin, INPUT_PULLUP);//设置引脚为输入上拉模式
  pinMode(key2_pin, INPUT_PULLUP);
  pinMode(key3_pin, INPUT_PULLUP);
  pinMode(key4_pin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(key1_pin), key1_isr, FALLING);//设置下降沿触发
  attachInterrupt(digitalPinToInterrupt(key2_pin), key2_isr, FALLING);
  attachInterrupt(digitalPinToInterrupt(key3_pin), key3_isr, FALLING);
  attachInterrupt(digitalPinToInterrupt(key4_pin), key4_isr, FALLING);
}
/*中断函数*/
void key1_isr(void)
{
  key1_sta=!key1_sta;
}

void key2_isr(void)
{
  key2_sta=!key2_sta;
}

void key3_isr(void)
{
  key3_sta=!key3_sta;
}

void key4_isr(void)
{
  key4_sta=!key4_sta;
}

02、定时器中断

使用定时器进行定时。

  • 主函数
/* 深圳市普中科技有限公司PRECHIN 普中
   技术支持www.prechin.net
 * 
 * 实验名称定时器中断实验
 * 
 * 接线说明LED模块-->ESP32 IO
 *         (D1)-->(15)
 * 
 * 实验现象程序下载成功后D1指示灯间隔0.5s状态翻转
 * 
 * 注意事项
 * 
 */

#include "public.h"
#include "led.h"
#include "time.h"


//定义全局变量


void setup() {
  led_init();
  time0_init(500000);//定时500ms
  
}

void loop() {
  
}

#include "led.h"

//led初始化
void led_init(void)
{
  pinMode(led1_pin, OUTPUT);//设置引脚为输出模式
}

  • 定时器的函数
#include "time.h"
#include "led.h"

hw_timer_t *timer0 = NULL;//创建timer0定时器对象

//定时器初始化
//per定时时间单位us
void time0_init(u32 per)
{
  /* timerBegin初始化定时器指针
    第一个参数设置定时器0一共有四个定时器0、1、2、3
    第二个参数80分频设置APB时钟ESP32主频80MHz80则时间单位为1Mhz即1us1000000us即1s。
    第三个参数计数方式true向上计数 false向下计数
 */
  timer0 = timerBegin(0, 80, true);

  /* timerAlarmWrite配置报警计数器保护值就是设置时间
     第一个参数指向已初始化定时器的指针
     第二个参数定时时间这里为500000us  意思为0.5s进入一次中断
     第三个参数是否重载false定时器中断触发一次  true死循环
  */
  timerAlarmWrite(timer0, per, true);

  /* timerAttachInterrupt绑定定时器
     第一个参数指向已初始化定时器的指针
     第二个参数中断服务器函数
     第三个参数true边沿触发false电平触发
  */
  timerAttachInterrupt(timer0, &time0_isr, true); 
  timerAlarmEnable(timer0);//启用定时器
  //timerDetachInterrupt(timer0);//关闭定时器
  
}

//定时器中断函数
/*当定时时间到进入定时器中断函数
*/
void time0_isr(void)
{
  static u8 led_sta=0; 
  led_sta=!led_sta;
  digitalWrite(led1_pin,led_sta);
}

03、PWM

实验目的

通过调节PWM占空比控制LED指示灯亮度变化实现呼吸灯的效果。由暗到亮再由亮到暗的循环过程。

image-20230811002718253

高电平的占空比不同则电压不同则LED的亮度不同

  • 主函数
/* 深圳市普中科技有限公司PRECHIN 普中
   技术支持www.prechin.net 
 * 实验名称PWM呼吸灯实验 
 * 接线说明LED模块-->ESP32 IO
 *         (D1)-->(15)
 * 实验现象程序下载成功后D1指示灯呈现呼吸灯效果由暗变亮再由亮变暗
 */

#include "public.h"
#include "led.h"
#include "pwm.h"


//定义全局变量
u16 g_duty_value=0;
u8 g_fx=1;

void setup() {
  pwm_init(led1_pin,0,1000,10);
  
}

void loop() {
  if(g_fx==1)
  {
    g_duty_value+=10;
    if(g_duty_value>1010)g_fx=0;
  }
  else
  {
    g_duty_value-=10;
    if(g_duty_value<10)g_fx=1;
  }
  pwm_set_duty(0,g_duty_value);
  delay(10);
}

#include "led.h"

//led初始化
void led_init(void)
{
  pinMode(led1_pin, OUTPUT);//设置引脚为输出模式
}

  • PWM的函数
#include "pwm.h"

/*
PWM初始化
//pin引脚号
//chanelPWM输出通道0-15
//freqPWM输出频率单位HZ
//resolutionPWM占空比的分辨率1-16比如设置8分辨率范围0-255
*/
void pwm_init(u8 pin,u8 chanel,u8 freq,u8 resolution)
{
  ledcSetup(chanel, freq, resolution);// PWM初始化
  ledcAttachPin(pin, chanel);// 绑定PWM通道到GPIO上
}

//PWM占空比设置
//chanelPWM的输出通道
//duty占空比
void pwm_set_duty(u8 chanel,u16 duty)
{
  ledcWrite(chanel,duty);// 改变PWM的占空比
}

04、串口通信

  • 实验介绍

在ESP32中有三个硬件的UARTUART0、UART1和UART2。

在这里插入图片描述

ESP32 TX——RX

ESP32 RX——TX

GND——GND

其中UART0用于下载程序和调试

UART1内部的通信

  • 代码
/* 深圳市普中科技有限公司PRECHIN 普中
   技术支持www.prechin.net
 * 
 * 实验名称串口通信实验
 * 
 * 接线说明USB转TTL模块-->ESP32 IO
 *         (TXD)-->(16)
           (RXD)-->(17)
           (GND)-->(GND)
 * 
 * 实验现象程序下载成功后打开串口调试助手选择好串口、波特率115200参数等在串口助手上发送字符数据
             ESP32串口接收后原封不动返回到串口助手显示
 * 
 * 注意事项USB转TTL模块上将电源切换为3.3V
 * 
 */

#include "public.h"


//定义全局变量
//定义串口2
HardwareSerial mySerial2(2);
String serialData;


void setup() {
  //串口0配置
  Serial.begin(115200);
  //串口2配置
  //void HardwareSerial::begin(unsigned long baud, uint32_t config=SERIAL_8N1, int8_t rxPin=-1, int8_t txPin=-1, bool invert=false, unsigned long timeout_ms = 20000UL);
  //baud串口波特率该值写0则会进入自动侦测波特率程序
  //config串口参数默认SERIAL_8N1为8位数据位、无校验、1位停止位
  //rxPin接收管脚针脚号
  //txPin发送管脚针脚号
  //invert翻转逻辑电平串口默认高电平为1、低电平为0
  //timeout_ms自动侦测波特率超时时间如果超过该时间还未获得波特率就不会使能串口
  mySerial2.begin(115200,SERIAL_8N1,16,17);
  
}

void loop() {
  if(Serial.available())  //当串口0接收到信息后
  {
    Serial.println("Serial Data Available..."); // 通过串口监视器通知用户
    serialData=Serial.readString();  // 将接收到的信息使用readString()存储于serialData变量
    Serial.print("Received Serial Data: ");     // 然后通过串口监视器输出serialData变量内容
    Serial.println(serialData);                 // 以便查看serialData变量的信息
  }
  if(mySerial2.available())  //当串口2接收到信息后
  {
    mySerial2.println("Serial2 Data Available..."); // 通过串口监视器通知用户
    serialData=mySerial2.readString();  // 将接收到的信息使用readString()存储于serialData变量
    mySerial2.print("Received Serial2 Data: ");     // 然后通过串口监视器输出serialData变量内容
    mySerial2.println(serialData);                 // 以便查看serialData变量的信息
  }
}

05、ADC

  • 实验介绍

ADC功能在引脚32-39上可用。输入电压必须介于0-1.0V高于1V都读为4095

ADC采集电位器0-3.3V电压。

  • 硬件设计

在这里插入图片描述

J2端子的R_ADC脚为电位器的电压输出端可将该引脚与ESP32的ADC脚相连接

旋转底板上的ADC电位器即可改变电压

  • 软件设计
/* 深圳市普中科技有限公司PRECHIN 普中
   技术支持www.prechin.net
 * 
 * 实验名称ADC实验
 * 
 * 接线说明ADC电位器-->ESP32 IO
 *         ADC-->(34)
 * 
 * 实验现象程序下载成功后会在软件串口控制台上输出ADC检测电压值调节电位器可改变检测电压
 * 
 * 注意事项
 * 
 */

#include "public.h"


//定义全局变量
float adc_vol=0;


void setup() {
  //串口0配置
  Serial.begin(115200);
  
}

void loop() {
  adc_vol=3.3*(float)analogRead(34)/4095;//读取ADC值---34引脚
  Serial.print("ADC检测电压");
  Serial.print(adc_vol);
  Serial.println("V");
  delay(500);
}





 
 * 接线说明ADC电位器-->ESP32 IO
 *         ADC-->(34)
 * 
 * 实验现象程序下载成功后会在软件串口控制台上输出ADC检测电压值调节电位器可改变检测电压
 * 
 * 注意事项
 * 
 */

#include "public.h"


//定义全局变量
float adc_vol=0;


void setup() {
  //串口0配置
  Serial.begin(115200);
  
}

void loop() {
  adc_vol=3.3*(float)analogRead(34)/4095;//读取ADC值---34引脚
  Serial.print("ADC检测电压");
  Serial.print(adc_vol);
  Serial.println("V");
  delay(500);
}

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6