EPS32基础篇开发

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

开发 EPS32基础篇

  • 前言
  • 一、GPIO输入输出
      • GPIO可设置一下4种状态
      • 代码示例:检测按键,按下时:LED亮,松开时,LED灭
  • 二、PWM输出
      • 示例代码:呼吸灯
  • 三、外部中断
      • 中断触发模式列举:attachInterrupt();函数
      • 代码示例:下降沿检测,计数
  • 四、ADC
      • 代码示例:ADC检测
  • 五、定时器
      • 代码示例:定时器
  • 六、DHT11
      • 代码示例:250ms读取一次温湿度
  • 七、u8g2驱动SSD1306 屏幕


前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、GPIO输入输出

  1. 输入模式 (INPUT):当将 pinMode(pin, INPUT)
    设置为输入模式时,该引脚允许从外部电路读取电平信号(高或低),例如连接到按钮、传感器等。
  2. 输出模式 (OUTPUT):通过 pinMode(pin,
    OUTPUT),你可以控制这个引脚作为通用的输出口,可以驱动LED或其他电子元件。
  3. 模拟输入模式 (ANALOGIN):如果你想要将该引脚作为一个ADC(模拟数字转换器)使用,获取电压值而不是简单的二进制状态,可以使用
    pinMode(pin, ANALOGIN)。

GPIO可设置一下4种状态

// 设置引脚2为输入模式
pinMode(2, INPUT);

// 设置引脚3为输出模式
pinMode(3, OUTPUT);

// 设置引脚4为输入上拉模式(假设Arduino板支持)
pinMode(4, INPUT_PULLUP);
// 设置引脚4为输入下拉模式(假设Arduino板支持)
pinMode(4, INPUT_PULLDOWN);

代码示例:检测按键,按下时:LED亮,松开时,LED灭

const int buttonPin = 2;  // 定义按键连接的引脚
int ledPin = 13;  // LED灯连接的引脚

void setup() {
  // 初始化串口通信,以便在串口监视器中查看输出
  Serial.begin(9600);
  // 设置按键引脚为输入模式
  pinMode(buttonPin, INPUT_PULLUP);
  // 设置LED引脚为输出模式
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // 读取按键状态
  int buttonState = digitalRead(buttonPin);
  // 在串口监视器中输出按键状态
  if (buttonState == HIGH) {
    Serial.println("Button is NOT pressed");
    digitalWrite(ledPin, LOW);  // 熄灭LED灯
  } else {
    Serial.println("Button is pressed");
    digitalWrite(ledPin, HIGH);  // 点亮LED灯
  }
  // 为了避免串口输出过快,添加一个小延迟
  delay(100);
}

二、PWM输出

在这里插入图片描述

基本概念和工作原理
PWM(脉宽调制)是一种用于控制电子设备亮度、音量等特性的技术。在Arduino ESP32中,PWM输出功能用于控制LED灯的亮度,或者驱动电机等。它通过在一定时间内改变高电平(通电)和低电平(断电)的时间比例,来控制设备的亮度或工作状态。

  1. 初始化PWM通道
    -------初始化PWM通道包括选择通道和设置相关参数。使用ledcSetup()函数来设置PWM通道的频率和分辨率。例如,要设置LEDC通道0的频率为1000Hz,分辨率为8位,可以调用ledcSetup(0, 1000, 8);。(有两种分辨率设置8位和10位)
  2. 绑定PWM通道到具体引脚
    ------将初始化后的PWM通道绑定到具体的GPIO引脚,需要使用ledcAttachPin()函数。该函数接受两个参数:要绑定的引脚编号和PWM通道编号。例如,要将引脚2绑定到LEDC通道0,可以调用ledcAttachPin(2, 0);。
  3. 设置PWM的占空比
    ------设置PWM的占空比,可以使用ledcWrite()函数。该函数接受两个参数:PWM通道的编号和要设置的占空比数值。例如,要将LEDC通道0的占空比设置为50%,可以调用ledcWrite(0, 128);,因为8位分辨率的PWM信号的占空比取值范围为0到255,所以128代表50%的占空比。

