基于STM32的学习环境控制系统设计

🤞🤞大家好,这里是5132单片机毕设设计项目分享,今天给大家分享的是学习环境控制

设备的详细功能见网盘中的文章《21、基于STM32的学习环境控制系统设计》:

链接:https://pan.baidu.com/s/1uWSZX2zbZwy9sYwwnvyktQ?pwd=5132

提取码:5132

 目录

1、系统功能

2、演示视频和实物

3、系统设计框图

4、软件设计流程图

5、原理图

6、主程序

7、总结


1、系统功能

本次的项目是智能学习环境自动调节系统。
1、元器件采用了STM32F103C8T6作为主控,
2、光敏电阻用来检测环境的光照强度,声音传感器模块用来检测环境的噪声。
3、LED灯用来模拟台灯,通过PWM控制实现亮度的调节。
4、超声波传感器用来检测坐姿。
5、语音识别模块用来识别用户的指令,实现语音控制。
6、hc-05蓝牙模块实现在家远程控制。
7、按键模块实现模式控制和亮度调节。
8、蜂鸣器报警模块,当环境噪声大于设定阈值蜂鸣器报警。
9、OLED液晶显示屏用来显示传感器数据。
控制模式有:手动控制,语音控制,蓝牙控制,自动控制。

2、演示视频和实物

基于STM32的智能学习环境设计(版本1)

3、系统设计框图

4、软件设计流程图

5、原理图

6、主程序

#include "sys.h"    //有定制和购买的,可以联系VX:lwfw123456789
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
/***********************************************************************************************
同学好!我们是5132单片机设计,定制单片机设计,实物和说明书均可定制,欢迎大家咨询。VX:lwfw123456789
其他项目演示视频和说明请大家移步哔哩哔哩、CSDN和公众号等。
哔哩哔哩:5132单片机设计
CSDN:    5132单片机设计
公众号:  5132单片机设计
抖音  :  5132单片机设计
小红书:  5132单片机设计
咸鱼:    5132单片机设计
************************************************************************************************/
u8 hour_h, min_m, sec_s, msec_ms; //秒表---时、分、秒、毫秒
u8 state, state2, state2_1, state3, state4;       //按键状态标志
u8 t = 0;                                     //传感器读取时间间隔
u8 flag;                               //远程控制标志
u8 flag2 = 0, flag1, flag3;
uint16_t RTC_Time[] = {0, 0, 0};
uint16_t RTC_Time1[] = {7, 0, 0};    //定时时间---开
uint16_t RTC_Time2[] = {19, 0, 0};   //定时时间---关
u8 T_state, T_state1, qingping = 1, state_dingshi_yu_guan, state_dingshi_yu_kai, state_dingshi_yu_switch, state3_1;
uint32_t GuangYu1 = 10,GuangYu2 = 30,GuangYu3 = 50,GuangYu4 = 70;  
extern void TimeSet(void);
extern void TimeRead(void);
extern void DingShiMoShi(void);
extern void YuYin(void);
extern void ChuangGan(void);
extern void msec_time(void);
extern void msec_Calcu(void);

void MY_Gizwits_Init(void)              //机智云初始化函数
{
    TIM3_Int_Init(9, 7199); //1MS系统定时
    usart3_init(9600);//WIFI初始化
    memset((uint8_t *)&currentDataPoint, 0, sizeof(dataPoint_t)); //设备状态结构体初始化
    gizwitsInit();//环形缓冲区初始化
    gizwitsSetMode(2);   //设置模式
    userInit();
}


void shoudong()
{
    TimeRead();
    if (KeyNum == 2)        //按键PB0控制窗户开关
    {
        delay_ms(20);
        if (KeyNum == 2)
        {
            state2++;
            if (state2 > 5)
            {
                state2 = 0;
            }
        }
    }

    switch (state2)
    {
    case 0:
        PWM_SetCompare1(0);
        break;
    case 1:
        PWM_SetCompare1(10);

        break;
    case 2:
        PWM_SetCompare1(30);

        break;
    case 3:
        PWM_SetCompare1(50);
        break;
    case 4:
        PWM_SetCompare1(70);
        break;
    default:
        break;
    }
}
void zhidong()
{

	     switch (state4)
        {
        case 1:
            PWM_SetCompare1(0);

            break;
        case 2:
            PWM_SetCompare1(33);

            break;
        case 3:
            PWM_SetCompare1(66);

            break;
				case 4:

            break;      
        default:
            break;
        }  
}

