05-基础例程5

news2024/12/23 12:44:50

基础例程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.5ms
  if(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 IO
             GND-->(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();//初始化UI
  display.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 demo
  display.setFont(ArialMT_Plain_10);

  // The coordinates define the left starting point of the text
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.drawString(0, 10, "Left aligned (0,10)");

  // The coordinates define the center of the text
  display.setTextAlignment(TEXT_ALIGN_CENTER);
  display.drawString(64, 22, "Center aligned (64,22)");

  // The coordinates define the right end of the text
  display.setTextAlignment(TEXT_ALIGN_RIGHT);
  display.drawString(128, 33, "Right aligned (128,33)");
}

void drawRectDemo() {
  // Draw a pixel at given position
  for (int i = 0; i < 10; i++) {
    display.setPixel(i, i);
    display.setPixel(10 - i, i);
  }
  display.drawRect(12, 12, 20, 20);

  // Fill the rectangle
  display.fillRect(14, 14, 17, 17);

  // Draw a line horizontally
  display.drawHorizontalLine(0, 40, 20);

  // Draw a line horizontally
  display.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 bar
  display.drawProgressBar(0, 32, 120, 10, progress);

  // draw the percentage as String
  display.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 files
  display.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 display
  display.clear();
  // draw the current demo method
  demos[demoMode]();

  display.setFont(ArialMT_Plain_10);
  display.setTextAlignment(TEXT_ALIGN_RIGHT);
  display.drawString(128, 54, String(millis()));
  // write the buffer to the display
  display.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");
  }
}

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

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

相关文章

元素居中的方法总结

垂直居中 行内元素垂直居中 单行文本垂直居中 1.line-height: 200px; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0&…

0基础学习VR全景平台篇 第92篇:智慧景区教程

一、上传素材 1.上传全景素材 第一步&#xff1a;进入【素材管理】 第二步&#xff1a;选择【全景图智慧景区】分类 第三步&#xff1a;选择相对景区作品分组&#xff0c;上传全景素材 2.素材标注 第一步&#xff1a;选择上传成功后素材&#xff0c;点击【未标注】 第二步&…

继承

目录 引入 继承介绍 概念 优点 分类 公有继承 保护继承 私有继承 特点 单继承 多继承 赋值 介绍 分类 对象之间赋值(拷贝构造) 验证普通赋值需要创建临时变量 指针/引用赋值 赋值原理 继承中的作用域 介绍 隐藏 / 重定义 前提 介绍 派生类的默认成员函…

TIA博途_更新或修改程序时,如何避免数据块中的参数丢失?

TIA博途_更新或修改程序时,如何避免数据块中的参数丢失? DB 快照功能 可以通过捕获 DB 块变量实际值快照用于恢复值操作,捕获的实际快照值可以复制到 CPU 中的实际值中,也可以用于替换变量的起始值。 通过快照能解决以下场景的问题: • 在 HMI 中设置了很多工艺参数,担心…

python怎么提取视频中的音频

目录 操作步骤 1. 安装MoviePy库&#xff1a; 2. 导入MoviePy库和所需的模块&#xff1a; 3. 提取音频&#xff1a; 可能遇到的问题 1. 编解码器支持&#xff1a; 2. 依赖项安装&#xff1a; 3. 文件路径问题&#xff1a; 4. 内存消耗&#xff1a; 5. 输出文件大小&a…

Rabbitmq的消息转换器

Spring会把你发送的消息序列化为字节发送给MQ&#xff0c;接收消息的时候&#xff0c;还会把字节反序列化为Java对象 ,只不过&#xff0c;默认情况下Spring采用的序列化方式是JDK序列化。众所周知&#xff0c;JDK序列化存在下列问题&#xff1a; 数据体积过大 有安全漏洞 可读…

水稻叶病害数据集(目标检测,yolo使用)

1.数据集文件夹 train文件夹&#xff08;44229张&#xff09;&#xff0c;test文件夹&#xff08;4741张&#xff09;&#xff0c;valid文件夹&#xff08;6000张&#xff09; 2.train文件夹展示 labels展示 标签txt展示 data.yaml文件展示 对数据集感兴趣的可以关注最后一行…

vue cli构建的项目出现 Uncaught runtime errors

使用 vue/cli 脚手架构建的项目&#xff0c;在 npm run dev 运行后&#xff0c;页面出现 Uncaught runtime errors 报错遮罩层&#xff0c;如下图所示。 报错原因 这种错误通常是运行时出的问题&#xff0c;可能是网络错误&#xff0c;可能是变量未定义等等。 这种错误默认在开…

华硕笔记本摄像头倒置怎么办?华硕笔记本摄像头上下颠倒怎么调整

