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

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

        作用:用于选择数码管的某一位,例如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);
}

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

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

相关文章

IMX6U Qt 开发环境

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、交叉编译 1. 安装通用 ARM 交叉编译工具链 2. 安装 Poky 交叉编译工具链 二、编译出厂源码 1. U-boot 2. 内核和模块 3. 编译出厂 Qt GUI 综合 Demo 前言…

【Oracle专栏】2个入参,生成唯一码处理

Oracle相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 1.背景 业务需要&#xff1a;2个参数&#xff0c;如 aidbankid &#xff0c;两个值是联合主键&#xff0c;需要生成一个固定唯一码&#xff0c;长度有限制32位&#xff0c;为了…

跨界融合:人工智能与区块链如何重新定义数据安全?

引言&#xff1a;数据安全的挑战与现状 在信息化驱动的数字化时代&#xff0c;数据已成为企业和个人最重要的资产之一。然而&#xff0c;随着网络技术的逐步优化和数据量的爆发式增长&#xff0c;数据安全问题也愈变突出。 数据安全现状&#xff1a;– 数据泄露驱动相关事件驱…

给DevOps加点料:融入安全性的DevSecOps

从前&#xff0c;安全防护只是特定团队的责任&#xff0c;在开发的最后阶段才会介入。当开发周期长达数月、甚至数年时&#xff0c;这样做没什么问题&#xff1b;但是现在&#xff0c;这种做法现在已经行不通了。 采用 DevOps 可以有效推进快速频繁的开发周期&#xff08;有时…

CDP中的Hive3之Hive Metastore(HMS)

CDP中的Hive3之Hive Metastore&#xff08;HMS&#xff09; 1、CDP中的HMS2、HMS表的存储&#xff08;转换&#xff09;3、HWC授权 1、CDP中的HMS CDP中的Hive Metastore&#xff08;HMS&#xff09;是一种服务&#xff0c;用于在后端RDBMS&#xff08;例如MySQL或PostgreSQL&a…

【算法】判断一个链表是否为回文结构

问&#xff1a; 给定一个单链表的头节点head&#xff0c;请判断该链表是否为回文结构 例&#xff1a; 1 -> 2 -> 1返回true&#xff1b;1 -> 2 -> 2 -> 1返回true&#xff1b;15 -> 6 -> 15返回true 答&#xff1a; 笔试&#xff1a;初始化一个栈用来…

Python双指针

双指针 双指针&#xff1a;在区间操作时&#xff0c;利用两个下标同时遍历&#xff0c;进行高效操作 双指针利用区间性质可以把 O ( n 2 ) O(n^2) O(n2) 时间降低到 O ( n ) O(n) O(n) 反向扫描 反向扫描&#xff1a; l e f t left left 起点&#xff0c;不断往右走&…

VMware虚拟机安装Home Assistant智能家居平台并实现远程访问保姆级教程

目录 前言 1. 安装Home Assistant 前言 本文主要介绍如何在windows 10 上用VMware Workstation 17 Pro搭建 Home Assistant OS Host os version&#xff1a;Windows 10 Pro, 64-bit (Build 19045.5247) 10.0.19045 VMware version:VMware Workstation 17 Pro 1. 安装Home …

【MySQL】SQL菜鸟教程(一)

1.常见命令 1.1 总览 命令作用SELECT从数据库中提取数据UPDATE更新数据库中的数据DELETE从数据库中删除数据INSERT INTO向数据库中插入新数据CREATE DATABASE创建新数据库ALTER DATABASE修改数据库CREATE TABLE创建新表ALTER TABLE变更数据表DROP TABLE删除表CREATE INDEX创建…

【Java回顾】Day5 并发基础|并发关键字|JUC全局观|JUC原子类

JUC全称java.util.concurrent 处理并发的工具包(线程管理、同步、协调) 一.并发基础 多线程要解决什么问题&#xff1f;本质是什么&#xff1f; CPU、内存、I/O的速度是有极大差异的&#xff0c;为了合理利用CPU的高性能&#xff0c;平衡三者的速度差异&#xff0c;解决办法…

