25/1/12 嵌入式笔记 学习esp32

news2025/1/14 1:51:43

了解了一下位选线和段选线的知识:
位选线:

        作用:用于选择数码管的某一位,例如4位数码管的第1位,第2位)

                   通过控制位选线的电平(高低电平),决定当前哪一位数码管处于激活状态。

        示例:

                   假设有4位数码管,位选线分别位D1,D2,D3,D4.

                   如果要显示第2位,设置D2 = LOW或D2 = HIGH,其他位选线设置位相反电平。

段选线:

         作用:用于控制数码管上某一位显示的具体数字或字符。

                    数码管的每一段(如a,b,c,d,e,f,g,dp)对应一个段选线。

          对于共阴极数码管:

                    将某一段的段选线设置为高电平HIHG,该段点亮,设置位LOW,熄灭

          对于共阳则相反。

           示例,要显示数字7,需要点亮段a,b,c.

                      对于共阴极数码管,设置a = HIGH,b=HIGH.c = HIGH,其他位LOW。

意思就是位选线是切换数码管的位,段就是一位数码管的那一小段。

为什么分阴阳极?

1.电路设计灵活,不同的电路设计可能需要不同的电平逻辑。

2.电源和接地方便性,在某些电路中,可能更容易提供高电平或低电平。

3.驱动芯片的兼容性,不同的驱动芯片可能支持不同的电平逻辑。

动态扫描:

数码管上的数字显示都是通过动态扫描完成的。

// 定义位选线引脚
int seg_1 = 5;
int seg_2 = 18;
int seg_3 = 19;
int seg_4 = 21;

// 定义位选线数组
int seg_array[4] = {seg_1, seg_2, seg_3, seg_4};

// 定义段选线引脚
int a = 32;
int b = 25;
int c = 27;
int d = 12;
int e = 13;
int f = 33;
int g = 26;
int dp = 14;

// 定义段选线数组
int led_array[8] = {a, b, c, d, e, f, g, dp};

// 定义数字显示逻辑的二维数组(共阴极数码管)
int number_array[10][8] = {
  {1, 1, 1, 1, 1, 1, 0, 0}, // 0
  {0, 1, 1, 0, 0, 0, 0, 0}, // 1
  {1, 1, 0, 1, 1, 0, 1, 0}, // 2
  {1, 1, 1, 1, 0, 0, 1, 0}, // 3
  {0, 1, 1, 0, 0, 1, 1, 0}, // 4
  {1, 0, 1, 1, 0, 1, 1, 0}, // 5
  {1, 0, 1, 1, 1, 1, 1, 0}, // 6
  {1, 1, 1, 0, 0, 0, 0, 0}, // 7
  {1, 1, 1, 1, 1, 1, 1, 0}, // 8
  {1, 1, 1, 1, 0, 1, 1, 0}  // 9
};

// 清屏函数
void clear() {
  // 关闭所有位选线
  for (int i = 0; i < 4; i++) {
    digitalWrite(seg_array[i], HIGH);
  }
  // 关闭所有段选线
  for (int i = 0; i < 8; i++) {
    digitalWrite(led_array[i], LOW);
  }
}

// 显示数字的函数
void display_number(int order, int number) {
  // 清屏
  clear();

  // 将对应位选线的电平拉低
  digitalWrite(seg_array[order], LOW);

  // 显示数字
  for (int i = 0; i < 8; i++) {
    digitalWrite(led_array[i], number_array[number][i]);
  }
}

// 4位数码管显示函数
void display_4_number(int number) {
  // 确保数字在 0 到 9999 之间
  if (number >= 0 && number < 10000) {
    // 获取每一位对应的数字
    int digits[4];
    for (int i = 3; i >= 0; i--) {
      digits[i] = number % 10;
      number /= 10;
    }

    // 显示4位数
    for (int i = 0; i < 4; i++) {
      display_number(i, digits[i]);
      delay(5); // 短暂延时,避免闪烁
    }
  }
}

