STM32——感应开关盖垃圾桶

STM32——感应开关盖垃圾桶

1.定时器介绍

软件定时

缺点:不精确、占用CPU资源

void Delay500ms() //@11.0592MHz
{
    unsigned char i, j, k;
    _nop_();
    i = 4;
    j = 129;
    k = 119;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

定时器工作原理

使用精准的时基,通过硬件的方式,实现定时功能。定时器核心就是计数器。

2.PWM介绍

STM32F103C8T6 PWM资源:

高级定时器(TIM1):7路

通用定时器(TIM2~TIM4):各4路

PWM输出模式:

PWM模式1:在向上计数时,一旦 CNT < CCRx 时输出为有效电平,否则为无效电平; 在向下计数时,一旦 CNT > CCRx 时输出为无效电平,否则为有效电平。

PWM模式2:在向上计数时,一旦 CNT < CCRx 时输出为无效电平,否则为有效电平; 在向下计数时,一旦 CNT > CCRx 时输出为有效电平,否则为无效电平。
在这里插入图片描述

PWM周期与频率:
在这里插入图片描述

3.呼吸灯

LED灯为什么可以越来越亮,越来越暗?

这是由不同的占空比决定的。

代码实现

// 定义变量
uint16_t pwmVal=0; //调整PWM占空比
uint8_t dir=1; //设置改变方向。1:占空比越来越大;0:占空比越来越小
// 使能 Timer4 第3通道 PWM 输出
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
// while循环实现呼吸灯效果
while (1)
{
    HAL_Delay(1);
    if (dir)
        pwmVal++;
    else
        pwmVal--;
    if (pwmVal > 500)
        dir = 0;
    if (pwmVal == 0)
        dir =1;
    //修改比较值,修改占空比
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, pwmVal);
}

项目实现

项目需求

检测靠近时,垃圾桶自动开盖并伴随滴一声,2秒后关盖

发生震动时,垃圾桶自动开盖并伴随滴一声,2秒后关盖

按下按键时,垃圾桶自动开盖并伴随滴一声,2秒后关盖

项目框图
在这里插入图片描述

硬件清单

SG90舵机,超声波模块,震动传感器,蜂鸣器

舵机介绍

在这里插入图片描述

角度控制

  • 0.5ms-------------0度; 2.5% 对应函数中CCRx为5
  • 1.0ms------------45度; 5.0% 对应函数中CCRx为10
  • 1.5ms------------90度; 7.5% 对应函数中CCRx为15
  • 2.0ms-----------135度; 10.0% 对应函数中CCRx为20
  • 2.5ms-----------180度; 12.5% 对应函数中CCRx为25

编程实现

需求

每隔1s,转动一个角度:0度 --> 45度 --> 90度 --> 135度 --> 180度 --> 0度

代码实现

HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
while (1)
{
    HAL_Delay(1000);
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 5);
    HAL_Delay(1000);
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 10);
    HAL_Delay(1000);
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 15);
    HAL_Delay(1000);
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 20);
    HAL_Delay(1000);
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 25);
}

超声波传感器介绍

  • 怎么让它发送波

Trig ,给Trig端口至少10us的高电平

  • 怎么知道它开始发了

Echo信号,由低电平跳转到高电平,表示开始发送波

  • 怎么知道接收了返回波

Echo,由高电平跳转回低电平,表示波回来了

  • 怎么算时间

Echo引脚维持高电平的时间!

  • 波发出去的那一下,开始启动定时器

波回来的拿一下,我们开始停止定时器,计算出中间经过多少时间

  • 怎么算距离

距离 = 速度 (340m/s)* 时间/2外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编程实现

需求:使用超声波测距,当手离传感器距离小于5cm时,LED1点亮,否则保持不亮状态。

接线

Trig — PB6

Echo — PB7

LED1 — PB8外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编写微秒级函数

//使用TIM2来做us级延时函数
void TIM2_Delay_us(uint16_t n_us)
{
    /* 使能定时器2计数 */
    __HAL_TIM_ENABLE(&htim2);
    __HAL_TIM_SetCounter(&htim2, 0);
    while(__HAL_TIM_GetCounter(&htim2) < ((1 * n_us)-1) );
    /* 关闭定时器2计数 */
    __HAL_TIM_DISABLE(&htim2);
}

主函数:

//1. Trig ,给Trig端口至少10us的高电平