int main(void)
{

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    uart_init(9600);       //串口初始化为9600
    delay_init();      //延时函数初始化
    Buzzer_Init();             //下面为外设初始化
    OLED_Init();
    Key_Init();
    AD_Init();
    MyRTC_Init();
    PWM_Init();
    MY_Gizwits_Init();   //机智云初始化
		Serial2_Init();   //串口2初始化(语音识别模块)
    TIM4_Int_Init(99, 7199);

    while (1)
    {
        userHandle();    //数据上传
        gizwitsHandle((dataPoint_t *)&currentDataPoint);   //后台处理,必须放在while里

        if (t % 10 == 0)
        {
            AD0 = AD_GetValue(ADC_Channel_1);    //光照传感器     PA0
            if (AD0 > 4000)AD0 = 4000;
            bufe[0] = (u8)(100 - (AD0 / 40));
					
					  if(bufe[0]<GuangYu1)  state4=4;	
					  else if(bufe[0]<GuangYu2)  state4=3;
					  else if(bufe[0]<GuangYu3)  state4=2;	
						else if(bufe[0]<GuangYu4)  state4=1;
        }
        t++;

        KeyNum = Key_GetNum();
        if (KeyNum == 1)
        {
            qingping = 0;
            state2 = 0,
            delay_ms(20);
            if (KeyNum == 1)
            {
                state++;
                if (state > 3)
                {
                    state = 0;
                }
            }
        }
        if (state == 0)                                //远程模式
        {
            if (qingping == 0)
            {
                OLED_Clear();
                qingping = 1;
            }
            TimeRead();
            ChuangGan();
            OLED_ShowChinese(1, 7, 49);
            OLED_ShowChinese(1, 8, 50);
        }
        if (state == 2)                           //自动模式
        {
            OLED_ShowChinese(1, 7, 51);
            OLED_ShowChinese(1, 8, 52);
            TimeRead();
            zhidong();
            ChuangGan();
            msec_time();
        }
        if (state == 1)                           //手动模式
        {
            OLED_ShowChinese(1, 7, 18);
            OLED_ShowChinese(1, 8, 52);
            ChuangGan();
            shoudong();
        }
        if (state == 3)                           //语音模式
        {
            if (qingping == 0)
            {
                OLED_Clear();
                qingping = 1;
            }
            OLED_ShowChinese(1, 7, 57);
            OLED_ShowChinese(1, 8, 58);
            TimeRead();
            ChuangGan();
						YuYin();
        }
    }
}



void TimeSet()           //设置时间
{
    if (KeyNum == 2)    //PB10
    {
        delay_ms(20);
        if (KeyNum == 2)
        {
            T_state++;
            if (T_state > 2)
            {
                T_state = 0;
            }
        }
    }
    if (T_state == 0)    //时间显示模式
    {
        MyRTC_ReadTime();

        OLED_ShowNum(1, 5, MyRTC_Time[3], 2);    //时
        OLED_ShowString(1, 7, ":");
        OLED_ShowNum(1, 8, MyRTC_Time[4], 2);    //分
        OLED_ShowString(1, 10, ":");
        OLED_ShowNum(1, 11, MyRTC_Time[5], 2);   //秒

        RTC_Time[0] = MyRTC_Time[3];
        RTC_Time[1] = MyRTC_Time[4];
        RTC_Time[2] = MyRTC_Time[5];
    }
    if (T_state == 1)    //修改时间
    {
        if (KeyNum == 5)
        {
            delay_ms(20);
            if (KeyNum == 5)
            {
                T_state1++;
                if (T_state1 > 2)
                {
                    T_state1 = 0;
                }
            }
        }
        if (T_state1 == 0)  //修改时
        {
            if (KeyNum == 4)RTC_Time[0]++;
            if (KeyNum == 3)RTC_Time[0]--;
            if (RTC_Time[0] > 23 & RTC_Time[0] < 100)RTC_Time[0] = 0;
            if (RTC_Time[0] > 100)RTC_Time[0] = 23;
            OLED_ShowNum(1, 5, RTC_Time[0], 2);  //时
        }
        if (T_state1 == 1)  //修改分
        {
            if (KeyNum == 4)RTC_Time[1]++;
            if (KeyNum == 3)RTC_Time[1]--;
            if (RTC_Time[1] > 59 & RTC_Time[1] < 100)RTC_Time[1] = 0;
            if (RTC_Time[1] > 100)RTC_Time[1] = 59;
            OLED_ShowNum(1, 8, RTC_Time[1], 2);  //时
        }
        if (T_state1 == 2)  //修改秒
        {
            if (KeyNum == 4)RTC_Time[2]++;
            if (KeyNum == 3)RTC_Time[2]--;
            if (RTC_Time[2] > 59)RTC_Time[2] = 0;
            if (RTC_Time[2] > 59 & RTC_Time[2] < 100)RTC_Time[2] = 0;
            if (RTC_Time[2] > 100)RTC_Time[2] = 59;
            OLED_ShowNum(1, 11, RTC_Time[2], 2);  //时
        }
    }
    if (T_state == 2)
    {
        MyRTC_Time[3] = RTC_Time[0];
        MyRTC_Time[4] = RTC_Time[1];
        MyRTC_Time[5] = RTC_Time[2];
        MyRTC_SetTime();
        T_state = 0;
    }
}