easeInOutQuad函数 是一种非常有用的缓动函数,它可以在多种应用场景中产生平滑、自然的动画效果;

示例代码:呼吸灯

#define LED_PIN 14        // LED连接的引脚
#define LEDC_CHANNEL 0    // PWM通道
#define LEDC_FREQ 1000    // PWM频率
#define LEDC_RESOLUTION 8 // 分辨率

// 缓动函数
float easeInOutQuad(float t) {
  if (t < 0.5) return 2 * t * t;
  else         return -1 + (4 - 2 * t) * t;
}

void setup() {
  // 初始化PWM通道
  ledcSetup(LEDC_CHANNEL, LEDC_FREQ, LEDC_RESOLUTION);
  // 将LED引脚绑定到PWM通道
  ledcAttachPin(LED_PIN, LEDC_CHANNEL);
}

void loop() {
  // LED亮度渐增
  for (int i = 0; i <= 255; i++) {
    float t = i / 255.0;
    int dutyCycle = easeInOutQuad(t) * 255;
    ledcWrite(LEDC_CHANNEL, dutyCycle);  // 设置PWM的占空比
    delay(10);  // 延时10毫秒(根据需要调整)
  }

  // LED亮度渐减
  for (int i = 255; i >= 0; i--) {
    float t = i / 255.0;
    int dutyCycle = easeInOutQuad(t) * 255;
    ledcWrite(LEDC_CHANNEL, dutyCycle);  // 设置PWM的占空比
    delay(10);  // 延时10毫秒(根据需要调整)
  }
}

三、外部中断

ESP32的所有GPIO引脚(除了34-39之外)都可以被配置为中断引脚。

中断触发模式列举:attachInterrupt();函数

  1. CHANGE:当外部中断引脚的电平发生变化时触发中断,无论是从低到高还是从高到低。
  2. RISING:当外部中断引脚从低电平变为高电平时触发中断。上升沿
  3. FALLING:当外部中断引脚从高电平变为低电平时触发中断。下降沿
  4. ONLOW:当外部中断引脚处于低电平时触发中断。
  5. ONHIGH:当外部中断引脚处于高电平时触发中断。

代码示例:下降沿检测,计数

// 定义外部中断引脚
#define INTERRUPTION_PIN 14
// 定义用于计数的变量
volatile int count = 0;

// 中断服务程序
void IRAM_ATTR handleInterrupt() {
  // 增加计数
  count++;
}

void setup() {
  // 初始化串口通信,用于调试
  Serial.begin(115200);

  // 配置外部中断引脚为输入模式
  pinMode(INTERRUPTION_PIN, INPUT_PULLUP);

  // 确保在attachInterrupt之前,引脚4处于高电平状态
  digitalWrite(INTERRUPTION_PIN, HIGH);
  delay(1); // 短暂延时,确保引脚状态稳定

  // 附加中断服务程序到外部中断引脚
  attachInterrupt(digitalPinToInterrupt(INTERRUPTION_PIN), handleInterrupt, FALLING);

  // 输出初始计数
  Serial.println("Initial count: " + String(count));
}

void loop() {
  // 延时一段时间,然后输出当前计数
  delay(1000);
  Serial.println("Current count: " + String(count));
}

四、ADC

使用注意事项:
ESP32的ADC驱动程序API支持ADC1和ADC2。
ADC1有8个通道,连接到GPIO 32-39。
ADC2有10个通道,连接到GPIO 0, 2, 4, 12-15和25-27。但请注意,ADC2与Wi-Fi模块共享资源,因此在使用ADC2时需要注意Wi-Fi状态。
高精度:采用12位分辨率,可以提供较为精确的转换结果。
多通道支持:支持18个模拟输入管脚,满足多种应用场景的需求。
低功耗:部分控制器支持Deep-sleep模式下的低功耗运行。
灵活配置:可配置多种分辨率(如12位、11位、10位、9位)
在这里插入图片描述