//2. echo由低电平跳转到高电平,表示开始发送波

//波发出去的那一下,开始启动定时器

//3. 由高电平跳转回低电平,表示波回来了

//波回来的那一下,我们开始停止定时器

//4. 计算出中间经过多少时间

//5. 距离 = 速度 (340m/s)* 时间/2(计数1次表示1us)

//每500毫秒测试一次距离

int cnt;
float distance;
while (1)
{
    //1. Trig ,给Trig端口至少10us的高电平
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);//拉高
    TIM2_Delay_us(20);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);//拉低
    //2. echo由低电平跳转到高电平,表示开始发送波
    //波发出去的那一下,开始启动定时器
    while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7) == GPIO_PIN_RESET);//等待输入电平拉高
    HAL_TIM_Base_Start(&htim2);
    __HAL_TIM_SetCounter(&htim2,0);
    //3. 由高电平跳转回低电平,表示波回来了
    while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7) == GPIO_PIN_SET);//等待输入电平变低
    //波回来的那一下,我们开始停止定时器
    HAL_TIM_Base_Stop(&htim2);
    //4. 计算出中间经过多少时间
    cnt = __HAL_TIM_GetCounter(&htim2);
    //5. 距离 = 速度 (340m/s)* 时间/2(计数1次表示1us)
    distance = cnt*340/2*0.000001*100; //单位:cm
    if(distance < 5)
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
    else
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
    //每500毫秒测试一次距离
    HAL_Delay(500);
}        

封装成函数

void TIM2_Delay_us(uint16_t n_us)
{
    /* 使能定时器2计数 */
    __HAL_TIM_ENABLE(&htim2);
    __HAL_TIM_SetCounter(&htim2, 0);
    while(__HAL_TIM_GetCounter(&htim2) < ((1 * n_us)-1) );
    /* 关闭定时器2计数 */
    __HAL_TIM_DISABLE(&htim2);
}

double getDistance()
{
    int time=0;

    //1. Trig ,给Trig端口至少10us的高电平
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
    TIM2_Delay_us(20);
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);

    //2.2. echo由低电平跳转到高电平,表示开始发送波
    while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)==GPIO_PIN_RESET);

    //3.波发出去的那一下,开始启动定时器
    HAL_TIM_Base_Start(&htim2);
    __HAL_TIM_SetCounter(&htim2,0);//让定时器从0开始数数

    //4. 由高电平跳转回低电平,表示波回来了
    while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)==GPIO_PIN_SET);

    //5.波回来的那一下,我们开始停止定时器
    HAL_TIM_Base_Stop(&htim2);

    //6. 计算出中间经过多少时间
    time=__HAL_TIM_GetCounter(&htim2);

    //7.距离 = 速度 (340m/s)* 时间/2(计数1次表示1us)
    return (340*time*0.000001/2*100);
}

int main()
{
    double distance=0;

    while (1)
    {


        distance=getDistance();
        if(distance<5)
            HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
        else
            HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
        //8.每500毫秒测试一次距离
        HAL_Delay(500);

    }

}

项目设计及实现

项目设计

超声波模块:

Trig – PB6

Echo – PB7

sg90****舵机:

PWM – PB9

按键:

KEY1 – PA0

LED****灯:

LED1 – PB8

震动传感器:

D0 – PB5

VCC – 5V

蜂鸣器:

IO – PB4

VCC – 3V3

测距开关盖

硬件:超声波模块,舵机

void TIM2_Delay_us(uint16_t n_us)
{
    /* 使能定时器2计数 */
    __HAL_TIM_ENABLE(&htim2);
    __HAL_TIM_SetCounter(&htim2, 0);
    while(__HAL_TIM_GetCounter(&htim2) < ((1 * n_us)-1) );
    /* 关闭定时器2计数 */
    __HAL_TIM_DISABLE(&htim2);
}

double getDistance()
{
    int time=0;

    //1. Trig ,给Trig端口至少10us的高电平
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
    TIM2_Delay_us(20);
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);

    //2.2. echo由低电平跳转到高电平,表示开始发送波
    while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)==GPIO_PIN_RESET);

    //3.波发出去的那一下,开始启动定时器
    HAL_TIM_Base_Start(&htim2);
    __HAL_TIM_SetCounter(&htim2,0);//让定时器从0开始数数

    //4. 由高电平跳转回低电平,表示波回来了
    while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)==GPIO_PIN_SET);

    //5.波回来的那一下,我们开始停止定时器
    HAL_TIM_Base_Stop(&htim2);

    //6. 计算出中间经过多少时间
    time=__HAL_TIM_GetCounter(&htim2);

    //7.距离 = 速度 (340m/s)* 时间/2(计数1次表示1us)
    return (340*time*0.000001/2*100);
}