void TimeRead()
{
    MyRTC_ReadTime();

    OLED_ShowNum(1, 5, MyRTC_Time[3], 2);    //时
    OLED_ShowString(1, 7, ":");
    OLED_ShowNum(1, 8, MyRTC_Time[4], 2);    //分
    OLED_ShowString(1, 10, ":");
    OLED_ShowNum(1, 11, MyRTC_Time[5], 2);   //秒
}


void DingShiMoShi()
{
    TimeRead();

//...............................定时模式..................................../
    if ((MyRTC_Time[3] == RTC_Time1[0]) && (MyRTC_Time[4] == RTC_Time1[1]) && (MyRTC_Time[5] == RTC_Time1[2]))
    {
        //外设操作
    }

    if ((MyRTC_Time[3] == RTC_Time2[0]) && (MyRTC_Time[4] == RTC_Time2[1]) && (MyRTC_Time[5] == RTC_Time2[2]))
    {
        //外设操作
    }

//...............................修改定时时间..................................../

    OLED_ShowChinese(3, 1, 31);
    OLED_ShowString(3, 3, ":");
    OLED_ShowNum(3, 5, RTC_Time1[0], 2);
    OLED_ShowString(3, 7, ":");
    OLED_ShowNum(3, 8, RTC_Time1[1], 2);
    OLED_ShowString(3, 10, ":");
    OLED_ShowNum(3, 11, RTC_Time1[2], 2);

    OLED_ShowChinese(4, 1, 32);
    OLED_ShowString(4, 3, ":");
    OLED_ShowNum(4, 5, RTC_Time2[0], 2);
    OLED_ShowString(4, 7, ":");
    OLED_ShowNum(4, 8, RTC_Time2[1], 2);
    OLED_ShowString(4, 10, ":");
    OLED_ShowNum(4, 11, RTC_Time2[2], 2);


    if (KeyNum == 5)
    {
        delay_ms(20);
        if (KeyNum == 5)
        {
            state_dingshi_yu_switch++;
            if (state_dingshi_yu_switch > 2)
            {
                state_dingshi_yu_switch = 0;
            }
        }
    }

    if (state_dingshi_yu_switch == 1)    //设置阈值开的时间
    {
        if (KeyNum == 2)
        {
            delay_ms(20);
            if (KeyNum == 2)
            {
                state_dingshi_yu_kai++;
                if (state_dingshi_yu_kai > 2)
                {
                    state_dingshi_yu_kai = 0;
                }
            }
        }
        if (state_dingshi_yu_kai == 0)    //时
        {
            if (KeyNum == 3) RTC_Time2[0]++;
            if (KeyNum == 4) RTC_Time2[0]--;
        }
        if (state_dingshi_yu_kai == 1)//分
        {
            if (KeyNum == 3) RTC_Time2[1]++;
            if (KeyNum == 4) RTC_Time2[1]--;
        }
        if (state_dingshi_yu_kai == 2)//秒
        {
            if (KeyNum == 3) RTC_Time2[2]++;
            if (KeyNum == 4) RTC_Time2[2]--;
        }
    }
    else
    {
        if (KeyNum == 2)
        {
            delay_ms(20);
            if (KeyNum == 2)
            {
                state_dingshi_yu_guan++;
                if (state_dingshi_yu_guan > 2)
                {
                    state_dingshi_yu_guan = 0;
                }
            }
        }
        if (state_dingshi_yu_guan == 0)    //时
        {
            if (KeyNum == 3) RTC_Time1[0]++;
            if (KeyNum == 4) RTC_Time1[0]--;
        }
        if (state_dingshi_yu_guan == 1)//分
        {
            if (KeyNum == 3) RTC_Time1[1]++;
            if (KeyNum == 4) RTC_Time1[1]--;
        }
        if (state_dingshi_yu_guan == 2)//秒
        {
            if (KeyNum == 3) RTC_Time1[2]++;
            if (KeyNum == 4) RTC_Time1[2]--;
        }
    }
    if (state3_1 == 0)    //时
    {
        if (KeyNum == 5) RTC_Time1[0]++;
        if (KeyNum == 6) RTC_Time1[0]--;
    }
    if (state3_1 == 1)//分
    {
        if (KeyNum == 5) RTC_Time1[1]++;
        if (KeyNum == 6) RTC_Time1[1]--;
    }
    if (state3_1 == 2)//秒
    {
        if (KeyNum == 5) RTC_Time1[2]++;
        if (KeyNum == 6) RTC_Time1[2]--;
    }
}