代码示例:ADC检测

#include <Arduino.h>

const int analogPin = 35; // 定义模拟输入引脚

void setup() {
  Serial.begin(9600); // 初始化串口通信
  pinMode(analogPin, INPUT); // 设置模拟输入引脚为输入模式
  analogReadResolution(12); // 设置ADC分辨率为13位
  analogSetAttenuation(ADC_11db); // 设置ADC衰减倍数为11dB
}

void loop() {
  int sensorValue = analogRead(analogPin); // 读取模拟输入值
  Serial.println(sensorValue); // 打印读取的ADC值
  delay(1000); // 延迟1秒
}

五、定时器

在这里插入图片描述

代码示例:定时器


#define LED_PIN 12 // GPIO2,通常内建LED在ESP32上

// 创建定时器句柄
hw_timer_t * timer = NULL;

// 定义一个标志位用于指示是否要处理定时器事件
volatile bool timerFlag = false;

void IRAM_ATTR onTimer() {
  // 这是定时器中断服务程序 (ISR)
  timerFlag = true;
}

void setup() {
  Serial.begin(115200);
  
  pinMode(LED_PIN, OUTPUT); // 设置LED引脚为输出模式
  digitalWrite(LED_PIN, LOW); // 初始状态关闭LED

  // 设置定时器
  timer = timerBegin(0, 80, true); // 分频因子80意味着定时器计数频率为20MHz/80=250kHz
  timerAttachInterrupt(timer, &onTimer, true); // 将ISR关联到定时器
  timerAlarmWrite(timer, 250000, true); // 每250000微秒(即每秒)产生一次中断
  timerAlarmEnable(timer); // 启用定时器报警
}

void loop() {
  if (timerFlag) {
    // 处理定时器事件
    static bool ledState = false;
    ledState = !ledState; // 反转LED状态
    digitalWrite(LED_PIN, ledState);
    
    Serial.println("Timer triggered!");
    
    timerFlag = false; // 重置标志位
  }
}

六、DHT11

代码示例:250ms读取一次温湿度

#include "DHT.h" // 包含DHT库

#define LED_PIN 14         // GPIO12,通常内建LED在ESP32上
#define DHTPIN 4           // DHT11连接到GPIO4
#define DHTTYPE DHT11      // 使用DHT 11

// 创建定时器句柄
hw_timer_t * timer = NULL;

// 定义一个标志位用于指示是否要处理定时器事件
volatile bool timerFlag = false;

// 创建DHT对象
DHT dht(DHTPIN, DHTTYPE);

void IRAM_ATTR onTimer() {
  // 这是定时器中断服务程序 (ISR)
  timerFlag = true;
}

void setup() {
  Serial.begin(115200);
  
  pinMode(LED_PIN, OUTPUT); // 设置LED引脚为输出模式
  digitalWrite(LED_PIN, LOW); // 初始状态关闭LED

  // 初始化DHT传感器
  dht.begin();

  // 设置定时器
  timer = timerBegin(0, 80, true); // 分频因子80意味着定时器计数频率为20MHz/80=250kHz
  timerAttachInterrupt(timer, &onTimer, true); // 将ISR关联到定时器
  timerAlarmWrite(timer, 250000, true); // 每250000微秒(即每秒)产生一次中断
  timerAlarmEnable(timer); // 启用定时器报警
}

