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…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...
rm视觉学习1-自瞄部分
首先先感谢中南大学的开源,提供了很全面的思路,减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接:https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架: 代码框架结构:readme有…...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...
智能体革命:企业如何构建自主决策的AI代理?
OpenAI智能代理构建实用指南详解 随着大型语言模型(LLM)在推理、多模态理解和工具调用能力上的进步,智能代理(Agents)成为自动化领域的新突破。与传统软件仅帮助用户自动化流程不同,智能代理能够自主执行工…...
DL00871-基于深度学习YOLOv11的盲人障碍物目标检测含完整数据集
基于深度学习YOLOv11的盲人障碍物目标检测:开启盲人出行新纪元 在全球范围内,盲人及视觉障碍者的出行问题一直是社会关注的重点。尽管技术不断进步,许多城市的无障碍设施依然未能满足盲人出行的实际需求。尤其是在复杂的城市环境中ÿ…...