void YuYin()
{
    if (Serial2_RxFlag == 1)        //串口接收到数据包的标志位,若是收到数据包,会置1
    {
				if (strcmp(Serial2_RxPacket, "LED_ON") == 0)
        {
                     PWM_SetCompare1(66);;
        }
        else if (strcmp(Serial2_RxPacket, "LED_OFF") == 0)
        {
                      PWM_SetCompare1(0);;
        }
        Serial2_RxFlag = 0; //将标志位清零,不清零就接收不到下一个数据包了
    }
}


void ChuangGan()
{
	  char time_ms[8] = {0};  //时间缓冲区
    sprintf(time_ms, "%02d:%02d:%02d:%02d", hour_h, min_m, sec_s, msec_ms);
    OLED_ShowString(4, 3, time_ms); //oled显示时间
    delay_ms(10);
			
    OLED_ShowChinese(2, 1, 53);
    OLED_ShowChinese(2, 2, 54);
    OLED_ShowString(2, 5, ":");
    OLED_ShowNum(2, 6, bufe[0], 2);
    OLED_ShowString(2, 8, "%");

    OLED_ShowString(3, 1, "LED_DU:");
    OLED_ShowNum(3, 8, state2, 1);
}

void msec_time(void)
{


    switch (KeyNum)
    {
    case 2:
        TIM_ITConfig(TIM4, TIM_IT_Update, DISABLE); //关闭更新中断
        TIM_Cmd(TIM4, DISABLE); //关闭时钟
        break;
    case 3:
        TIM_ITConfig(TIM4, TIM_IT_Update, DISABLE); //关闭更新中断
        TIM_Cmd(TIM4, DISABLE); //关闭时钟
        hour_h = 0;
        min_m = 0;
        sec_s = 0;
        msec_ms = 0;
        break;
    case 4:
        TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); //使能时钟,允许更新中断
        TIM_Cmd(TIM4, ENABLE); //使能时钟

        break;
    default:
        break;
    }
}

void msec_Calcu(void)
{
    msec_ms++;
    if (msec_ms == 100)
    {
        msec_ms = 0;
        sec_s++;
        if (sec_s == 60)
        {
            sec_s = 0;
            min_m++;
            if (min_m == 60)
            {
                min_m = 0;
                hour_h++;
                if (hour_h == 60)
                {
                    OLED_Clear(); //OLED清屏
                    OLED_ShowString(2, 2, "overflow");
                }
            }
        }
    }
}

7、总结