void loop() {
  if (timerFlag) {
    // 处理定时器事件
    static bool ledState = false;
    ledState = !ledState; // 反转LED状态
    digitalWrite(LED_PIN, ledState);
    
    // 读取温度和湿度
    float humidity = dht.readHumidity();
    float temperature = dht.readTemperature();

    // 检查是否成功读取
    if (isnan(humidity) || isnan(temperature)) {
      Serial.println("Failed to read from DHT sensor!");
    } else {
      // 打印结果
      Serial.print("Humidity: ");
      Serial.print(humidity);
      Serial.print("%  Temperature: ");
      Serial.print(temperature);
      Serial.println("°C");
    }

    Serial.println("Timer triggered!");

    timerFlag = false; // 重置标志位
  }
}

实验现象
在这里插入图片描述

七、u8g2驱动SSD1306 屏幕

#include <Wire.h>
#include <U8g2lib.h>
#include "DHT.h"

// DHT传感器配置
#define DHTPIN 4           // DHT11连接到GPIO4
#define DHTTYPE DHT11      // 使用DHT 11
// 定义OLED的宽度和高度
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

// 定义I2C地址和引脚
#define OLED_SDA_PIN 21
#define OLED_SCL_PIN 22
#define OLED_I2C_ADDRESS 0x3C // SSD1306 I2C 地址,默认为0x3C或0x3D


// 创建对象
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ OLED_SCL_PIN, /* data=*/ OLED_SDA_PIN, /* reset=*/ U8X8_PIN_NONE);

DHT dht(DHTPIN, DHTTYPE);

// 创建定时器句柄
hw_timer_t * timer = NULL;
bool timerFlag500ms = false;
void IRAM_ATTR onTimer() {
  // 这是定时器中断服务程序 (ISR)
  timerFlag500ms = true;
}
//函数声明
void DISPLAY_Refresh();

void setup() {
  Serial.begin(115200);
  
  // 初始化U8g2库
  u8g2.begin();
  u8g2.enableUTF8Print(); // 启用UTF-8支持
  // 初始化DHT传感器
  dht.begin();
  // 设置默认字体大小
  u8g2.setFont(u8g2_font_wqy12_t_gb2312); // 使用支持中文的字体

    // 设置定时器
  timer = timerBegin(0, 80, true); // 分频因子80意味着定时器计数频率为20MHz/80=250kHz
  timerAttachInterrupt(timer, &onTimer, true); // 将ISR关联到定时器
  timerAlarmWrite(timer, 50000, true); // 每250000微秒(即每秒)产生一次中断
  timerAlarmEnable(timer); // 启用定时器报警
}

void loop() {
  if(  timerFlag500ms == true)
  {
     timerFlag500ms = false;
     DISPLAY_Refresh();
  }
}
//刷新屏幕显示
void DISPLAY_Refresh()
{
    // 处理定时器事件
    // 读取温度和湿度
    float humidity = dht.readHumidity();
    float temperature = dht.readTemperature();
 
  // 清除屏幕缓冲区
  u8g2.clearBuffer();

  // 设置光标位置并打印中文字符
  u8g2.setCursor(0, 20);
  u8g2.print("温度:"); // 中文文本
  u8g2.setCursor(30, 20);
  u8g2.print( temperature);
  u8g2.print("℃");
  u8g2.setCursor(0, 40);
  u8g2.print("湿度:"); // 中文文本
  u8g2.setCursor(30, 40);
  u8g2.print( humidity);
  u8g2.print("%");

  // 设置光标位置并打印英文字符
  u8g2.setCursor(0, 60);
  u8g2.print("Hello, World!");

  // 将缓冲区内容发送到显示屏
  u8g2.sendBuffer();
}

在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Backend - C# 的日志 NLog日志

目录 一、注入依赖和使用 logger 二、配置记录文件 1.安装插件 NLog 2.创建 nlog.config 配置文件 3. Programs配置日志信息 4. 设置 appsettings.json 的 LogLevel 5. 日志设定文件和日志级别的优先级 &#xff08;1&#xff09;常见的日志级别优先级 &#xff08;2&…

【游戏设计原理】47 - 超游戏思维