void setup() {
  // 设置所有位选线引脚为输出模式,并初始化为高电平(关闭)
  for (int i = 0; i < 4; i++) {
    pinMode(seg_array[i], OUTPUT);
    digitalWrite(seg_array[i], HIGH);
  }

  // 设置所有段选线引脚为输出模式,并初始化为低电平(关闭)
  for (int i = 0; i < 8; i++) {
    pinMode(led_array[i], OUTPUT);
    digitalWrite(led_array[i], LOW);
  }
}

void loop() {
  // 显示数字 34
  display_4_number(34);
}

按键实验

//定义开关引脚
int led_pin = 2;
int button_pin = 14;
//记录led状态是否更改过的值
bool status = false;
int led_logic = 0; // LED 的当前状态
void setup(){
  //配置引脚模式
  pinMode(led_pin,OUTPUT);
  pinMode(button_pin,INPUT_PULLDOWN);
}

void loop(){
  //按键消抖
  //如果当前按钮与上次不同,说明按钮发生了变化
  if(digitalRead(button_pin)){
    //睡眠10ms,如果依然是高电平,说明是按下并非抖动
    delay(500);
    if(digitalRead(button_pin)&& !status){
      led_logic = !led_logic;
      digitalWrite(led_pin,led_logic);
      //修改status
      status = !status;
    }else if(digitalRead(button_pin)){
      status = false;
    }
  }
  
}

INPUT_PULLDOWN表示启用内部下拉电阻。

status:用于记录按钮是否已经触发过状态切换,避免按钮按下时多次出发LED状态的切换。

按钮消抖逻辑,状态切换:status作用时确保每次按钮按下只触发一次状态切换。切换LED状态后,将status设置位true,避免重复触发。

宏定义与变量定义的区别:

PWM呼吸灯

占空比:一个周期内高电平出现时间占总的比例

频率:1秒内信号从高电平到低电平再回到高电平的次数,一秒钟PWM的周期次数

PWM主要通过输出不同频率,占空比的方波,实现固定频率或平均电压输出,,频率固定,改变占空比可改变输出电压。

analogWrite函数:在指定的引脚上输出一个PWM信号,通过改变PWM信号的占空比,控制输出电平的平均值,从而实现对LED亮度、电机速度等的调整。

函数实现呼吸灯

#define LED_PIN 12

void setup(){
  //配置GPIO输出
  pinMode(LED_PIN,OUTPUT);
  
}
void loop(){
  //实现渐亮效果
  for(int i=0;i<256;i++){
    analogWrite(LED_PIN,i);
    delay(10);
  }
  //实现渐灭效果
  for(int i=255;i>=0;i--){
    analogWrite(LED_PIN,i);
    delay(10);
  }
}

普通实现

#define FREQ 2000       // PWM 频率
#define CHANNEL 0       // PWM 通道
#define RESOLUTION 8    // PWM 分辨率(8 位 = 0~255)
#define LED 12          // LED 引脚

void setup() {
  // 配置 LEDC 通道
  ledcSetup(CHANNEL, FREQ, RESOLUTION);
  // 将 LEDC 通道绑定到指定引脚
  ledcAttachPin(LED, CHANNEL);
}

void loop() {
  // 实现渐亮效果
  for (int i = 0; i < (1 << RESOLUTION); i++) {
    ledcWrite(CHANNEL, i); // 设置 PWM 占空比
    delay(10);             // 延迟 10ms
  }

  // 实现渐灭效果
  for (int i = (1 << RESOLUTION) - 1; i >= 0; i--) {
    ledcWrite(CHANNEL, i); // 设置 PWM 占空比
    delay(10);             // 延迟 10ms
  }
}

ADC模数转换器

串口监视器是 Arduino IDE 提供的一个工具,用于通过串口通信与开发板(如 Arduino、ESP32 等)进行数据交互。它的主要作用是:1调试和监控程序运行,2.发送数据到开发板,3.实时查看传感器数据。4.交互式控制。

串口通信(Serial Communication)是一种通过串行接口逐位传输数据的通信方式。与并行通信(同时传输多个位)不同,串口通信一次只传输一个位,适合长距离传输和减少硬件复杂性。

波特率是串口通信中数据传输速率的度量,表示每秒传输的符号数(Symbols per second)。每个符号可以代表一个或多个位。

