25/1/13 嵌入式笔记 继续学习Esp32

PWM(Pulse Width Modulation,脉宽调制) 是一种通过快速切换高低电平来模拟中间电压值的技术。它广泛应用于控制 LED 亮度、电机速度、音频生成等场景。

analogWrite函数:用于在微控制器(如 Arduino)上生成模拟信号

使用analogWrite改变亮度。

#define POT 26
#define LED 13
//初始化电位计输入信号
int pot_value;
int led_value;void setup(){pinMode(POT,INPUT);pinMode(POT,INPUT);  
}
void loop(){//读取电位计模拟输入值pot_value=analogRead(POT);//吧电位计模拟输入值转换为LED模拟输出led_value = pot_value/16;analogWrite(LED,led_value);delay(50);
}

使用LEDC外设

#define POT 26
#define LED 13
#define CHANNEL 0
#define RESOLUTION 12
#define FREQ 1000//初始化电位计输入信号
int pot_value;//用于存储电位计读取的模拟值
int led_value;void setup(){ //设置ADC分辨率analogReadResolution(12);//配置输入衰减analogSetAttenuation(ADC_11db);//建立LEDC通道,配置LEDC分辨率ledcSetup(CHANNEL,1000,12);//关联GPIO与LEDC通道ledcAttachPin(LED,CHANNEL);
}
void loop(){//读取电位计模拟输入值pot_value=analogRead(POT);//输出PWMledcWrite(CHANNEL,pot_value);delay(50);
}

I2C控制LED1602

设计理念是:信号线尽量少并且速率要尽量高,信号线少,可以减少引脚占用,这对早期的芯片(引脚很少)的很重要。

标准的I2C需要两根信号线:

SCL:时钟线,时钟都是有master提供的

SDA:双向数据线,发数据或者收数据(收发不能同时)

简单来说,只需要2根线,就可以对多台设备传输大量数据,减少单片机上IO口的占用。

TIP:需要将LiquidCrystal_I2C.h和.cpp文件放在一个目录下

库的使用:

显示文字在液晶屏上。

#include "LiquidCrystal_I2C.h"//构造LCD对象,设置地址,列数,行数
LiquidCrystal_I2C lcd(0x27,16,2);void setup(){ //初始化LCD对象lcd.init();//打印内容lcd.backlight();lcd.print("Hello,world!");
}
void loop(){}

通过串口显示

Serial.available()//判断串口缓冲区有没有数据,若大于0就读取了数据

Serial.read()//从串口读取一个字节的数据,并将其写入 LCD 显示屏。这通常用于将通过串口接收到的字符显示在 LCD 上。

Adafruit_SSD1306的使用

上述知识均来自小破站的

18. SPI 控制 OLED 液晶屏_哔哩哔哩_bilibili这里面。

使用步骤:

1.初始化OLED,调用构造函数,调用begin方法

2.初始化完成后,调用绘制类函数,当然可以设置颜色,字体

3.绘制完毕,调用显示类函数display。

#include <Arduino.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>#define WIDTH 128
#define HEIGH 64
#define OLED_MOSI 13 
#define OLED_SCK 18
#define OLED_DC 2 
#define OLED_CS 4
#define OLED_RESET 15Adafruit_SSD1306 oled(WIDTH,HIGH,OLED_MOSI,OLED_SCK,OLED_DC,OLED_RESET,OLED_CS);//初始化进度
int progress=0;void setup() {//OLED初始化oled.begin();//清除显示oled.clearDisplay();//绘制水平线oled.drawFastHLine(32,5,48,SSD1306_WHITE);//绘制斜线oled.drawLine(32,5,48,30,SSD1306_WHITE);//绘制矩形oled.drawRect(5,5,10,25,SSD1306_WHITE);//绘制实心矩阵oled.fillRect(75,5,10,30,SSD1306_WHITE);//设置光标位置oled.setCursor(5,50);//设置文本颜色oled.setTextColor(SSD1306_WHITE);//显示文字oled.println("Hello,world!");//显示内容oled.display();
}void loop() {//清楚显示oled.clearDisplay();//设置光标位置oled.setCursor(25,40);//显示文字oled.println("Progress");//显示进度条边框oled.drawRoundRect(0,10,128,20,5,SSD1306_WHITE);//显示进度oled.fillRoundRect(5,15,progress,10,2,SSD1306_WHITE);//进度递增
if (progress<118)
{progress++;
}
else
{progress=0;
}//显示内容oled.display();//延时delay(50);
}

U8G2库控制OLED

平台支持性好,支持中文