对于这条原理&#xff0c;我首先想到的是开放世界&#xff0c;或者探索性游戏&#xff0c;这是最能包容各类玩家的游戏类型。这类游戏定义了基本规则&#xff0c;玩家的可操作性很强。就像上图里的沙池一样&#xff0c;里面有滑梯&#xff0c;是规则性比较明确的&#xff0c;而…

24年无人机行业资讯 | 12.23-12.29

24年无人机行业资讯 | 12.23-12.29 1、 国家发改委新设低空经济司&#xff0c;助力低空经济规范发展2、商务部支持无人机民用国际贸易&#xff0c;强调出口管制与安全并重3、滨州高新区首架无人机成功下线4、 2025第九届世界无人机大会筹备推进会顺利召开5、2024年世界无人机竞…

【专题】2024年出口跨境电商促销趋势白皮书报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p38722 在当今全球化加速演进、数字经济蓬勃发展的大背景下&#xff0c;跨境电商行业正以前所未有的态势重塑国际贸易格局&#xff0c;成为各方瞩目的焦点领域。 根据亚马逊发布的《2024年出口跨境电商促销趋势白皮书》&#xff0c;…

SMMU软件指南之系统架构考虑

安全之安全(security)博客目录导读 目录 5.1 I/O 一致性 5.2 客户端设备 5.2.1 地址大小 5.2.2 缓存 5.3 PCIe 注意事项 5.3.1 点对点通信 5.3.2 No_snoop 5.3.3 ATS 5.4 StreamID 分配 5.5 MSI 本博客介绍与 SMMU 相关的一些系统架构注意事项。 5.1 I/O 一致性 如…

mysql自定义安装

1、下载安装包 我是在windows上安装&#xff0c;所以选择“Mysql Installer for Windows” 2、安装mysql 双击“mysql-installer-community-8.0.40.0.msi”&#xff0c;开始启动安装 这里选择安装项&#xff0c;这里只选择了两项。workbench是图形化管理工具&#xff0c;比较吃…

Python、R用深度学习神经网络组合预测优化能源消费总量时间序列预测及ARIMA、xgboost对比...

全文链接&#xff1a;https://tecdat.cn/?p38726 分析师&#xff1a;Qingxia Wang 在能源领域&#xff0c;精准预测能源消费总量对制定合理能源战略至关重要。当前&#xff0c;能源消费预测分析主要运用单一模型&#xff08;如灰色预测法、时间序列分析法等&#xff09;和组合…

AI周报(12.29-1.4)

AI应用-微软BiomedParse一键解析九大成像模式 BiomedParse是一款由微软和华盛顿大学等机构联合开发的生物医学图像解析模型&#xff0c;能够一键解析九大生物医学成像模式。该模型通过文本驱动的方式&#xff0c;整合了包括MRI、CT、病理学等多种成像模式&#xff0c;实现了高…

电商Google广告:2025年提升转化率的5种策略

展望 2025 年&#xff0c;Google 广告领域将迎来一系列显著变化&#xff0c;这些趋势对于提升广告转化率至关重要&#xff0c;值得我们提前关注与布局。 智能化程度持续加深&#xff0c;用户搜索习惯愈发精细&#xff0c;广告格式推陈出新&#xff0c;视频广告势头正猛...那么…

一文讲清楚HTTP常见的请求头和应用

文章目录 一文讲清楚HTTP常见的请求头和应用1. 啥是个HTTP请求头2. 常见的请求头&#xff0c;作用和示例3.协商缓存4.会话状态 一文讲清楚HTTP常见的请求头和应用 1. 啥是个HTTP请求头 一句话&#xff0c;说白了就是限定HTTP传输的一些规则参数&#xff0c;比如Accept&#xf…

Arduino 小白的 DIY 空气质量检测仪(5)- OLED显示模块、按钮模块

