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

打印 上一主题 下一主题

主题 781|帖子 781|积分 2343

了解了一下位选线和段选线的知识:
位选线:
        作用:用于选择数码管的某一位,比方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.驱动芯片的兼容性,差别的驱动芯片可能支持差别的电平逻辑。
动态扫描:
数码管上的数字显示都是通过动态扫描完成的。
  1. // 定义位选线引脚
  2. int seg_1 = 5;
  3. int seg_2 = 18;
  4. int seg_3 = 19;
  5. int seg_4 = 21;
  6. // 定义位选线数组
  7. int seg_array[4] = {seg_1, seg_2, seg_3, seg_4};
  8. // 定义段选线引脚
  9. int a = 32;
  10. int b = 25;
  11. int c = 27;
  12. int d = 12;
  13. int e = 13;
  14. int f = 33;
  15. int g = 26;
  16. int dp = 14;
  17. // 定义段选线数组
  18. int led_array[8] = {a, b, c, d, e, f, g, dp};
  19. // 定义数字显示逻辑的二维数组(共阴极数码管)
  20. int number_array[10][8] = {
  21.   {1, 1, 1, 1, 1, 1, 0, 0}, // 0
  22.   {0, 1, 1, 0, 0, 0, 0, 0}, // 1
  23.   {1, 1, 0, 1, 1, 0, 1, 0}, // 2
  24.   {1, 1, 1, 1, 0, 0, 1, 0}, // 3
  25.   {0, 1, 1, 0, 0, 1, 1, 0}, // 4
  26.   {1, 0, 1, 1, 0, 1, 1, 0}, // 5
  27.   {1, 0, 1, 1, 1, 1, 1, 0}, // 6
  28.   {1, 1, 1, 0, 0, 0, 0, 0}, // 7
  29.   {1, 1, 1, 1, 1, 1, 1, 0}, // 8
  30.   {1, 1, 1, 1, 0, 1, 1, 0}  // 9
  31. };
  32. // 清屏函数
  33. void clear() {
  34.   // 关闭所有位选线
  35.   for (int i = 0; i < 4; i++) {
  36.     digitalWrite(seg_array[i], HIGH);
  37.   }
  38.   // 关闭所有段选线
  39.   for (int i = 0; i < 8; i++) {
  40.     digitalWrite(led_array[i], LOW);
  41.   }
  42. }
  43. // 显示数字的函数
  44. void display_number(int order, int number) {
  45.   // 清屏
  46.   clear();
  47.   // 将对应位选线的电平拉低
  48.   digitalWrite(seg_array[order], LOW);
  49.   // 显示数字
  50.   for (int i = 0; i < 8; i++) {
  51.     digitalWrite(led_array[i], number_array[number][i]);
  52.   }
  53. }
  54. // 4位数码管显示函数
  55. void display_4_number(int number) {
  56.   // 确保数字在 0 到 9999 之间
  57.   if (number >= 0 && number < 10000) {
  58.     // 获取每一位对应的数字
  59.     int digits[4];
  60.     for (int i = 3; i >= 0; i--) {
  61.       digits[i] = number % 10;
  62.       number /= 10;
  63.     }
  64.     // 显示4位数
  65.     for (int i = 0; i < 4; i++) {
  66.       display_number(i, digits[i]);
  67.       delay(5); // 短暂延时,避免闪烁
  68.     }
  69.   }
  70. }
  71. void setup() {
  72.   // 设置所有位选线引脚为输出模式,并初始化为高电平(关闭)
  73.   for (int i = 0; i < 4; i++) {
  74.     pinMode(seg_array[i], OUTPUT);
  75.     digitalWrite(seg_array[i], HIGH);
  76.   }
  77.   // 设置所有段选线引脚为输出模式,并初始化为低电平(关闭)
  78.   for (int i = 0; i < 8; i++) {
  79.     pinMode(led_array[i], OUTPUT);
  80.     digitalWrite(led_array[i], LOW);
  81.   }
  82. }
  83. void loop() {
  84.   // 显示数字 34
  85.   display_4_number(34);
  86. }