#define POT 26  // 定义电位计连接的引脚

int pot_value;  // 用于存储电位计的模拟输入值

void setup() {
  // 设置串口通信波特率
  Serial.begin(9600);
  // 设置引脚为输入模式(可选)
  pinMode(POT, INPUT);
}

void loop() {
  // 读取电位计的模拟输入值
  pot_value = analogRead(POT);
  // 打印模拟输入值到串口监视器
  Serial.println(pot_value);
  // 延迟 50 毫秒
  delay(50);
}

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

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

相关文章

探秘block原理

01 概述 在iOS开发中&#xff0c;block大家用的都很熟悉了&#xff0c;是iOS开发中闭包的一种实现方式&#xff0c;可以对一段代码逻辑进行封装&#xff0c;使其可以像数据一样被传递、存储、调用&#xff0c;并且可以保存相关的上下文状态。 很多block原理性的文章都比较老&am…

【Docker】入门教程

目录 一、Docker的安装 二、Docker的命令 Docker命令实验 1.下载镜像 2.启动容器 3.修改页面 4.保存镜像 5.分享社区 三、Docker存储 1.目录挂载 2.卷映射 四、Docker网络 1.容器间相互访问 2.Redis主从同步集群 3.启动MySQL 五、Docker Compose 1.命令式安装 …

Bootstrap 前端 UI 框架

Bootstrap官网&#xff1a;Bootstrap中文网 铂特优选 Bootstrap 下载 点击进入中文文档 点击下载 生产文件是开发响应式网页应用&#xff0c;源码是底层逻辑代码&#xff0c;因为是要制作响应式网页&#xff0c;所以下载开发文件 引入 css 文件&#xff0c; bootstrap.css 和 …

Docker与微服务实战2-基础篇

1.学习一门新技术的理念 1.是什么 2.能干吗 3.去哪下载 4.怎么玩 5.永远的helloworld跑起来一次 AB法则 before 与 after 的对比 2.为什么会有Docker出现 3.docker理念 解决了运行环境和配置问题的软件容器&#xff0c;方便做持续集成并有助于整体发布的容器虚拟化…

蓝桥杯_B组_省赛_2022(用作博主自己学习)

题目链接算法11.九进制转十进制 - 蓝桥云课 进制转换 21.顺子日期 - 蓝桥云课 时间与日期 31.刷题统计 - 蓝桥云课 时间与日期 41.修剪灌木 - 蓝桥云课 思维 51.X 进制减法 - 蓝桥云课 贪心 61.统计子矩阵 - 蓝桥云课 二维前缀和 71.积木画 - 蓝桥云课 动态规划 82.扫雷 - 蓝桥…

CES 2025|美格智能高算力AI模组助力“通天晓”人形机器人震撼发布

当地时间1月7日&#xff0c;2025年国际消费电子展&#xff08;CES 2025&#xff09;在美国拉斯维加斯正式开幕。美格智能合作伙伴阿加犀联合高通在展会上面向全球重磅发布人形机器人原型机——通天晓&#xff08;Ultra Magnus&#xff09;。该人形机器人内置美格智能基于高通QC…

PyMysql 01|(包含超详细项目实战)连接数据库、增删改查、异常捕获

目录 一、数据库操作应用场景 二、安装PyMysql 三、事务的概念 四、数据库的准备 五、PyMysql连接数据库 1、建立连接方法 2、入门案例 六、PyMysql操作数据库 1、数据库查询 1️⃣查询操作流程 2️⃣cursor游标 ​3️⃣查询常用方法 4️⃣案例 5️⃣异常捕获 …

了解Node.js

Node.js是一个基于V8引擎的JavaScript运行时环境&#xff0c;它允许JavaScript代码在服务器端运行&#xff0c;从而实现后端开发。Node.js的出现&#xff0c;使得前端开发人员可以利用他们已经掌握的JavaScript技能&#xff0c;扩展技能树并成为全栈开发人员。本文将深入浅出地…

Unreal Engine 5 (UE5) Metahuman 的头部材质