void closeStatusLight()
{
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}

void initSg90_0()
{
    HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4);
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 5);
}

void openDusBin()
{
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 15);
    HAL_Delay(2000);
}

void closeDusBin()
{
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 5);
    HAL_Delay(150);
}

int main(void)
{
    double distance=0;

    initSg90_0();

    while (1)
    {

        distance=getDistance();
        if(distance<5)
        {
            openDusBin();
            openStatusLight();
        }	
        else
        {
            closeDusBin();
            closeStatusLight();
        }	

    }
}

在测距开光盖的基础上加上按键开盖和震动开盖

void TIM2_Delay_us(uint16_t n_us)
{
    /* 使能定时器2计数 */
    __HAL_TIM_ENABLE(&htim2);
    __HAL_TIM_SetCounter(&htim2, 0);
    while(__HAL_TIM_GetCounter(&htim2) < ((1 * n_us)-1) );
    /* 关闭定时器2计数 */
    __HAL_TIM_DISABLE(&htim2);
}

double getDistance()
{
    int time=0;

    //1. Trig ,给Trig端口至少10us的高电平
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
    TIM2_Delay_us(20);
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);

    //2.2. echo由低电平跳转到高电平,表示开始发送波
    while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)==GPIO_PIN_RESET);

    //3.波发出去的那一下,开始启动定时器
    HAL_TIM_Base_Start(&htim2);
    __HAL_TIM_SetCounter(&htim2,0);//让定时器从0开始数数

    //4. 由高电平跳转回低电平,表示波回来了
    while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)==GPIO_PIN_SET);

    //5.波回来的那一下,我们开始停止定时器
    HAL_TIM_Base_Stop(&htim2);

    //6. 计算出中间经过多少时间
    time=__HAL_TIM_GetCounter(&htim2);

    //7.距离 = 速度 (340m/s)* 时间/2(计数1次表示1us)
    return (340*time*0.000001/2*100);
}

void openStatusLight()
{
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
}

void closeStatusLight()
{
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}

void initSg90_0()
{
    HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4);
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 5);
}

void openDusBin()
{
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 15);
    HAL_Delay(2000);
}

void closeDusBin()
{
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 5);
    HAL_Delay(150);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin==GPIO_PIN_0||GPIO_Pin==GPIO_PIN_5)
    {
        if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET||
           HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5)==GPIO_PIN_RESET)
        {
            openStatusLight();
            openDusBin();
        }	
    }			
}

int main(void)
{
    double distance=0;

    HAL_NVIC_SetPriority(SysTick_IRQn,0,0);
    initSg90_0();

    while (1)
    {
        distance=getDistance();
        if(distance<10)
        {
            openDusBin();
            openStatusLight();
        }	
        else
        {
            closeDusBin();
            closeStatusLight();
        }	
    }
}

项目完结

#define  OPEN  1
#define  CLOSE 0

char flag=0;

void TIM2_Delay_us(uint16_t n_us)
{
    /* 使能定时器2计数 */
    __HAL_TIM_ENABLE(&htim2);
    __HAL_TIM_SetCounter(&htim2, 0);
    while(__HAL_TIM_GetCounter(&htim2) < ((1 * n_us)-1) );
    /* 关闭定时器2计数 */
    __HAL_TIM_DISABLE(&htim2);
}

double getDistance()
{
    int time=0;

    //1. Trig ,给Trig端口至少10us的高电平
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
    TIM2_Delay_us(20);
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);

    //2.2. echo由低电平跳转到高电平,表示开始发送波
    while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)==GPIO_PIN_RESET);

    //3.波发出去的那一下,开始启动定时器
    HAL_TIM_Base_Start(&htim2);
    __HAL_TIM_SetCounter(&htim2,0);//让定时器从0开始数数

    //4. 由高电平跳转回低电平,表示波回来了
    while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)==GPIO_PIN_SET);

    //5.波回来的那一下,我们开始停止定时器
    HAL_TIM_Base_Stop(&htim2);

    //6. 计算出中间经过多少时间
    time=__HAL_TIM_GetCounter(&htim2);

    //7.距离 = 速度 (340m/s)* 时间/2(计数1次表示1us)
    return (340*time*0.000001/2*100);
}