#include <Arduino.h>
#include <U8g2lib.h>//构造对象
U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0,18,13,4,2,15);void setup() {//初始化OLED对象u8g2.begin();//开启中文字符集支持u8g2.enableUTF8Print();//设置字体u8g2.setFont(u8g2_font_wqy12_t_chinese2);}void loop() {//清除缓存区内容u8g2.clearBuffer();//绘制内容u8g2.setCursor(0,15);u8g2.print("Hello,World!");u8g2.setCursor(0,40);u8g2.print("你好,ESP32");//发送缓存区内容到OLED显示
}

按键控制菜单

#include <Arduino.h>
#include <U8g2lib.h>#define BUTTON_UP 12
#define BUTTON_DOWN 14void display_menu();//定义菜单列表
char *menu[4] = {"Item 1","Item 2","Item 3","Item 4"};
//构造对象
U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI u8g2(U8G2_R0,18,13,4,2,15);//初始化按键列表
unsigned int order = 0;
void setup() {//初始化OLED对象u8g2.begin();u8g2.setFont(u8g2_font_6x12_tr);//配置输出按键pinMode(BUTTON_UP,INPUT_PULLUP);pinMode(BUTTON_DOWN,INPUT_PULLUP);
}void loop() 
{//判断按键是否按下,并记录位置if(!digitalRead(BUTTON_UP)){order = (order - 1 + 4)%4;}if(!digitalRead(BUTTON_DOWN)){order = (order + 1)%4;}display_menu(order);delay(80);
}
void display_menu(){u8g2.firstPage();do {//绘制页面内容u8g2.drawStr(0,12,"Menu");u8g2.drawHLinie(0,14,128);for(int i=0;i<4;i++){if(i==index){u8g2.drawStr(5,(i+2)*12+2,">");u8g2.drawStr(20,(i+2)*12+2,menu[i]);}else{u8g2.drawStr(5,(i+2)*12+2,menu[i]);}}}while(u8g2.nextPage());}

中断分类:

硬件中断,也称外部中断,一键中断响应外部硬件时间而发生,

软件中断:当触发软件事件时,会发生这种类型的中断。

在中断执行函数中不能用delay()函数

delay() 的工作原理
  • delay() 函数依赖于 Arduino 的 millis() 函数,后者通过定时器中断来更新时间。

  • 在 delay() 执行期间,程序会不断检查 millis() 的值,直到达到指定的延时时间。

  • 如果在 ISR 中使用 delay(),会导致以下问题:

    • 阻塞其他中断delay() 依赖于定时器中断,但在 ISR 中,定时器中断被禁用,导致 millis() 无法更新,delay() 会一直阻塞。

    • 影响系统实时性:ISR 应该尽快执行完毕,delay() 会延长 ISR 的执行时间,影响系统的响应能力。

简单来说delay是一个阻塞函数,他会暂停代码的执行,会中断积压。

定时器中断

ESP32通过定时器可以完成各种预设好的任务,ESP32定时器达到指定时间后也会产生中断,然后在回调函数内执行所需功能。

#define LED 2
#define LED_ONCE 4hw_timer_t *timer = NULL;
hw_timer_t *timer_once = NULL;// 定时中断函数:用于 LED 闪烁
void IRAM_ATTR timer_interrupt() {digitalWrite(LED, !digitalRead(LED)); // 切换 LED 状态
}// 一次性定时中断函数:用于点亮 LED_ONCE
void IRAM_ATTR timer_once_interrupt() {digitalWrite(LED_ONCE, HIGH); // 点亮 LED_ONCE
}void setup() {pinMode(LED, OUTPUT);pinMode(LED_ONCE, OUTPUT);// 初始化定时器timer = timerBegin(0, 80, true);         // 使用定时器 0,分频系数 80,向上计数timer_once = timerBegin(1, 80, true);    // 使用定时器 1,分频系数 80,向上计数// 配置定时器中断timerAttachInterrupt(timer, &timer_interrupt, true);         // 绑定 timer_interrupt 到定时器 0timerAttachInterrupt(timer_once, &timer_once_interrupt, true); // 绑定 timer_once_interrupt 到定时器 1// 设置定时器周期(单位:微秒)timerAlarmWrite(timer, 1000000, true);         // 定时器 0 每 1 秒触发一次timerAlarmWrite(timer_once, 5000000, false);   // 定时器 1 在 5 秒后触发一次(仅一次)// 启用定时器报警timerAlarmEnable(timer);timerAlarmEnable(timer_once);
}void loop() {// 主循环无需操作
}

软件定时器

#include <Ticker.h>
#define LED 2
#define LED_ONCE 4//定义定时器对象
Ticker timer;
Ticker timer_once;//切换指定引脚的电平状态
void toggle(int pin){digitalWrite(pin,!digitalRead(pin));
}void setup() {pinMode(LED, OUTPUT);pinMode(LED_ONCE, OUTPUT);//配置定时器timer.attach(0.5,toggle,LED);timer_once.once(3,toggle,toggle,LED_ONCE);
}void loop() {// 主循环无需操作
}

舵机转动

CHANNEL 是 ESP32 的 LEDC(LED PWM 控制器) 通道编号。ESP32 的 LEDC 模块提供了多个独立的 PWM 通道,可以用来生成 PWM 信号,控制设备如 LED 亮度、舵机角度等。

  • 通道 0 用于生成 PWM 信号,控制连接到 SERVO 引脚(GPIO 13)的设备(如舵机)。

#define FREQ 50
#define CHANNEL 0
#define RESOLUTION 8
#define SERVO 13int calculatePWM(int degree){int min_width=0.5/20*pow(2,RESOLUTION);int max_width=2.5/20*pow(2,RESOLUTION);return (max_width-min_width)*degree/180+min_width;}void setup(){//建立LEDC通道ledcSetup(CHANNEL,FREQ,RESOLUTION);//关联GPIO口与LEDC通道ledcAttachPin(SERVO,CHANNEL);
}void loop(){for (int i=0;i<=180;i+=10){//输出PWM,设置占空比ledcWrite(CHANNEL,calculatePWM(i));delay(500);}
}

ok!明天见!

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

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

相关文章

jupyter notebook练手项目:线性回归——学习时间与成绩的关系

线性回归——学习时间与学习成绩的关系 第1步&#xff1a;导入工具库 pandas——数据分析库&#xff0c;提供了数据结构&#xff08;如DataFrame和Series&#xff09;和数据操作方法&#xff0c;方便对数据集进行读取、清洗、转换等操作。 matplotlib——绘图库&#xff0c;p…

如何规模化实现完全自动驾驶?Mobileye提出解题“新”思路

在CES 2025上&#xff0c;Mobileye展示了端到端自动驾驶系统Mobileye Drive™&#xff0c;通过高度集成的传感器、算法和计算平台&#xff0c;可以实现自动驾驶功能的全覆盖。 Mobileye创始人兼首席执行官Amnon Shashua教授 期间&#xff0c;Mobileye创始人兼首席执行官Amnon …

Windows下安装和配置Go开发环境

文章目录 1. 介绍了SDK2. 下载 SDK工具包3. windows 下配置 Golang 环境变量 1. 介绍了SDK SDK 的全称(Software Development Kit 软件开发工具包)SDK是提供给开发人员使用的&#xff0c;其中包含了对应开发语言的工具包 2. 下载 SDK工具包 Go语言的官网为&#xff1a;https…

【javascript】Web APIs-Dom获取属性操作

目录 Web APIs-Dom获取&属性操作 Web API 基本认知 变量声明 建议&#xff1a; const 优先&#xff0c;尽量使用const&#xff0c;原因是&#xff1a; 1.1 作用和分类 1.2 什么是DOM 1.3 DOM树 1.4 DOM对象&#xff08;重要&#xff09; 2. 获取DOM对象 2.1 根据C…

新版AndroidStudio通过系统快捷创建带BottomNavigationView的项目踩坑记录

选择上面这个玩意创建的项目 坑点1 &#xff1a;配置的写法和不一样了 镜像的写法&#xff1a; 新的settings.gradle.kts中配置镜像的代码&#xff1a; pluginManagement {repositories {mavenCentral()google {content {includeGroupByRegex("com\\.android.*")…

SAP资产盘盈盘亏的过账处理、入账价值错误调整、资产减值准备

文章目录 一、SAP资产盘盈盘亏处理1、ABNAN盘盈 &#xff08;往年资产&#xff09; ABZON (当年资产&#xff09;2、ABAVN盘亏 二、资产价值入账错了&#xff08;价值多了或少了&#xff09;&#xff0c;怎么调账1、价值少了2、价值多了 三、资产减值准备1、启用重估2、指定间隔…

炸砖块游戏的最终图案

描述 小红正在玩一个“炸砖块”游戏,游戏的规则如下:初始有一个 n * m 的砖块矩阵。小红会炸 k 次,每次会向一个位置投炸弹,如果这个位置有一个砖块,则砖块消失,上方的砖块向下落。小红希望你画出最终砖块的图案。 输入描述 第一行输入三个正整数 n, m, k,代表矩阵的行…

【Python项目】图像信息隐藏技术的实现

【Python项目】图像信息隐藏技术的实现 技术简介&#xff1a;采用Python技术、MYSQL数据库等实现。 系统简介&#xff1a;系统主要的功能有登录模块、对个人信息的维护模块、图片信息的隐藏模块涉及图片的上传和信息的验证。 背景&#xff1a; 在当今时代&#xff0c;信息技术…

游戏市场成果及趋势

2024 年的游戏行业发展情况如何&#xff1f;这是一个既关系到开发商&#xff0c;又关系到玩家的问题&#xff0c;而市场分析师可以为我们揭晓答案。下面&#xff0c;就让我们来看看分析师给出的结论以及他们对未来趋势的预测。 玩家 自 2021 年起&#xff0c;全球平均游戏时间…

【算法学习】——整数划分问题详解(动态规划)

&#x1f9ee;整数划分问题是一个较为常见的算法题&#xff0c;很多问题从整数划分这里出发&#xff0c;进行包装&#xff0c;形成新的题目&#xff0c;所以完全理解整数划分的解决思路对于之后的进一步学习算法是很有帮助的。 「整数划分」通常使用「动态规划」解决&#xff0…

深入理解计算机系统阅读笔记-第十二章

第12章 网络编程 12.1 客户端-服务器编程模型 每个网络应用都是基于客户端-服务器模型的。根据这个模型&#xff0c;一个应用时由一个服务器进程和一个或者多个客户端进程组成。服务器管理某种资源&#xff0c;并且通过操作这种资源来为它的客户端提供某种服务。例如&#xf…

Redis 实战篇 ——《黑马点评》(中)

《引言》 &#xff08;中&#xff09;篇将接着记录 Redis 实战篇 ——《黑马点评》&#xff08;上&#xff09;篇之后的学习内容与笔记&#xff0c;希望大家能够点赞、收藏支持一下 ᕦ(&#xff65;ㅂ&#xff65;)ᕤ&#xff0c;谢谢大家。 传送门&#xff08;上&#xff09;&…

【2024年华为OD机试】(A卷,100分)- 猜字谜(Java JS PythonC/C++)

一、问题描述 小王设计了一个简单的猜字谜游戏&#xff0c;游戏的谜面是一个错误的单词&#xff0c;比如 nesw&#xff0c;玩家需要猜出谜底库中正确的单词。猜中的要求如下&#xff1a; 对于某个谜面和谜底单词&#xff0c;满足下面任一条件都表示猜中&#xff1a; 变换顺序…

ip属地是根据手机号还是位置

在数字化时代&#xff0c;IP地址作为网络世界中的“门牌号”&#xff0c;其属地信息往往与用户的地理位置紧密相关。然而&#xff0c;关于IP属地是如何确定的&#xff0c;是否依赖于手机号还是实际位置&#xff0c;这一话题时常引发讨论。本文将深入探讨IP属地的确定方式&#…

nginx 实现 正向代理、反向代理 、SSL(证书配置)、负载均衡 、虚拟域名 ,使用其他中间件监控

我们可以详细地配置 Nginx 来实现正向代理、反向代理、SSL、负载均衡和虚拟域名。同时&#xff0c;我会介绍如何使用一些中间件来监控 Nginx 的状态和性能。 1. 安装 Nginx 如果你还没有安装 Nginx&#xff0c;可以通过以下命令进行安装&#xff08;以 Ubuntu 为例&#xff0…

React性能优化: 使用React.lazy与Suspense提高加载效率

## 1. React.lazy与Suspense简介 在开发React应用程序时&#xff0c;我们经常会遇到需要加载大型组件或者数据的情况。为了提高页面加载的效率&#xff0c;React引入了React.lazy和Suspense这两个特性。 什么是React.lazy&#xff1f; 是React 16.6版本引入的新特性&#xff0c…

Golang笔记——Interface类型

大家好&#xff0c;这里是Good Note&#xff0c;关注 公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍Golang的interface数据结构类型&#xff0c;包括基本实现和使用等。 文章目录 Go 语言中的 interface 详解接口定义实现接口空接口 interface{}示…

轨迹优化 | 基于贝塞尔曲线的无约束路径平滑与粗轨迹生成(附ROS C++/Python仿真)

目录 0 专栏介绍1 从路径到轨迹2 基于贝塞尔曲线的粗轨迹生成2.1 路径关键点提取2.2 路径点航向角计算2.3 贝塞尔曲线轨迹生成 3 算法仿真3.1 ROS C仿真3.2 Python仿真 0 专栏介绍 &#x1f525;课设、毕设、创新竞赛必备&#xff01;&#x1f525;本专栏涉及更高阶的运动规划…

理解STC15F2K60S2单片机的最小电路

一、STC15F2K60S2与51单片机的区别 STC15F2K60S2和51单片机虽然都基于8051内核&#xff0c;但在多个方面存在显著区别&#xff1a; 1. CPU性能&#xff1a; - STC15F2K60S2&#xff1a;采用增强型8051 CPU&#xff0c;1T单时钟/机器周期&#xff0c;速度比普通8051快8-12倍…

VSCode 搜索 搜不到

VSCode 搜索 搜不到 今天打开一个新的工作目录之后 ctrl P 搜文件 搜不到 经观察后发现 当我搜索时候&#xff0c; 右侧搜索按钮有一个时钟标识&#xff0c;疑似 搜索的范围 是最近打开内容。 经过和全局搜索的编辑器对比设置后发现&#xff0c;把设置中 下图中 选项去掉勾选…