最终章 这一章把剩下的OLED显示模块、按钮模块分享一下&#xff0c;当前这个离线无存储的版本&#xff0c;基本告一段落。 如果后续能进化成&#x1f236;存储、联网版本&#xff0c;就再开一个小系列分享一下。 逐个分析 display.h #include <Arduino.h> #include &l…

WandB使用笔记

最近看代码&#xff0c;发现代码中有wandb有关的内容&#xff0c;搜索了一下发现是一个模型训练工具&#xff0c;然后学习了一下&#xff0c;这里记录一下使用过程&#xff0c;方便以后查阅。 WandB使用笔记 登录WandB 并 创建团队安装 WandB 并 登录模型训练过程跟踪模型版本管…

一文理解ssh,ssl协议以及应用

在使用基于密钥的认证方式的时候&#xff0c;私钥的位置一定要符合远程服务器规定的位置&#xff0c;否则找不到私钥的位置会导致建立ssh连接失败 SSH 全称是 “Secure Shell”&#xff0c;即安全外壳协议。 它是一种网络协议&#xff0c;用于在不安全的网络中安全地进行远程登…

Elasticsearch 创建索引 Mapping映射属性 索引库操作 增删改查

Mapping Type映射属性 mapping是对索引库中文档的约束&#xff0c;有以下类型。 text&#xff1a;用于分析和全文搜索&#xff0c;通常适用于长文本字段。keyword&#xff1a;用于精确匹配&#xff0c;不会进行分析&#xff0c;适用于标签、ID 等精确匹配场景。integer、long…

【Ubuntu】 Ubuntu22.04搭建NFS服务

安装NFS服务端 sudo apt install nfs-kernel-server 安装NFS客户端 sudo apt install nfs-common 配置/etc/exports sudo vim /etc/exports 第一个字段&#xff1a;/home/lm/code/nfswork共享的目录 第二个字段&#xff1a;指定哪些用户可以访问 ​ * 表示所有用户都可以访…

【谷歌开发者月刊】十二月精彩资讯回顾,探索科技新可能

我们在今年的尾声中回顾本月精彩&#xff0c;开发者们借助创新技术为用户打造温暖的应用体验&#xff0c;展现技术与实用的结合。欢迎您查阅本期月刊&#xff0c;掌握最新动态。 本月看点 精彩看点多多&#xff0c;请上下滑动阅览 01DevFest 北京站和上海站圆满举办&#xff0c…

浙江中医药大学携手云轴科技ZStack荣获“鼎信杯”金鼎实践奖

近日&#xff0c;2024“鼎信杯”信息技术发展论坛&#xff08;以下简称“论坛”&#xff09;在北京隆重召开。本次论坛汇聚多位领导和专家&#xff0c;以及业内骨干企业、研究机构、用户单位、行业组织代表等500余人&#xff0c;共同探讨信息技术应用创新产业趋势&#xff0c;分…

嵌入式linux系统中CMake的基本用法

第一:CMake的基本使用 在上篇文章中,我们聊了聊 Makefile。虽然它是 C/C++ 项目编译的“老司机”,但写起来真的是让人头大。尤其是当项目文件一多,手写依赖就像在搬砖,费时又费力。 那么问题来了,难道我们就没有更优雅的工具了吗?答案是:有! 这时候,CMake 就像一个…

vulnhub Earth靶机

搭建靶机直接拖进来就行 1.扫描靶机IP arp-scan -l 2.信息收集 nmap -sS -A -T4 192.168.47.132 得到两个DNS; 在443端口处会让我们加https dirb https://earth.local/ dirb https://terratest.earth.local/ #页面下有三行数值 37090b59030f11060b0a1b4e0000000000004312170a…

【AI日记】25.01.04 kaggle 比赛 3-3 | 王慧玲与基层女性

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加&#xff1a;kaggle 比赛 Forecasting Sticker Sales时间&#xff1a;6 小时 读书 书名&#xff1a;基层女性时间&#xff1a;3 小时原因&#xff1a;虽然我之前就知道这个作者&#xff0c;因为我…