void openStatusLight()
{
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
}

void closeStatusLight()
{
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}

void initSg90_0()
{
    HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4);
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 5);
}

void  beepDusBin()
{
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
    HAL_Delay(100);
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
}

void openDusBin()
{
    if(flag==CLOSE)
    {		
        flag=OPEN;
        __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 15);
        beepDusBin();
    }
    HAL_Delay(2000);
}

void closeDusBin()
{
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 5);
    flag=CLOSE;
    HAL_Delay(150);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin==GPIO_PIN_0||GPIO_Pin==GPIO_PIN_5)
    {
        if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET||
           HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5)==GPIO_PIN_RESET)
        {
            openStatusLight();
            openDusBin();
        }	
    }			
}

int main(void)
{
    double distance=0;

    HAL_NVIC_SetPriority(SysTick_IRQn,0,0);
    initSg90_0();

    while (1)
    {
        distance=getDistance();
        if(distance<10)
        {
            openDusBin();
            openStatusLight();
        }	
        else
        {
            closeDusBin();
            closeStatusLight();
        }	
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Orion-14B-Chat-Plugin [model server error]解决方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

MIT 6.5830 概述

简介 同MIT6.824系列类似&#xff0c;6.4830是关于Database System的一门课程&#xff0c;官方主页链接。 从课程信息可知&#xff0c;理论课分为 21 个课时&#xff0c;3个问题集&#xff0c;4个实验&#xff0c;1个项目。课程的 ppt 可以下载&#xff0c;对应的课堂回放可以…

【Delphi】IDE 工具栏错乱恢复

由于经常会在4K和2K显示器上切换Delphi开发环境(IDE)&#xff0c;导致IDE工具栏错乱&#xff0c;咋样设置都无法恢复&#xff0c;后来看到红鱼儿的博客&#xff0c;说是通过操作注册表的方法&#xff0c;能解决&#xff0c;试了一下&#xff0c;果真好用&#xff0c;非常感谢分…

WPF 提示无法启动PackIcon,因为已经启用仅平台控件选项

vs打开wpf项目的页面文件&#xff0c;提示如下&#xff1a; 点击此处重新加载设计器&#xff0c;页面无反应&#xff1b; 点击仅显示控制平台控件及重新加载时&#xff0c;页面可以显示&#xff0c;但是PackIocn不能显示&#xff0c;如下图&#xff1a; 切换后&#xff0c;如…

LVS常用的NAT模式和DR模式实战示例

引言&#xff1a;紧接上文&#xff0c;了解LVS&#xff0c;这一篇就够了-CSDN博客&#xff0c;今天我们对LVS常用的两种模式来进行示例配置演示 LVS-NAT模式 1、环境准备 准备 3 台纯净的虚拟机 关闭防火墙和selinux 例&#xff1a; lvs-server 添加两个网卡 NAT模式 …

Spring | Spring的“数据库开发“ (Srping JDBC)

目录&#xff1a; Spring JDBC1.Spring JDBC的核心类 ( JdbcTemplate类 )2.Srping JDBC 的配置3.JdbcTemplate类的“常用方法”execute( )&#xff1a;直接执行“sql语句”&#xff0c;没有返回值update( ) &#xff1a;“增删改”&#xff0c;返回 “影响的行数”query( ) : “…

C# OpenCvSharp DNN Gaze Estimation 视线估计

目录 介绍 效果 模型信息 项目 代码 frmMain.cs GazeEstimation.cs 下载 C# OpenCvSharp DNN Gaze Estimation 介绍 训练源码地址&#xff1a;https://github.com/deepinsight/insightface/tree/master/reconstruction/gaze 效果 模型信息 Inputs ----------------…

【Java程序设计】【C00214】基于SSM的社区物资购买系统(论文+PPT)

基于SSM的社区物资购买系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这个一个基于SSM的社区物资购物管理系统&#xff0c;本系统共分为二种权限&#xff1a;管理员、用户 管理员&#xff1a;首页、个人中心、用户管理、商品分类管…

1178:单词数

题目描述 统计一篇文章里不同单词的总数。 输入 有多组数据&#xff0c;每组一行&#xff0c;每组就是一篇小文章。每篇小文章都是由大小写字母和空格组成&#xff0c;没有标点符号&#xff0c;遇到#时表示输入结束。每篇文章的单词数小于1000&#xff0c;每个单词最多由30个…

serial库对串口的基本使用

serial库对串口的基本使用 serial库用于串口通信。它提供了一组函数和类&#xff0c;用于在计算机和外部设备之间进行串口通信。通过使用serial库可以读取和写入串口数据&#xff0c;以实现与各种外部设备的通信&#xff0c;如传感器、微控制器、嵌入式系统等。 支持多平台&a…

Linux浅学笔记03

目录 有关root的命令 用户和用户组 用户组管理&#xff1a;&#xff08;以下需要root用户执行&#xff09; 创建用户组: 删除用户组&#xff1a; 用户管理&#xff1a;&#xff08;以下需要root用户执行&#xff09; 创建用户&#xff1a; 删除用户&#xff1a; 查看用…

DataTable.Load(reader)注意事项

对于在C#中操作数据库查询&#xff0c;这样的代码很常见&#xff1a; using var cmd ExecuteCommand(sql); using var reader cmd.ExecuteReader(); DataTable dt new DataTable(); dt.Load(reader); ...一般的查询是没问题的&#xff0c;但是如果涉及主键列的查询&#xf…

宠物空气净化器有改善空气质量吗?猫用空气净化器哪些品牌好?

大家都知道&#xff0c;在宠物换毛季节&#xff0c;宠物的掉毛非常严重&#xff0c;几乎遍布整个家里。这给家中的小孩和老人带来了很多困扰&#xff0c;可能导致他们流鼻涕、过敏等问题。此外&#xff0c;猫咪有时候会随地拉撒&#xff0c;那个味道真的很难闻。家里的其他人对…

妈妈,我的压岁钱呢?

这是老郭的第30篇原创文章 春节的脚步越来越近&#xff0c;又到了孩子们欢天喜地收压岁钱的时刻。但是&#xff0c;如何让这笔“意外之财”变成孩子们的“大财富”呢&#xff1f; 孩子的想法 哈哈&#xff0c;终于拿到了压岁钱&#xff01; 我要买那个新出的游戏、那个最酷的玩…

wordcloud库和jieba库的使用

文章目录 wordcloud库的简单示范使用wordcloud库报错记录anaconda安装第三方jieba库jieba库的简单示范任务 1&#xff1a;三国演义中的常见词汇分布在“三国"这两个隶书字上&#xff0c;出现频率高的词字体大任务 2&#xff1a;三国演义中出现频率前十的人名。必须是以下这…

如何快速记忆小鹤双拼键位图?

记忆方法&#xff1a;韵母表 图形 最常用字 韵母表&#xff1a;双拼的基础 图形&#xff1a;帮助新手快速联想回忆 最常用字&#xff1a;快速打字基础 一、单韵母&#xff08;紫色方块&#xff09; 一一对应如下表&#xff1a; 单韵母aoeiu、AOEIV 二、复韵母—箭矢型&am…

【前沿】超透镜阵列可实现下一代真3D近眼显示器

由于体积小、全视差、全彩显示方便&#xff0c;更重要的是&#xff0c;通过消除会聚-调节冲突 &#xff08;VAC&#xff09; 实现真正的 3D 和更逼真的深度感知&#xff0c;所以集成成像显示器成为最有前途的近眼显示器 &#xff08;NED&#xff09; 之一。然而&#xff0c;基于…

操作系统--进程、线程基础知识

一、进程 我们编写的代码只是一个存储在硬盘的静态文件&#xff0c;通过编译后就会生成二进制可执行文件&#xff0c;当我们运行这个可执行文件后&#xff0c;它会被装载到内存中&#xff0c;接着 CPU 会执行程序中的每一条指令&#xff0c;那么这个运行中的程序&#xff0c;就…

uni-app app引入天地图

话不多说咸鱼来了 <template><view><div class"mapBox" style"width: 100%; height: 100vh;background: #ddc0c0;" id"mapId" ></div></view> </template> <script module"test" lang"r…

[docker] Docker容器服务更新与发现之consul

一、consul的相关知识 1.1 什么是注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构&#…