该系统以主控芯片为核心,集环境监测、模式控制与外设驱动于一体。通过光照等传感器采集数据,支持远程、手动、自动、语音四种模式。可切换模式控制 LED 亮度,具备秒表功能,利用 WIFI 与机智云交互,语音模块可实现语音控制。

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

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

相关文章

WPS接入DeepSeek模型

1.wps 下载安装 WPS-支持多人在线协作编辑Word、Excel和PPT文档_WPS官方网站 &#xff08;最好是安装最新的wps&#xff09; 2.offieceAi工具下载安装 软件下载 | OfficeAI助手 下载后安装下载下来的两个工具。安装路径可以自行修改 3.打开WPS,点击文件-》 选项-》信任中心 勾…

4. React 中的 CSS

用例中的干净的脚手架的创建可以参考另一篇文章&#xff1a;3.React 组件化开发React官方并没有给出在React中统一的样式风格&#xff1a; 由此&#xff0c;从普通的css&#xff0c;到css modules&#xff0c;再到css in js&#xff0c;有几十种不同的解决方案&#xff0c;上百…

Unity进阶教程AOI算法原理详解

最新课程《全栈双客户端(Unity/Cocos) TurnKey方案》更新了AOI专题&#xff0c;今天分享一下AOI算法的实现原理。 AOI的功能和作用 在MMORPG网路游戏当中&#xff0c;单服同时在线一般都会有几千人。当有个玩家执行一个操作&#xff0c;理想情况下要把玩家的操作广播同步给单…

w~大模型~合集30

我自己的原文哦~ https://blog.51cto.com/whaosoft/13284996 #VideoMamba 视频理解因大量时空冗余和复杂时空依赖&#xff0c;同时克服两个问题难度巨大&#xff0c;CNN 和 Transformer 及 Uniformer 都难以胜任&#xff0c;Mamba 是个好思路&#xff0c;让我们看看本文是…

【ThreeJS Basics 1-3】Hello ThreeJS,实现第一个场景

文章目录 环境创建一个项目安装依赖基础 Web 页面概念解释编写代码运行项目 环境 我的环境是 node version 22 创建一个项目 首先&#xff0c;新建一个空的文件夹&#xff0c;然后 npm init -y , 此时会快速生成好默认的 package.json 安装依赖 在新建的项目下用 npm 安装依…

Python----PyQt开发(PyQt基础,环境搭建,Pycharm中PyQttools工具配置,第一个PyQt程序)

一、QT与PyQT的概念和特点 1.1、QT QT是一个1991年由The Qt Company开发的跨平台C图形用户界面应用程序开发 框架&#xff0c;可构建高性能的桌面、移动及Web应用程序。也可用于开发非GUI程序&#xff0c;比如 控制台工具和服务器。Qt是面向对象的框架&#xff0c;使用特殊的代…

PostgreSQL 开发利器:Navicat 核心功能与资源攻略

近几年&#xff0c;&#x1f418; PostgreSQL 在全球数据库排名中表现优异。在 2025 年 2 月 DB-Engines 排名中 (如图)&#xff0c;PostgreSQL 稳居第四名&#xff0c;并逐渐逼近第三名的 Microsoft SQL Server&#xff0c;其评分和受欢迎度持续增长&#xff0c;成为开源数据库…

大模型数据集全面整理:444个数据集下载地址

本文针对Datasets for Large Language Models: A Comprehensive Survey 中的 444 个数据集&#xff08;涵盖8种语言类别和32个领域&#xff09;进行完整下载地址整理收集。 2024-02-28&#xff0c;由杨刘、曹家欢、刘崇宇、丁凯、金连文等作者编写&#xff0c;深入探讨了大型语…

【AI大模型】Ollama部署本地大模型DeepSeek-R1,交互界面Open-WebUI,RagFlow构建私有知识库

文章目录 DeepSeek介绍公司背景核心技术产品与服务应用场景优势与特点访问与体验各个DeepSeek-R系列模型的硬件需求和适用场景 Ollama主要特点优势应用场景安装和使用配置环境变量总结 安装open-webui下载和安装docker desktop配置镜像源安装open-webui运行和使用 RagFlow介绍主…

修改docker内容器中的某配置文件的命令

