03-基础例程3

news2024/11/18 8:10:56

基础例程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.coloradmin.cn/o/946709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安全生产作业现场违规行为识别 opencv

安全生产作业现场违规行为识别算法通过pythonopencv网络模型算法框架设定了各种合规行为和违规行为的模型&#xff0c;安全生产作业现场违规行为识别算法检测到违规行为&#xff0c;将立即进行抓拍并发送告警信息给相关人员&#xff0c;以便及时采取相应的处置措施。OpenCV是一…

HT for Web (Hightopo) 使用心得(6)- 3D场景环境配置(天空球,雾化,辉光,景深)

在前一篇文章《Hightopo 使用心得&#xff08;5&#xff09;- 动画的实现》中&#xff0c;我们将一个直升机模型放到了3D场景中。同时&#xff0c;还利用动画实现了让该直升机围绕山体巡逻。在这篇文章中&#xff0c;我们将对上一篇的场景进行一些环境上的丰富与美化。让场景更…

02-基础例程2

基础例程2 01、直流电机 对于UL2003来说&#xff0c;可以看作是非门 输入为1&#xff0c;输出为0&#xff1b; 输入为0&#xff0c;输出为高组态[接一个上拉电阻即为1] 线路的连接 4路是用做步进电机的 对于直流电机&#xff0c;只需要一路。即异端接VCC&#xff0c;一段接…

unordered-------Hash

✅<1>主页&#xff1a;我的代码爱吃辣&#x1f4c3;<2>知识讲解&#xff1a;数据结构——哈希表☂️<3>开发环境&#xff1a;Visual Studio 2022&#x1f4ac;<4>前言&#xff1a;哈希是一种映射的思想&#xff0c;哈希表即使利用这种思想&#xff0c;…

基于野马算法优化的BP神经网络(预测应用) - 附代码

基于野马算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于野马算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.野马优化BP神经网络2.1 BP神经网络参数设置2.2 野马算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

【深入浅出设计模式--状态模式】

深入浅出设计模式--状态模式 一、背景二、问题三、解决方案四、 适用场景总结五、后记 一、背景 状态模式是一种行为设计模式&#xff0c;让你能在一个对象的内部状态变化时改变其行为&#xff0c;使其看上去就像改变了自身所属的类一样。其与有限状态机的概念紧密相关&#x…

RT-Thread在STM32硬件I2C的踩坑记录

RT-Thread在STM32硬件I2C的踩坑记录 0.前言一、软硬件I2C区别二、RT Thread中的I2C驱动三、尝试适配硬件I2C四、i2c-bit-ops操作函数替换五、Attention Please!六、总结 参考文章&#xff1a; 1.将硬件I2C巧妙地将“嫁接”到RTT原生的模拟I2C驱动框架 2.基于STM32F4平台的硬件I…

flutter 上传图片并裁剪

1.首先在pubspec.yaml文件中新增依赖pub.dev image_picker: ^0.8.75 image_cropper: ^4.0.1 2.在Android的AndroidManifest.xml文件里面添加权限 <activityandroid:name"com.yalantis.ucrop.UCropActivity"android:screenOrientation"portrait"andro…

Golang网络编程

互联网协议介绍引入 1. 物理层&#xff08;Physical Layer&#xff09;&#xff1a; - 功能&#xff1a;物理层负责定义物理介质传输数据的方式和规范&#xff0c;它传输的是原始数据比特流。 - 协议&#xff1a;Ethernet、Wi-Fi、USB、光纤等。 - 例子&#xff1a;将…

[javaWeb]Socket网络编程

网络编程&#xff1a;写一个应用程序,让这个程序可以使用网络通信。这里就需要调用传输层提供的 api。 Socket套接字 传输层提供协议&#xff0c;主要是两个: UDP和TCP 提供了两套不同的 api&#xff0c;这api也叫做socket api。 UDP和 TCP 特点对比&#xff1a; UDP: 无连…

数据结构day05(单链表)

今日任务&#xff1a; 思维导图&#xff1a; 实现 代码&#xff1a;&#xff08;多文件&#xff09; head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.h> #include <string.h> #include <stdlib.h> typedef int datatype;typedef struct Lin…

Nuxt3 与 Vue3 的 Server api 全栈开发之路

Nuxt Server Api 阅读时长&#xff1a;15分钟 本文内容&#xff1a; 国内关于Nuxt3的资料太少了&#xff0c;而Nuxt3又发布了没有多久&#xff0c;导致资料太少。本文浓缩讲解了&#xff0c;对于一个前端开发&#xff0c;上手使用 Nuxt3&#xff0c;并一个人承担前后端开发的所…

Hive3第六章:更换引擎

系列文章目录 Hive3第一章&#xff1a;环境安装 Hive3第二章&#xff1a;简单交互 Hive3第三章&#xff1a;DML数据操作 Hive3第三章&#xff1a;DML数据操作(二) Hive3第四章&#xff1a;分区表和分桶表 Hive3第五章&#xff1a;函数 Hive3第六章&#xff1a;更换引擎 文章目…

网络安全—0基础学习笔记(黑客)

一、前言 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发. 3.有时多 google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答. 4.遇到实在搞不懂的,可以先放放,以后再来解决. …

2023年智慧政务一网通办云平台顶层设计与建设方案PPT

导读&#xff1a;原文《2023年智慧政务一网通办云平台顶层设计与建设方案PPT》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 部分内容&#xff1a; 喜欢文章&#…

Spring——RESTful Web服务

文章目录 RESTful Web 服务介绍内容概览下载 Lombok 优化代码利器RESTful Web 服务开发运行项目并测试效果 RESTful Web 服务介绍 本节我们将开发一个简单的 RESTful Web 服务。 RESTful Web 服务与传统的 MVC 开发一个关键区别是返回给客户端的内容的创建方式&#xff1a;传…

Go操作各大消息队列教程(RabbitMQ、Kafka)

Go操作各大消息队列教程 1 RabbitMQ 1.1 概念 ①基本名词 当前市面上mq的产品很多&#xff0c;比如RabbitMQ、Kafka、ActiveMQ、ZeroMQ和阿里巴巴捐献给Apache的RocketMQ。甚至连redis这种NoSQL都支持MQ的功能。 Broker&#xff1a;表示消息队列服务实体Virtual Host&#x…

感觉车载测试的这一波敏捷风快过去了

敏捷&#xff0c;算不得汽车行业的原生产物&#xff0c;几年前&#xff0c;耳边很少听到这个字眼&#xff0c;基本算是在近几年传统汽车行业开始衰落的大背景下&#xff0c;而后伴随着软件从互联网等行业传进来的。 这两年&#xff0c;大家开始把敏捷谈得风生水起&#xff0c;…

用idea查看sqlite数据库idea sqlite

1、安装Database Navigator插件 2、导入数据库并查看 3、删除数据库连接 在此做个笔记

VUE环境下 CSS3+JS 实现发牌 翻牌

创建牌容器&#xff08;关键点&#xff1a;overflow&#xff1a;hidden&#xff09;&#xff1a; <div class"popup-box"></div> .popup-box {position: absolute;width: 100vw;height: 100vh;top: 0px;left: 0;overflow: hidden; } 创建每一张牌《固…