自然语言转 SQL:通过 One API 将 llama3 模型部署在 Bytebase SQL 编辑器

使用 Open AI 兼容的 API&#xff0c;可以在 Bytebase SQL 编辑器中使用自然语言查询数据库。 出于数据安全的考虑&#xff0c;私有部署大语言模型是一个较好的选择 – 本文选择功能强大的开源模型 llama3。 由于 OpenAI 默认阻止出站流量&#xff0c;为了简化网络配置&#…

一学就废|Python基础碎片,文件读写

文件处理是指通过编程接口对文件执行诸如创建、打开、读取、写入和关闭等操作的过程。它涉及管理程序与存储设备上的文件系统之间的数据流&#xff0c;确保数据得到安全高效的处理。 Python 中的文件模式 打开文件时&#xff0c;我们必须指定我们想要的模式&#xff0c;该模式…

牛客网刷题 ——C语言初阶(6指针)——倒置字符串

1. 题目描述&#xff1a;倒置字符串 牛客网OJ题链接 描述 将一句话的单词进行倒置&#xff0c;标点不倒置。比如 I like beijing. 经过函数后变为&#xff1a;beijing. like I 输入描述&#xff1a; 每个测试输入包含1个测试用例&#xff1a; I like beijing. 输入用例长度不超…

YOLOv10改进,YOLOv10自研检测头融合HyCTAS的Self_Attention自注意力机制+添加小目标检测层(四头检测)+CA注意机制,全网首发

摘要 论文提出了一种新的搜索框架,名为 HyCTAS,用于在给定任务中自动搜索高效的神经网络架构。HyCTAS框架结合了高分辨率表示和自注意力机制,通过多目标优化搜索,找到了一种在性能和计算效率之间的平衡。 理论介绍 自注意力(Self-Attention)机制是HyCTAS框架中的一个重…

Web前端界面开发

前沿&#xff1a;介绍自适应和响应式布局 自适应布局&#xff1a;-----针对页面1个像素的变换而变化 就是我们上一个练习的效果 我们的页面效果&#xff0c;随着我们的屏幕大小而发生适配的效果&#xff08;类似等比例&#xff09; 如&#xff1a;rem适配 和 vw/vh适配 …

机器学习05-最小二乘法VS梯度求解

机器学习05-最小二乘法VS梯度求解 文章目录 机器学习05-最小二乘法VS梯度求解0-核心知识点梳理1-最小二乘法和梯度求解算法什么关系最小二乘法梯度求解算法两者的关系 2-最小二乘法可以求解非线性回归吗3-最小二乘法不使用梯度求解算法&#xff0c;给出一个简单的示例&#xff…

maven的简单介绍

目录 1、maven简介2、maven 的主要特点3、maven的下载与安装4、修改配置文件5、私服(拓展) 1、maven简介 Maven 是一个广泛使用的项目管理和构建工具&#xff0c;主要应用于 Java 项目。Maven 由 Apache 软件基金会开发和维护&#xff0c;它提供了一种简洁且一致的方法来构建、…

C++ 基础思维导图(三)异常-STL

1、异常 异常举例 BankAccount.h #ifndef BANK_ACCOUNT_H #define BANK_ACCOUNT_H#include <iostream> #include <stdexcept>class InsufficientFundsException : public std::runtime_error { public:InsufficientFundsException() : std::runtime_error("I…

【C++入门】详解(中)

目录 &#x1f495;1.函数的重载 &#x1f495;2.引用的定义 &#x1f495;3.引用的一些常见问题 &#x1f495;4.引用——权限的放大/缩小/平移 &#x1f495;5. 不存在的空引用 &#x1f495;6.引用作为函数参数的速度之快&#xff08;代码体现&#xff09; &#x1f4…

人工智能之数学基础:函数间隔和几何间隔

本文重点 在机器学习领域,尤其是支持向量机(SVM)算法中,函数间隔(Functional Margin)和几何间隔(Geometric Margin)是两个至关重要的概念。它们不仅用于描述数据点到超平面的距离,还直接影响到分类器的性能与泛化能力。本文将详细介绍这两个概念,并探讨它们之间的区…