05-基础例程5
基础例程5
1、超声波测距
实验介绍
HC-SR04超声波传感器是一款测量距离的传感器。其原理是利用声波在遇到障碍物反射接收结合声波在空气中传播的速度计算的得出。
外观
管脚功能的定义
VCC:供电电源;Trig:触发信号;Echo:反馈信号;GND:电源地
硬件设计
软件设计
/* 深圳市普中科技有限公司(PRECHIN 普中)技术支持:www.prechin.net* * 实验名称:超声波测距实验* * 接线说明:HC-SR04超声波模块-->ESP32 IO(VCC)-->(5V)(Trig)-->(4)(Echo)-->(27)(GND)-->(GND)* * 实验现象:程序下载成功后,软件串口控制台间隔一段时间输出超声波模块测量距离* * 注意事项:需要在软件中选择"项目"-->"加载库"-->"添加一个.ZIP库..."-->选择到本实验目录下的1个压缩文件包“HCSR04-master.zip”安装即可。* 该库使用方法可参考:https://github.com/Teknologiskolen/HCSR04/commits?author=theresetmaster*/#include "public.h"
#include <afstandssensor.h>// AfstandsSensor(triggerPin, echoPin);
AfstandsSensor afstandssensor(4, 27);void setup(){Serial.begin(115200);}void loop(){Serial.printf("测量距离:%.2fCM\r\n",afstandssensor.afstandCM());delay(500);
}/**/
2、红外遥控
实验介绍
通常的红外遥控器是将遥控信号(二进制脉冲码)调制在38KHz的载波上,经过缓冲方法后送至红外发光二极管,转化为红外信号发射出去。
NEC码的位定义:1个脉冲对应560us的连续载波,一个逻辑1需要2.25ms(560us脉冲+1680us低电平),一个逻辑0的传输需要1.125ms(560us脉冲+560us低电平)。
接收到的信号。逻辑1应该是560us低电平+1680us高电平,逻辑0应该是560us低电平+560us高电平。时序图如下图所示
指令格式如下:
红外接收设备
一般即是红外的三极管。从左至右,依此是1:VOUT,2:GND,3:VDD
硬件设计
红外的IRED–VOUT与J2的IRED引脚相连接。即将ESP32的引脚与J2的IRED引脚相连接,即可以控制红外
软件设计
/* 深圳市普中科技有限公司(PRECHIN 普中)技术支持:www.prechin.net* * 实验名称:红外遥控实验* * 接线说明:红外接收模块-->ESP32 IO(IR)-->(14)* * 实验现象:程序下载成功后,当按下遥控器键时,软件串口控制台输出红外遥控器控制码(十六进制数)* * 注意事项:需要在软件中选择"项目"-->"加载库"-->"添加一个.ZIP库..."-->选择到本实验目录下的1个压缩文件包“IRremoteESP8266-master.zip”安装即可。* 该库使用方法可参考:压缩包解压后可查看examples使用。*/#include "public.h"
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>//红外控制引脚
#define kRecvPin 14
IRrecv irrecv(kRecvPin);
decode_results results;void setup(){Serial.begin(115200);irrecv.enableIRIn();}void loop(){if (irrecv.decode(&results)) {// print() & println() can't handle printing long longs. (uint64_t)serialPrintUint64(results.value, HEX);Serial.println("");irrecv.resume(); // Receive the next value}delay(100);
}
遥控器对应的键值表
3、舵机实验
实验介绍
舵机是一种位置(角度)伺服的驱动器,适用那些需要角度不断变化并可以保持的控制系统。舵机是一种通俗的叫法,实际上是一个伺服马达。
让PWM产生周期为20ms,高电平0.5ms——2.5ms的方波。可以使用ESP32的PWM功能产生这样的方波,波形如下所示:
硬件设计
由图可知,板载了4路舵机接口均可连接到指定的IO。我们选择ESP32的17引脚
软件设计
/* 深圳市普中科技有限公司(PRECHIN 普中)技术支持:www.prechin.net* * 实验名称:舵机实验* * 接线说明:SG90舵机模块-->ESP32 IO橙色(信号线)-->(17)红色(电源正)-->(5V)褐色(电源负)-->(GND)* * 实验现象:程序下载成功后,SG90舵机循环以45°步进从0°旋转到180°* * 注意事项:*/#include "public.h"
#include "pwm.h"//舵机控制引脚
#define servo_pin 17//舵机控制
//degree:角度0-180
//返回值:输出对应角度PWM占空比
int servo_ctrl(u8 degree)
{const float deadZone=6.4; //对应0.5ms(0.5/(20ms/256))const float max=32; //对应2.5msif(degree<0)degree=0;else if(degree>180)degree=180;return (int)(((max-deadZone)/180)*degree+deadZone);
}void setup(){Serial.begin(115200);pwm_init(servo_pin,8,50,8);pwm_set_duty(8,servo_ctrl(0));
}void loop(){for(u8 i=0;i<=180;i+=45){pwm_set_duty(8,servo_ctrl(i));delay(1000);}
}
pwm
#include "pwm.h"//PWM初始化
//pin:引脚号
//chanel:PWM输出通道0-15,0-7高速通道,由80M时钟驱动,8-15低速通道,有1M时钟驱动
//freq:PWM输出频率,单位HZ
//resolution:PWM占空比的分辨率1-16,比如设置8,分辨率范围0-255
void pwm_init(u8 pin,u8 chanel,u8 freq,u8 resolution)
{ledcSetup(chanel, freq, resolution);// PWM初始化ledcAttachPin(pin, chanel);// 绑定PWM通道到GPIO上
}//PWM占空比设置
void pwm_set_duty(u8 chanel,u16 duty)
{ledcWrite(chanel,duty);// 改变PWM的占空比
}
4、OLED液晶显示
实验介绍
LCD需要背光,而OLED不需要,因为它自发光。目前使用的是0.96寸OLED显示屏,内部驱动芯片为SSD1306。
管脚:
GND:电源地,VDD:电源正(3-5.5V),SCK:I2C时钟管脚,SDA:I2C数据管脚
IIC是用于设备之间通信的双线协议,在物理层面,它由两条线组成:SCL和SDA,分别是时钟线和数据线。也就是说不同设备间通过这两根线可以进行通信。
ESP32有2个硬件IIC接口和N个软件IIC接口。硬件IIC总线默认IO如下:
IIC-0:18-SCL;19-SDA
IIC-1:25-SCL;26-SDA
硬件IIC接口可以通过配置可在任意IO口使用。软件IIC接口可通过配置在任意IO口使用,相当于使用IO口模拟IIC时序。本实验使用软件IIC与OLED通信。
硬件设计
GPIO18、GPIO32分别于SCL和SDA相连接
软件设计
OLED的IIC地址默认是0x3C
/* 深圳市普中科技有限公司(PRECHIN 普中)技术支持:www.prechin.net* * 实验名称:OLED液晶显示实验* * 接线说明:OLED(IIC)液晶模块-->ESP32 IOGND-->(GND)VCC-->(5V)SCL-->(18)SDA-->(23)* * 实验现象:程序下载成功后,OLED液晶屏显示字符信息* * 注意事项:需要在软件中选择"项目"-->"加载库"-->"添加一个.ZIP库..."-->选择到本实验目录下的1个压缩文件包“esp8266-oled-ssd1306-master.zip”安装即可。* 该库使用方法可参考:压缩包解压后可查看examples使用。*/#include "public.h"
#include <Wire.h> // Only needed for Arduino 1.6.5 and earlier
#include "SSD1306Wire.h" // legacy: #include "SSD1306.h"
#include "images.h"#define DEMO_DURATION 3000
typedef void (*Demo)(void);int demoMode = 0;
int counter = 1;//OLED引脚定义
#define SDA 23
#define SCL 18
SSD1306Wire display(0x3c, SDA, SCL);void setup(){Serial.begin(115200);display.init();//初始化UIdisplay.flipScreenVertically();//垂直翻转屏幕设置display.setFont(ArialMT_Plain_24);//设置字体大小display.drawString(0, 0, "Hello World");//显示display.display();//将缓存数据写入到显示器
}void drawFontFaceDemo() {// Font Demo1// create more fonts at http://oleddisplay.squix.ch/display.setTextAlignment(TEXT_ALIGN_LEFT);display.setFont(ArialMT_Plain_10);display.drawString(0, 0, "Hello world");display.setFont(ArialMT_Plain_16);display.drawString(0, 10, "Hello world");display.setFont(ArialMT_Plain_24);display.drawString(0, 26, "Hello world");
}void drawTextFlowDemo() {display.setFont(ArialMT_Plain_10);display.setTextAlignment(TEXT_ALIGN_LEFT);display.drawStringMaxWidth(0, 0, 128,"Lorem ipsum\n dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore." );
}void drawTextAlignmentDemo() {// Text alignment demodisplay.setFont(ArialMT_Plain_10);// The coordinates define the left starting point of the textdisplay.setTextAlignment(TEXT_ALIGN_LEFT);display.drawString(0, 10, "Left aligned (0,10)");// The coordinates define the center of the textdisplay.setTextAlignment(TEXT_ALIGN_CENTER);display.drawString(64, 22, "Center aligned (64,22)");// The coordinates define the right end of the textdisplay.setTextAlignment(TEXT_ALIGN_RIGHT);display.drawString(128, 33, "Right aligned (128,33)");
}void drawRectDemo() {// Draw a pixel at given positionfor (int i = 0; i < 10; i++) {display.setPixel(i, i);display.setPixel(10 - i, i);}display.drawRect(12, 12, 20, 20);// Fill the rectangledisplay.fillRect(14, 14, 17, 17);// Draw a line horizontallydisplay.drawHorizontalLine(0, 40, 20);// Draw a line horizontallydisplay.drawVerticalLine(40, 0, 20);
}void drawCircleDemo() {for (int i = 1; i < 8; i++) {display.setColor(WHITE);display.drawCircle(32, 32, i * 3);if (i % 2 == 0) {display.setColor(BLACK);}display.fillCircle(96, 32, 32 - i * 3);}
}void drawProgressBarDemo() {int progress = (counter / 5) % 100;// draw the progress bardisplay.drawProgressBar(0, 32, 120, 10, progress);// draw the percentage as Stringdisplay.setTextAlignment(TEXT_ALIGN_CENTER);display.drawString(64, 15, String(progress) + "%");
}void drawImageDemo() {// see http://blog.squix.org/2015/05/esp8266-nodemcu-how-to-create-xbm.html// on how to create xbm filesdisplay.drawXbm(34, 14, WiFi_Logo_width, WiFi_Logo_height, WiFi_Logo_bits);
}Demo demos[] = {drawFontFaceDemo, drawTextFlowDemo, drawTextAlignmentDemo, drawRectDemo, drawCircleDemo, drawProgressBarDemo, drawImageDemo};
int demoLength = (sizeof(demos) / sizeof(Demo));
long timeSinceLastModeSwitch = 0;void loop(){// clear the displaydisplay.clear();// draw the current demo methoddemos[demoMode]();display.setFont(ArialMT_Plain_10);display.setTextAlignment(TEXT_ALIGN_RIGHT);display.drawString(128, 54, String(millis()));// write the buffer to the displaydisplay.display();if (millis() - timeSinceLastModeSwitch > DEMO_DURATION) {demoMode = (demoMode + 1) % demoLength;timeSinceLastModeSwitch = millis();}counter++;delay(10);
}
5、SD卡实验
实验介绍
开发板已经板载了TF卡座,可使用TF卡插入使用。
ESP32-WROOM-32可使用SPI口与SD卡进行通信。
SPI的全称是“Serial Peripheral Interface”,串行外围接口、SPI是一种高速的、全双工、同步的通信总线。在芯片的管脚上只占用4根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便。
SPI接口一般使用4条线通信,事实上只需要3条线就可以进行SPI通信(单向传输时),其中3条为SPI总线(MISO、MOSI、SCLK),一条为SPI片选信号线(CS)。
ESP32有两个硬件SPI通道允许更高速率传输(到达80MHz)。也可以配置成任意引脚,但相关引脚要符合输入输出的方向性。通过自定义引脚而非默认引脚,会降低传输速度,上限为40Mhz。SPI总线默认引脚如图:
HSPI(id=1) SCLk14;MOSI13;MISO12
VSPI(id=2) SCLK18;MOSI23;MISO19
id=1的HSPI已经连接到模块的SPI-FLASH上,不要去使用。因此可以使用id=2的SPI与SD卡进行通信
硬件设计
由图可知,SD卡接口均连接到指定IO处。
软件设计
在sd卡中创建test.txt文档。打开文档写入内容后关闭;再打开文档读取内容
/* 深圳市普中科技有限公司(PRECHIN 普中)技术支持:www.prechin.net* * 实验名称:SD卡实验* * 接线说明:SD卡模块-->ESP32 IO(DAT0)(MISO)-->(19)(CMD)(MOSI)-->(23)(CLK)(SCK)-->(18)(CD/DAT3)(CS)-->(4)* * 实验现象:程序下载成功后,在SD卡指定目录下新建text.txt文件,写入信息,然后读取文件,在串口控制台上输出读取文件中的字符信息。* * 注意事项:*/#include "public.h"
#include <SPI.h>
#include <SD.h>File myFile;void setup(){Serial.begin(115200);Serial.print("Initializing SD card...");SPIClass spi = SPIClass(VSPI);spi.begin(18 /* SCK */, 19 /* MISO */, 23 /* MOSI */, 4 /* SS */);
// SD.begin(4 /* SS */, spi, 80000000);if (!SD.begin(4)) {Serial.println("initialization failed!");return;}Serial.println("initialization done.");// open the file. note that only one file can be open at a time,// so you have to close this one before opening another.myFile = SD.open("/test.txt", FILE_WRITE);// if the file opened okay, write to it:if (myFile) {Serial.print("Writing to test.txt...");myFile.println("testing 1, 2, 3.");// close the file:myFile.close();Serial.println("done.");} else {// if the file didn't open, print an error:Serial.println("error opening test.txt");}// re-open the file for reading:myFile = SD.open("/test.txt");if (myFile) {Serial.println("test.txt:");// read from the file until there's nothing else in it:while (myFile.available()) {Serial.write(myFile.read());}// close the file:myFile.close();} else {// if the file didn't open, print an error:Serial.println("error opening test.txt");}
}
相关文章:

05-基础例程5
基础例程5 1、超声波测距 实验介绍 HC-SR04超声波传感器是一款测量距离的传感器。其原理是利用声波在遇到障碍物反射接收结合声波在空气中传播的速度计算的得出。 外观 管脚功能的定义 VCC:供电电源;Trig:触发信号;Echo&a…...

双基证券:预计未来还会有更多政策来吸引增量资金
双基证券表示,8月27日,活泼资本商场五大方针出台:证券交易印花税折半征收;阶段性收紧IPO节奏;上市房企再融资不受破发、破净和亏本限制;标准控股股东与实际操控人减持行为;融资保证金最低份额由…...

前端:html实现页面切换、顶部标签栏,类似于浏览器的顶部标签栏(完整版)
效果 代码 <!DOCTYPE html> <html><head><style>/* 左侧超链接列表 */.link {display: block;padding: 8px;background-color: #f2f2f2;cursor: pointer;}/* 顶部标签栏 */#tabsContainer {width:98%;display: flex;align-items: center;overflow-x: …...

强化自主可控,润开鸿发布基于RISC-V架构的开源鸿蒙终端新品
2023 RISC-V中国峰会于8月23日至25日在北京召开,峰会以“RISC-V生态共建”为主题,结合当下全球新形势,把握全球新时机,呈现RISC-V全球新观点、新趋势。本次大会邀请了RISC-V国际基金会、业界专家、企业代表及社区伙伴等共同探讨RISC-V发展趋势与机遇,吸引超过百余家业界企业、高…...

软件设计师知识点·1
控制器: (1)指令寄存器(IR) : CPU执行一条指令时,从内存储器取到缓冲寄存器中,再送入IR暂存; (2)程序计数器(PC): 将要执行的下一条指令的地址; (3)地址寄存器(IR): 当前CPU所访问的内存单元地址; (4)指令译码器(ID): 对指令中的操作码字段进行分析解释; 多核CPU可以满足用户…...

修改Jupyter Notebook默认打开路径
这里我是重新下载的anaconda,打开Jupyter之后是默认在C盘的一个路径的,现在我们就来修改一下它的一个默认打开路径,这样在我们后续学习过程中,可以将ipynb后缀的文件放在这个目录下就能查看了。 1、先打开Anaconda Prompt&#x…...

经典卷积网络
目录 一、经典神经网络出现的时间线编辑 二、LeNet 三、AlexNet 四、VGGNet 五、InceptionNet 六、ResNet 总结: 一、经典神经网络出现的时间线 二、LeNet 背景:LeNet由Yann LeCun于1998年提出,卷积网络开篇之作。 解释࿱…...

react+koa+vite前后端模拟jwt鉴权过程
路由组件(生成token) const Router require(koa/router) const jwt require(jsonwebtoken); const router new Router()const mockDbUserInfo [{nickname: xxxliu,username: Tom,password: 123456,icon: url1},{nickname: xxx,username: John,passw…...

VK1616是LED显示控制驱动电路/LED驱动IC、数显驱动芯片、数码管驱动芯片
产品品牌:永嘉微电/VINKA 产品型号:VK1616 封装形式:SOP16 产品年份:新年份 概述:VK1616是一种数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、数据锁存器、LED 驱动等电路。SEG脚接LED阳极&a…...

开箱报告,Simulink Toolbox库模块使用指南(五)——S-Fuction模块(C MEX S-Function)
文章目录 前言 C MEX S-Function 算法原理 原始信号创建 编写S函数 仿真验证 Tips 分析和应用 总结 前言 见《开箱报告,Simulink Toolbox库模块使用指南(一)——powergui模块》 见《开箱报告,Simulink Toolbox库模块使用…...

摄像头的调用和视频识别
CV_tutorial3 摄像头调用实时播放保存视频 运动目标识别帧差法背景减除法 摄像头调用 创建视频捕捉对象:cv2.VideoCapture() 参数为视频设备的索引号,就一个摄像投的话写0默认; 或者是指定要读取视频的路径。 实时播放 import cv2 import …...

多通道分离与合并
目录 1.多通道分离split() 2.多通道合并merge() 3.Android JNI demo 1.多通道分离split() void cv::split ( InputArray m, OutputArrayOfArrays mv ) m:待分离的多通道图像。 mv:分离后的单通道图像,为向量vector形式。 2.多通道合并merge…...

JOJO的奇妙冒险
JOJO,我不想再做人了。 推荐一部动漫 JOJO的奇妙冒险 荒木飞吕彦创作的漫画 《JOJO的奇妙冒险》是由日本漫画家荒木飞吕彦所著漫画。漫画于1987年至2004年在集英社的少年漫画杂志少年JUMP上连载(1987年12号刊-2004年47号刊),2005年后在集英…...

LeetCode56.合并区间
这道题我想了一会儿,实在想不到比较好的算法,只能硬着头皮写了,然后不断的debug,经过我不懈的努力,最后还是AC,不过效率确实低。 我就是按照最直接的方法来,先把intervals数组按照第一个数star…...

【内推码:NTAMW6c】 MAXIEYE智驾科技2024校招启动啦
MAXIEYE智驾科技2024校招启动啦【内推码:NTAMW6c】 【招聘岗位超多!!公司食堂好吃!!】 算法类:感知算法工程师、SLAM算法工程师、规划控制算法工程师、目标及控制算法工程师、后处理算法工程师 软件类&a…...

Python框架【模板继承 、继承模板实战、类视图 、类视图的好处 、类视图使用场景、基于调度方法的类视图】(四)
👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误…...

对于前端模块化的理解与总结(很全乎)
目录 模块化的好处 模块化的commonJS导入导出 暴露(导出)模块:module.exports value或exports.xxx value 导入模块——使用 es6模块化 方法一逐个导出 方法二默认导出 方法三 方法四 方法五 export 和import 同时存在 多个文件导出到一个文件后在相关文件…...

NewStarCTF 2022 web方向题解 wp
----------WEEK1---------- BUU NewStarCTF 公开赛赛道 WEEK1 [NotPHP] 先看题目,要传参加绕过。 分析一下代码:首先get一个datadata://test/plain,Wel…。然后key1和2用数组可以绕过。num2077a可以绕过弱类型。eval()中的php语句被#注释了,…...

WebGL矩阵变换库
目录 矩阵变换库: Matrix4对象所支持的方法和属性如表所示: 方法属性规范: 虽然平移、旋转、缩放等变换操作都可以用一个44的矩阵表示,但是在写WebGL程序的时候,手动计算每个矩阵很耗费时间。为了简化编程…...

block层:8. deadline调度器
deadline 源码基于5.10 0. 私有数据 struct deadline_data {/** run time data*//** requests (deadline_rq s) are present on both sort_list and fifo_list*/struct rb_root sort_list[2];struct list_head fifo_list[2];/** next in sort order. read, write or both ar…...

DTO,VO,PO的意义与他们之间的转换
DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负…...

Java 集合框架2
一、关于set接口的常用类 1.HashSet类 用来处理无序的单列数据,没有重复的元素,重复的元素算一个 i.构造方法 //HashSet类是set接口的子类,是无序的单列数据,没有重复的元素,重复的元素算一个 //HashSet的构造方法 //HashSet() …...

2024王道408数据结构P144 T16
2024王道408数据结构P144 T16 思考过程 首先看题目,要求我们把二叉树的叶子结点求出来并且用链表的方式存储,链接时用叶结点的右指针来存放单链表指针。我们很清楚可以看出来能用中序遍历递归的方式实现,因为第一个叶子结点在整棵树的最左下…...

【ARM Coresight 系列文章 22 -- linux frace 与 trace-cmd】
文章目录 ftrace 介绍trace-cmd 介绍trace-cmd 常用跟踪事件ftrace 与 trace-cmd 关系ftrace 编译依赖 ftrace 介绍 ftrace 是 Linux 内核中的一个跟踪工具,主要用于帮助开发者分析和调试内核的行为。ftrace 的名字来源于 “function tracer”,它最初是…...

MyBatis的一级缓存和二级缓存是怎么样的?
目录 1. 一级缓存 2. 一级缓存失效的几种情况 3. 二级缓存 4.二级缓存失效的情况 5. 二级缓存的相关配置 6. 缓存的查询顺序 MyBatis 的缓存共分为一级缓存和二级缓存。 1. 一级缓存 一级缓存是 SqlSession 级别的,通过同一个 SqlSession 查询到的数据会被缓…...

下载的文件被Windows 11 安全中心自动删除
今天从CSDN上下载了自己曾经上传的文件,但是浏览器下载完之后文件被Windows安全中心自动删除,说是带病毒。实际是没有病毒的,再说了即便有病毒也不应该直接删除啊,至少给用户一个保留或删除的选项。 研究了一番,可以暂…...

【Java List与数组】List<T>数组和数组List<T>的区别(124)
List数组:存储List的数组,即:数组中的元素是:List; 数组List:存储数组的List,即:List中的数据是类型的数组; 测试案例: import java.util.ArrayList; impor…...

Nuxt 菜鸟入门学习笔记四:静态资源
文章目录 public 目录assets 目录全局样式导入 Nuxt 官网地址: https://nuxt.com/ Nuxt 使用以下两个目录来处理 CSS、fonts 和图片等静态资源: public 目录 public 目录用作静态资产的公共服务器,可通过应用程序定义的 URL 公开获取。 换…...

C语言 - 结构体、结构体数组、结构体指针和结构体嵌套
结构体的意义 问题:学籍管理需要每个学生的下列数据:学号、姓名、性别、年龄、分数,请用 C 语言程序存储并处理一组学生的学籍。 单个学生学籍的数据结构: 学号(num): int 型姓名(…...

python安装playwright问题记录
python安装playwright这个时候,有得时候会https timeout 有的时候会 not found。 我最后使用的方法三,挺好用的。 PyPI The Python Package Index 可以尝试使用的方法 1. 更换pip源:使用国内的pip源可以提高下载速度并减少超时问题。例如,…...