先找到配置文件config.php find / -name "config.php" 2>/dev/null 然后用vi编辑器修改配置文件 vi /var/www/config.php 最后就是vi的基本操作&#xff0c;根据具体需求使用&#xff1a; vi 有两种主要模式&#xff1a; 命令模式&#xff1a;进入 vi 后的默认…

23.[前端开发]Day23-移动端适配方案-考拉海购移动端项目

01-05 移动端适配rem方案 适配方案 – rem动态html的font-size rem的font-size尺寸 方式一&#xff1a;动态font-size-媒体查询 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Com…

数据中心网络监控

数据中心是全球协作的特定设备网络&#xff0c;用来在internet网络基础设施上传递、加速、展示、计算、存储数据信息。 对于任何利用IT基础设施的企业来说&#xff0c;数据中心都是运营的核心&#xff0c;它本质上为整个业务网络托管业务应用程序和存储空间。数据中心可以是任…

网络初识-

网络的相关概念 一、局域网和广域网 将各种计算机、外部设备等相互连接起来&#xff0c;实现在这个范围内数据通信和资源共享的计算机网络。它的覆盖范围通常在几百米到几公里之内。例如&#xff0c;一个小型企业的办公室&#xff0c;通过交换机将多台电脑连接在一起&#xf…

如何使用DHTMLX Scheduler的拖放功能,在 JS 日程安排日历中创建一组相同的事件

DHTMLX Scheduler 是一个全面的调度解决方案&#xff0c;涵盖了与规划事件相关的广泛需求。假设您在我们的 Scheduler 文档中找不到任何功能&#xff0c;并且希望在我们的 Scheduler 文档中看到您的项目。在这种情况下&#xff0c;很可能可以使用自定义解决方案来实现此类功能。…

haproxy+nginx负载均衡实验

准备三台虚拟机&#xff1a; HAProxy 服务器192.168.65.131Web 服务器 1192.168.65.132Web 服务器 2192.168.65.133 在 HAProxy 服务器&#xff08;192.168.65.131&#xff09;上操作&#xff1a; 安装 HAProxy&#xff1a; sudo yum install -y haproxy编辑 HAProxy 配置…

数据结构与算法之排序算法-插入排序

排序算法是数据结构与算法中最基本的算法之一&#xff0c;其作用就是将一些可以比较大小的数据进行有规律的排序&#xff0c;而想要实现这种排序就拥有很多种方法~ 那么我将通过几篇文章&#xff0c;将排序算法中各种算法细化的&#xff0c;详尽的为大家呈现出来&#xff1a; &…

cv2小练习

基础概念 帧率是指在单位时间内&#xff0c;显示的图像帧数的数量。它是衡量视频或动画流畅度的一个重要指标。帧率的单位通常是每秒帧数&#xff08;Frames Per Second&#xff0c;简称FPS&#xff09;。在数字视频和计算机图形领域&#xff0c;帧率是决定视频播放质量和流畅度…

在Mac arm架构终端中运行 corepack enable yarn 命令,安装yarn

文章目录 1. 什么是 Corepack&#xff1f;2. 运行 corepack enable yarn 的作用3. 如何运行 corepack enable yarn4. 可能遇到的问题及解决方法问题 1&#xff1a;corepack 命令未找到问题 2&#xff1a;Yarn 未正确安装问题 3&#xff1a;权限问题 5. 验证 Yarn 是否启用成功6…

Spring基于文心一言API使用的大模型

有时做项目我们可能会遇到要在项目中对接AI大模型 本篇文章是对使用文心一言大模型的使用总结 前置任务 在百度智能云开放平台中注册成为开发者 百度智能云开放平台 进入百度智能云官网进行登录&#xff0c;点击立即体验 点击千帆大模型平台 向下滑动&#xff0c;进入到模型…

【Vue中BUG解决】npm error path git

报错内容如下&#xff1a; 从错误信息可知&#xff0c;这是一个 ENOENT&#xff08;No Entry&#xff0c;即找不到文件或目录&#xff09;错误&#xff0c;并且与 git 相关。具体来说&#xff0c;npm 在尝试调用 git 时&#xff0c;无法找到 git 可执行文件&#xff0c;下面为…