笔记本电脑相较于台式电脑&#xff0c;更易携带&#xff0c;解决了很大一部分人的使用需求。但是笔记本电脑也存在很多不足&#xff0c;比如华硕笔记本电脑就经常会出现摄像头倒置的错误&#xff0c;出现这种问题要如何修复呢&#xff1f;下面就来看看详细的调整方法。 华硕笔记…

linux的make和makefile学习

linux的make和makefile学习 准备工作使用GNU链接库链接到math库编写复利程序 创建自己的库链接到主目录 不同的C标准 准备工作 安装GCC和Make工具 安装中文输入法 参考&#xff1a;http://t.csdn.cn/eH0Ow sudo apt-get update sudo apt-get install ibus sudo apt-get inst…

Flutter Web 项目网络请求报 XMLHttpRequest error 解决方案

使用http库进行简单的网络请求时&#xff0c;运行在Chrome浏览器上&#xff0c;网络请求一直报错 XMLHttpRequest error&#xff0c;而在iOS 模拟器上运行则正常&#xff0c;后面在postman上发送请求&#xff0c;也是正常的。这就是很尴尬了&#xff01;&#xff01;&#xff0…

JavaScript基础知识1

基本说明 1.JavaScript能改变html内容&#xff0c;能改变html属性&#xff0c;能改变html样式&#xff08;CSS&#xff09;&#xff0c;能完成页面的数据验证。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><…

深入理解 JVM 之——动手编译 JDK

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 本篇为深入理解 Java 虚拟机第一章的实战内容&#xff0c;推荐在学习前先掌握基础的 Linux 操作、编译原理基础以及扎实的 C/C 功底。 该系列的 GitHub 仓库&#xff1a;https://github.com/Doge2077/lear…

iOS开发Swift-3-UI与按钮Button-摇骰子App

1.创建新项目Dice 2.图标 删去AppIcon&#xff0c;将解压后的AppIcon.appiconset文件拖入Assets包。 3.将素材点数1-6通过网页制作成2x&#xff0c;3x版本并拖入Asset。 4.设置对应的UI。 5.拖入Button组件并设置style。 6.Ctrl加拖拽将Button拖拽到ViewController里&#xff0…

MySQL8.0.22安装过程记录(个人笔记)

1.点击下载MySQL 2.解压到本地磁盘&#xff08;注意路径中不要有中文&#xff09; 3.在解压目录创建my.ini文件 文件内容为 [mysql] # 设置mysql客户端默认字符集 default-character-setutf8[mysqld] # 设置端口 port 3306 # 设计mysql的安装路径 basedirE:\01.app\05.Tool…

动手学深度学习(四)多层感知机

经过了多层感知机后&#xff0c;相当于将原始的特征转化成了新的特征&#xff0c;或者说提炼出更合适的特征&#xff0c;这就是隐藏层的作用。 from&#xff1a;清晰理解多层感知机和反向传播 - 知乎 一、多层感知机的从零开始实现 import torch from torch import nn from d2…

阿里云大数据实战记录8:拆开 json 的每一个元素,一行一个

目录 一、前言二、目标介绍三、使用 pgsql 实现3.1 拆分 content 字段3.2 拆分 level 字段3.3 拼接两个拆分结果 四、使用 ODPS SQL 实现4.1 拆分 content 字段4.2 拆分 level 字段4.3 合并拆分 五、使用 MySQL 实现六、总结 一、前言 商业场景中&#xff0c;经常会出现新的业…

h5分享页适配手机电脑

实现思路 通过media媒体查询结合rem继承html文字大小来实现。 快捷插件配置 这里使用了VSCode的px to rem插件。 先在插件市场搜索cssrem下载插件&#xff1b; 配置插件 页面编写流程及适配详情 配置meta h5常用配置信息:<meta name"viewport" content&quo…

音频基本知识

声音传播方式: 1)声音的传播需要介质,在真空中不能传播; 2)声波属于纵波,即如下图传播方向与振动方向一致; 声音速度: 1)常温常压下,一般空气速度为340m/s; 2)温度越高,声速越大; 3)液体、固体的传播速度比空气快; 人耳可接收到的频域范围: 1)通常范围…

【DevOps视频笔记】8. Jenkins 配置

一、Jenkins 入门配置 1. 工具 / 插件 介绍 二、插件和工具配置 1. 配置 JDK 和 Maven Stage 1&#xff1a;将服务器中 JDK 和 Maven 映射到 jenkins 容器中 Stage 2&#xff1a;jenkins 全局配置中 -- 指定JAVA_HOME目录 Stage 3&#xff1a;jenkins 全局配置中 -- 指定…