复制代码
按键实验
  1. //定义开关引脚
  2. int led_pin = 2;
  3. int button_pin = 14;
  4. //记录led状态是否更改过的值
  5. bool status = false;
  6. int led_logic = 0; // LED 的当前状态
  7. void setup(){
  8.   //配置引脚模式
  9.   pinMode(led_pin,OUTPUT);
  10.   pinMode(button_pin,INPUT_PULLDOWN);
  11. }
  12. void loop(){
  13.   //按键消抖
  14.   //如果当前按钮与上次不同,说明按钮发生了变化
  15.   if(digitalRead(button_pin)){
  16.     //睡眠10ms,如果依然是高电平,说明是按下并非抖动
  17.     delay(500);
  18.     if(digitalRead(button_pin)&& !status){
  19.       led_logic = !led_logic;
  20.       digitalWrite(led_pin,led_logic);
  21.       //修改status
  22.       status = !status;
  23.     }else if(digitalRead(button_pin)){
  24.       status = false;
  25.     }
  26.   }
  27.   
  28. }
复制代码
INPUT_PULLDOWN表现启用内部下拉电阻。
status:用于记录按钮是否已经触发过状态切换,避免按钮按下时多次出发LED状态的切换。
按钮消抖逻辑,状态切换:status作用时确保每次按钮按下只触发一次状态切换。切换LED状态后,将status设置位true,避免重复触发。
宏定义与变量定义的区别:

PWM呼吸灯
占空比:一个周期内高电平出现时间占总的比例
频率:1秒内信号从高电平到低电平再回到高电平的次数,一秒钟PWM的周期次数
PWM主要通过输出差别频率,占空比的方波,实现固定频率或均匀电压输出,,频率固定,改变占空比可改变输出电压。
analogWrite函数:在指定的引脚上输出一个PWM信号,通过改变PWM信号的占空比,控制输出电平的均匀值,从而实现对LED亮度、电机速率等的调解。
函数实现呼吸灯
  1. #define LED_PIN 12
  2. void setup(){
  3.   //配置GPIO输出
  4.   pinMode(LED_PIN,OUTPUT);
  5.   
  6. }
  7. void loop(){
  8.   //实现渐亮效果
  9.   for(int i=0;i<256;i++){
  10.     analogWrite(LED_PIN,i);
  11.     delay(10);
  12.   }
  13.   //实现渐灭效果
  14.   for(int i=255;i>=0;i--){
  15.     analogWrite(LED_PIN,i);
  16.     delay(10);
  17.   }
  18. }
复制代码
普通实现
  1. #define FREQ 2000       // PWM 频率
  2. #define CHANNEL 0       // PWM 通道
  3. #define RESOLUTION 8    // PWM 分辨率(8 位 = 0~255)
  4. #define LED 12          // LED 引脚
  5. void setup() {
  6.   // 配置 LEDC 通道
  7.   ledcSetup(CHANNEL, FREQ, RESOLUTION);
  8.   // 将 LEDC 通道绑定到指定引脚
  9.   ledcAttachPin(LED, CHANNEL);
  10. }
  11. void loop() {
  12.   // 实现渐亮效果
  13.   for (int i = 0; i < (1 << RESOLUTION); i++) {
  14.     ledcWrite(CHANNEL, i); // 设置 PWM 占空比
  15.     delay(10);             // 延迟 10ms
  16.   }
  17.   // 实现渐灭效果
  18.   for (int i = (1 << RESOLUTION) - 1; i >= 0; i--) {
  19.     ledcWrite(CHANNEL, i); // 设置 PWM 占空比
  20.     delay(10);             // 延迟 10ms
  21.   }
  22. }
复制代码
ADC模数转换器
串口监督器是 Arduino IDE 提供的一个工具,用于通过串口通讯与开发板(如 Arduino、ESP32 等)举行数据交互。它的主要作用是:1调试和监控步伐运行,2.发送数据到开发板,3.实时查看传感器数据。4.交互式控制。
串口通讯(Serial Communication)是一种通过串行接口逐位传输数据的通讯方式。与并行通讯(同时传输多个位)差别,串口通讯一次只传输一个位,适合长距离传输和镌汰硬件复杂性。
波特率是串口通讯中数据传输速率的度量,表现每秒传输的符号数(Symbols per second)。每个符号可以代表一个或多个位。
  1. #define POT 26  // 定义电位计连接的引脚
  2. int pot_value;  // 用于存储电位计的模拟输入值
  3. void setup() {
  4.   // 设置串口通信波特率
  5.   Serial.begin(9600);
  6.   // 设置引脚为输入模式(可选)
  7.   pinMode(POT, INPUT);
  8. }
  9. void loop() {
  10.   // 读取电位计的模拟输入值
  11.   pot_value = analogRead(POT);
  12.   // 打印模拟输入值到串口监视器
  13.   Serial.println(pot_value);
  14.   // 延迟 50 毫秒
  15.   delay(50);
  16. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万万哇

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表