在图中&#xff0c;你展示了 Unreal Engine 5 (UE5) Metahuman 的头部材质部分&#xff0c;列出了头部材质的多个元素。以下是对每个部分的解释&#xff1a; 材质解释 Element 0 - MI_HeadSynthesized_Baked 作用&#xff1a; 这是 Metahuman 的主要头部材质&#xff0c;控制整…

《自动驾驶与机器人中的SLAM技术》ch7:基于 ESKF 的松耦合 LIO 系统

目录 基于 ESKF 的松耦合 LIO 系统 1 坐标系说明 2 松耦合 LIO 系统的运动和观测方程 3 松耦合 LIO 系统的数据准备 3.1 CloudConvert 类 3.2 MessageSync 类 4 松耦合 LIO 系统的主要流程 4.1 IMU 静止初始化 4.2 ESKF 之 运动过程——使用 IMU 预测 4.3 使用 IMU 预测位姿进…

SQL从入门到实战-2

高级语句 窗口函数 排序窗口函数 例题二十九 select yr,party,votes, rank() over (PARTITION BY yr ORDER BY votes desc) as pson from ge where constituency S14000021 order by party,yr 偏移分析函数 例题三十 select name,date_format(whn,%Y-%m-%d) data, confi…

Spring Security单点登录

本文介绍了Spring Security单点登录的概念和基本原理。单点登录是指用户只需登录一次&#xff0c;即可在多个相互信任的系统中实现无缝访问和授权。通过Spring Security框架的支持&#xff0c;可以实现有效的用户管理和权限控制。最后&#xff0c;本文提供了实际应用案例&#…

LKT4304新一代算法移植加密芯片,守护物联网设备和云服务安全

凌科芯安作为一家在加密芯片领域深耕18年的企业&#xff0c;主推的LKT4304系列加密芯片集成了身份认证、算法下载、数据保护和完整性校验等多方面安全防护功能&#xff0c;可以为客户的产品提供一站式解决方案&#xff0c;并且在调试和使用过程提供全程技术支持&#xff0c;针对…

浅谈云计算04 | 云基础设施机制

探秘云基础设施机制&#xff1a;云计算的基石 一、云基础设施 —— 云计算的根基![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/1fb7ff493d3c4a1a87f539742a4f57a5.png)二、核心机制之网络&#xff1a;连接云的桥梁&#xff08;一&#xff09;虚拟网络边界&#xff…

Qt C++读写NFC标签NDEF网址URI

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1biFgjSs&ftt&id615391857885 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include "QLibrary" …

Java 如何传参xml调用接口获取数据

传参和返参的效果图如下&#xff1a; 传参&#xff1a; 返参&#xff1a; 代码实现&#xff1a; 1、最外层类 /*** 外层DATA类*/ XmlRootElement(name "DATA") public class PointsXmlData {private int rltFlag;private int failType;private String failMemo;p…

2024年度漏洞态势分析报告,需要访问自取即可!(PDF版本)

2024年度漏洞态势分析报告&#xff0c;需要访问自取即可!(PDF版本),大家有什么好的也可以发一下看看

不同音频振幅dBFS计算方法

1. 振幅的基本概念 振幅是描述音频信号强度的一个重要参数。它通常表示为信号的幅度值&#xff0c;幅度越大&#xff0c;声音听起来就越响。为了更好地理解和处理音频信号&#xff0c;通常会将振幅转换为分贝&#xff08;dB&#xff09;单位。分贝是一个对数单位&#xff0c;能…

Nginx反向代理请求头有下划线_导致丢失问题处理

后端发来消息说前端已经发了但是后端没收到请求。 发现是下划线的都没收到&#xff0c;搜索之后发现nginx默认request的header中包含’_’时&#xff0c;会自动忽略掉。 解决方法是&#xff1a;在nginx里的nginx.conf配置文件中的http部分中添加如下配置&#xff1a; unders…

C语言程序环境和预处理详解

本章重点&#xff1a; 程序的翻译环境 程序的执行环境 详解&#xff1a;C语言程序的编译链接 预定义符号介绍 预处理指令 #define 宏和函数的对比 预处理操作符#和##的介绍 命令定义 预处理指令 #include 预处理指令 #undef 条件编译 程序的翻译环境和执行环…