03-基础例程3

基础例程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主频80MHz),80则时间单位为1Mhz即1us,1000000us即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:引脚号
//chanel:PWM输出通道0-15
//freq:PWM输出频率,单位HZ
//resolution:PWM占空比的分辨率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占空比设置
//chanel:PWM的输出通道
//duty:占空比
void pwm_set_duty(u8 chanel,u16 duty)
{ledcWrite(chanel,duty);// 改变PWM的占空比
}

04、串口通信

  • 实验介绍

在ESP32中有三个硬件的UART:UART0、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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/96357.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索未来金融科技 SCF新加坡举办启动盛会

金融科技的热潮涌向新加坡&#xff0c;令人瞩目的SCF金融公链启动会于8月13日隆重举行。这场盛宴不仅为金融科技领域注入了新的活力&#xff0c;更为广大投资者、合作伙伴以及热衷区块链发展的人士提供了一次宝贵的交流机会。 在SCF金融公链启动会上&#xff0c;William Thomps…

【数据结构篇】线性表1 --- 顺序表、链表 (万字详解!!)

前言&#xff1a;这篇博客我们重点讲 线性表中的顺序表、链表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列... 线性表在逻辑上是…

基于Java的OA办公管理系统,Spring Boot框架,vue技术,mysql数据库,前台+后台,完美运行,有一万一千字论文。

基于Java的OA办公管理系统&#xff0c;Spring Boot框架&#xff0c;vue技术&#xff0c;mysql数据库&#xff0c;前台后台&#xff0c;完美运行&#xff0c;有一万一千字论文。 系统中的功能模块主要是实现管理员和员工的管理&#xff1b; 管理员&#xff1a;个人中心、普通员工…

vue3实现日历日期选择(不使用任何插件,纯javaScript实现)

个人项目地址&#xff1a; SubTopH前端开发个人站 &#xff08;自己开发的前端功能和UI组件&#xff0c;一些有趣的小功能&#xff0c;感兴趣的伙伴可以访问&#xff0c;欢迎提出更好的想法&#xff0c;私信沟通&#xff0c;网站属于静态页面&#xff09; SubTopH前端开发个人…

3、DVWA——CSRF

文章目录 一、CSRF概述二、low2.1 通关思路2.2 源码分析 三、medium3.1 通关思路3.2 源码分析 四、high4.1 通关思路4.2 源码分析 五、impossible 一、CSRF概述 CSRF全称为跨站请求伪造&#xff08;Cross-site request forgery&#xff09;&#xff0c;是一种网络攻击方式&…

python实现某音自动登录+获取视频数据

前言 Dy这个东西想必大家都用过&#xff0c;而且还经常刷&#xff0c;今天就来用代码&#xff0c;获取它的视频数据 环境使用 Python 3.8 Pycharm 模块使用 requests selenium json re 一. 数据来源分析 1. 明确需求 明确采集网站以及数据内容 网址: https://www.dy.com/…

JavaWeb 文件上传和下载

目录 一、文件上传 1.文件上传和下载的使用说明 : 2.文件上传基本原理 : 3.文件上传经典案例 : 3.1 页面实现: 3.2 servlet实现 : 3.3 工具类实现 : 3.4 运行测试 : 3.5 注意事项 : 二、文件下载 1.文件下载基本原理 : 2.文件下载经典案例 : 2.1 准备工作 2.2 页面…

python 深度学习 解决遇到的报错问题3

目录 一、AttributeError: The vocab attribute was removed from KeyedVector in Gensim 4.0.0. 二、ImportError: cannot import name logsumexp 三、FutureWarning: Passing (type, 1) or 1type as a synonym of type is deprecated; in a future version of numpy, it w…

Spring MVC介绍

MVC模式是什么 MVC 模式&#xff0c;全称为 Model-View-Controller&#xff08;模型-视图-控制器&#xff09;模式&#xff0c;它是一种软件架构模式&#xff0c;其目标是将软件的用户界面&#xff08;即前台页面&#xff09;和业务逻辑分离&#xff0c;使代码具有更高的可扩展…

睿趣科技:抖音开小店大概多久可以做起来

随着移动互联网的快速发展&#xff0c;社交媒体平台成为了人们分享生活、交流信息的主要渠道之一。在众多社交平台中&#xff0c;抖音以其独特的短视频形式和强大的用户粘性受到了广泛关注。近年来&#xff0c;越来越多的人通过在抖音上开设小店来实现创业梦想&#xff0c;这种…

【SpringBoot】最基础的项目架构(SpringBoot+Mybatis-plus+lombok+knife4j+hutool)

汝之观览&#xff0c;吾之幸也&#xff01; 从本文开始讲下项目中用到的一些框架和技术&#xff0c;最基本的框架使用的是SpringBoot(2.5.10)Mybatis-plus(3.5.3.2)lombok(1.18.28)knife4j(3.0.3)hutool(5.8.21),可以做到代码自动生成&#xff0c;满足最基本的增删查改。 一、新…

在R中安装TensorFlow、TensorFlow_Probability、numpy(R与Python系列第二篇)

目录 前言&#xff1a; 1-安装tensorflow库 Step1: 下载R包tensorflow Step2&#xff1a;安装TensorFlow库 Step3&#xff1a;导入R中 2-安装tensorflow_probability库 Step1&#xff1a;下载R包&#xff1a;tfprobability Step2&#xff1a;安装TensorFlow Probability …