【STM32項目開源】STM32單片機智能語音風扇控制系統

目錄

一、設計背景和意義

1.1設計背景:

1.2設計意義:

二、實物展示

三、硬件功能介紹

2.1 硬件清單:

2.2 功能介紹:

四、軟件設計流程圖

五、硬件PCB展示

六、軟件主函序展示

七、單片機實物資料

資料獲取?查看主頁介紹:兆龍電子單片機設計


一、設計背景和意義

1.1設計背景:

在物聯網與智慧家居快速發展的當下,傳統風扇控制系統存在諸多局限。多數風扇設備仍依賴手動調節,缺乏環境適應性與智能化控制能力,既無法根據室內環境和用戶需求自動調節,也難以滿足精細化吹風需求。隨著人們對使用體驗、能耗控制要求提升,單一控制模式已不適用。

現有智能風扇方案常存在功能割裂問題,遠程調控、傳感器聯動、使用場景適配等功能未能有效整合,且成本較高難以普及。基于此,本設計以 STM32F103C8T6 為核心,融合多傳感器與語音控制技術,構建低成本、高集成度的智能語音風扇控制系統,以解決傳統風扇控制的智能化不足問題。

1.2設計意義:

本設計通過整合多種監測與語音調控技術,具有多重實用價值。從使用體驗看,提供遠程、按鍵、APP、語音指令等多元控制方式,滿足不同場景下的吹風需求,尤其使用場景適配與自動調節功能提升了使用便捷性。

從節能角度,借助環境監測與用戶使用習慣實現按需調速,避免無效能耗,符合綠色家居理念。從技術層面,探索了 STM32 微控制器與語音識別模塊協同工作的實現方式,為低成本智能風扇系統開發提供了可參考的集成方案,推動智能風扇技術的普及應用,具有較好的實踐與推廣價值。

二、實物展示

下方為實物演示視頻

【開源】基于STM32單片機智能語音風扇系統

下方為實物展示圖片

三、硬件功能介紹

2.1 硬件清單:

  • STM32F103C8T6最小系統
  • OLED顯示
  • DS18B20溫度傳感器
  • HC-SR501人體紅外傳感器
  • TB6612電機驅動模塊
  • JDY-31-SPP藍牙模塊
  • 語音模塊
  • 聲光報警

2.2 功能介紹:

(1)STM32F103C8T6單片機作為主控單元
(2)溫度采集:DS18B20傳感器采集環境溫度
(3)人體檢測:人體紅外傳感器判斷是否有人
(4)屏幕顯示:OLED顯示溫度、有無人、檔位、模式等信息
(5)風扇搖頭:步進電機模擬風扇搖頭
(6)手動模式:按鍵調節風扇風速
(7)自動模式:判斷是否有人以及根據溫度控制風扇開關和風速
(8)語音模式:通過語音控制風速、模式以及搖頭
(9)定時功能:定時關閉
(10)APP控制:通過藍牙遠程查看數據以及下發控制

四、軟件設計流程圖

五、硬件PCB展示

六、軟件主函序展示

#include "sys.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "math.h"
#include "delay.h"
#include "gpio.h"
#include "key.h"
#include "oled.h"
#include "usart.h"
#include "ds18b20.h"
#include "motor_bujin.h"
#include "timer.h"
#include "motor_dianji.h"/**********************************
變量定義
**********************************/
uint8_t key_num = 0;									//按鍵掃描標志位	
uint8_t flag_display = 0;							//顯示界面標志位
uint32_t time_num = 0;								//10ms計時
char display_buf[32];									//顯示數組_Bool flag_mode = 0;									//模式標志位(自動|手動)
_Bool flag_direction = 0;							//搖頭標志位
int flag_dir	= 0;short temp_value = 0;                 //溫度值
u16 temp_max = 30;                    //溫度最大值
u16 temp_min = 20;										//溫度最低值s16 motor_pwm = 0;										//電機速度int countdown_hour = 0;								//倒計時時
int countdown_minute = 0;							//倒計時分
int countdown_second = 0;							//倒計時秒
_Bool flag_countdown_begin = 0;				//倒計時開始標志位
_Bool flag_countdown_end = 0;					//倒計時結束標志位
extern _Bool flag_1s;									//1秒到達標志位extern _Bool flag_bujin_foreward;			//步進電機打開標志位
extern _Bool flag_bujin_reversal;			//步進電機關閉標志位
extern _Bool flag_bujin_state;				//步進電機狀態標志位extern uint8_t usart1_buf[256];				//串口1接收數組
extern uint8_t usart2_buf[256];				//串口2接收數組
unsigned char   SendString[50];
uint8_t danwei = 0,send_renflag=0,send_modeflag=0,send_YTflag=0;
/**********************************
函數聲明
**********************************/
void Key_function(void);							//按鍵函數
void Monitor_function(void);					//監測函數
void Display_function(void);					//顯示函數
void Manage_function(void);						//處理函數/****
*******	主函數 
*****/
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	//配置中斷分組為2號
Delay_Init();	    	 								//延時初始化	  
Gpio_Init();		  									//IO初始化
Key_Init();		  										//按鍵初始化
Oled_Init();		  									//OLED初始化
Oled_Clear_All();										//清屏
while(DS18B20_Init());              //DS18B20初始化
Usart1_Init(9600);  								//串口1初始化
Usart2_Init(9600);  								//串口2初始化
Step_Motor_Init();									//步進電機初始化
TIM2_Init(1000-1,7200-1);						//初始化0.1s的定時器
Motor_Dianji_Init();								//直流電機初始化
TIM_SetCompare1(MOTOR_DIANJI_TIM,motor_pwm);Delay_ms(1000);
Delay_ms(1000);while(1){
Key_function();										//按鍵函數
Monitor_function();								//監測函數
Display_function();								//顯示函數
Manage_function();								//處理函數time_num++;												//計時變量+1
Delay_ms(10);
if(time_num %5 == 0)							//最小系統LED閃爍LED_SYS = ~LED_SYS;
if(time_num >= 5000){time_num = 0;}}
}/****
*******按鍵函數
*****/
void Key_function(void)
{key_num = Chiclet_Keyboard_Scan(0);					//按鍵掃描
if(key_num != 0)														//有按鍵按下{
switch(key_num){
case 1:																	//按鍵1:切換界面flag_display++;
if(flag_display >= 6)flag_display = 0;Oled_Clear_All();
break;case 2:																	//按鍵2:加鍵
switch(flag_display){
case 0:															//界面0:風速切換
if(flag_mode==1){
//flag_mode = 1;motor_pwm+=300;
if(motor_pwm <= 900){
TIM_SetCompare1(MOTOR_DIANJI_TIM,855+motor_pwm/20);  }
else{motor_pwm = 0;
TIM_SetCompare1(MOTOR_DIANJI_TIM,motor_pwm);}}
break;case 1:															//界面1:溫度最大值+1
if(temp_max < 99)temp_max++;
break;case 2:															//界面2:溫度最小值+1
if(temp_min < temp_max-1)temp_min++;
break;case 3:															//界面3:倒計時時+1
if(countdown_hour < 100)countdown_hour++;
break;case 4:															//界面4:倒計時分+1countdown_minute++;
if(countdown_minute >= 60)countdown_minute = 0;
break;case 5:															//界面5:倒計時秒+1countdown_second++;
if(countdown_second >= 60)countdown_second = 0;
break;default:
break;}
break;case 3:																	//按鍵3:減鍵
switch(flag_display){
case 0:															//界面0:搖頭模式切換
if(flag_direction == 0)flag_direction = 1;
elseflag_direction = 0;
break;case 1:															//界面1:溫度最大值-1
if(temp_max > temp_min+1)temp_max--;
break;case 2:															//界面2:溫度最小值-1
if(temp_min > 0)temp_min--;
break;case 3:															//界面3:倒計時時-1
if(countdown_hour > 0)countdown_hour--;
break;case 4:															//界面4:倒計時分-1countdown_minute--;
if(countdown_minute < 0)countdown_minute = 59;
break;case 5:															//界面5:倒計時秒-1countdown_second--;
if(countdown_second < 0)countdown_second = 59;
break;default:
break;}
break;case 4:																//按鍵4:切換模式
if(flag_display == 0){
if(flag_mode == 0){flag_mode = 1;}
else{flag_mode = 0;}}
break;default:
break;}}
}/****
*******監測函數
*****/
void Monitor_function(void)
{
if(flag_display == 0)																			//測量界面{
if(time_num % 10 == 0)																	//約2s檢測一次{temp_value = DS18B20_Get_Temp();                      //獲取溫度值}if(USART2_WaitRecive() == 0)					//接收語音指令{
if(usart2_buf[0] == 0x01)						//0x01:切換手動模式{flag_mode = 1;}
else if(usart2_buf[0] == 0x02)			//0x02:切換自動模式{flag_mode = 0;}
else if(usart2_buf[0] == 0x03)			//0x03:關搖頭{flag_direction = 0;}
else if(usart2_buf[0] == 0x04)			//0x04:開搖頭{flag_direction = 1;}
else if(usart2_buf[0] == 0x05)			//0x05:減風速{flag_mode = 1;motor_pwm-=300;
if(motor_pwm > 0){
TIM_SetCompare1(MOTOR_DIANJI_TIM,855+motor_pwm/20);}
else{motor_pwm = 0;
TIM_SetCompare1(MOTOR_DIANJI_TIM,motor_pwm);}}
else if(usart2_buf[0] == 0x06)			//0x06:加風速{flag_mode = 1;motor_pwm+=300;
if(motor_pwm <= 900){
TIM_SetCompare1(MOTOR_DIANJI_TIM,855+motor_pwm/20);}
else{motor_pwm = 900;
TIM_SetCompare1(MOTOR_DIANJI_TIM,motor_pwm);}}
USART2_Clear();}}
}/****
*******顯示函數
*****/
void Display_function(void)
{
switch(flag_display)																		//根據不同的顯示模式標志位,顯示不同的界面{
case 0:																								//界面0:測量界面,顯示溫度、人體、檔位、搖頭、倒計時時間
Oled_ShowCHinese(1, 0, "溫度:");
sprintf(display_buf,"%d.%dC ",temp_value/10,temp_value%10);
Oled_ShowString(1, 6, display_buf);Oled_ShowCHinese(2, 0, "人體:");
if(HUMAN == 1)
Oled_ShowCHinese(2, 3, "有人");
else
Oled_ShowCHinese(2, 3, "沒有");if(motor_pwm == 0)
Oled_ShowCHinese(3, 0, "關閉");
else if(motor_pwm == 300)
Oled_ShowCHinese(3, 0, "一檔");
else if(motor_pwm == 600)
Oled_ShowCHinese(3, 0, "二檔");
else if(motor_pwm == 900)
Oled_ShowCHinese(3, 0, "三檔");if(flag_direction == 1)
Oled_ShowCHinese(3, 5, "搖頭開");
else
Oled_ShowCHinese(3, 5, "搖頭關");sprintf(display_buf,"%02d:%02d:%02d",countdown_hour,countdown_minute,countdown_second);
Oled_ShowString(4,0,display_buf);if(flag_mode == 0)
Oled_ShowCHinese(4, 5, "自動");
else
Oled_ShowCHinese(4, 5, "手動");
break;case 1:																								//界面1:顯示設置溫度最大值
Oled_ShowCHinese(1,0,"設置溫度最大值");
if(time_num % 5 == 0){
sprintf(display_buf,"%d ",temp_max);
Oled_ShowString(2, 6, display_buf);}
if(time_num % 10 == 0){
Oled_ShowString(2, 6, "    ");}
break;case 2:																								//界面2:顯示設置溫度最小值
Oled_ShowCHinese(1,0,"設置溫度最小值");
if(time_num % 5 == 0){
sprintf(display_buf,"%d ",temp_min);
Oled_ShowString(2, 6, display_buf);}
if(time_num % 10 == 0){
Oled_ShowString(2, 6, "    ");}
break;case 3:																								//界面3:顯示設置倒計時時
Oled_ShowCHinese(1,1,"設置倒計時時");
if(time_num % 5 == 0){
sprintf(display_buf,"%02d:%02d:%02d",countdown_hour,countdown_minute,countdown_second);
Oled_ShowString(2,4,display_buf);}
if(time_num % 10 == 0){
Oled_ShowString(2,4,"  ");}
break;case 4:																								//界面4:顯示設置倒計時分
Oled_ShowCHinese(1,1,"設置倒計時分");
if(time_num % 5 == 0){
sprintf(display_buf,"%02d:%02d:%02d",countdown_hour,countdown_minute,countdown_second);
Oled_ShowString(2,4,display_buf);}
if(time_num % 10 == 0){
Oled_ShowString(2,7,"  ");}
break;case 5:																								//界面5:顯示設置倒計時秒
Oled_ShowCHinese(1,1,"設置倒計時秒");
if(time_num % 5 == 0){
sprintf(display_buf,"%02d:%02d:%02d",countdown_hour,countdown_minute,countdown_second);
Oled_ShowString(2,4,display_buf);}
if(time_num % 10 == 0){
Oled_ShowString(2,10,"  ");}
break;default:
break;}
}/****
*******處理函數
*****/
void Manage_function(void)
{
if(flag_display == 0)																			//測量界面{
if(flag_mode == 0)											//自動模式下,(有人時,溫度大于最大值三檔、大于中值二檔、大于最小值一檔,否則關閉){
if((temp_value > temp_max*10) && HUMAN == 1){motor_pwm = 900;
TIM_SetCompare1(MOTOR_DIANJI_TIM,855+motor_pwm/20);}
else if((temp_value > ((temp_max+temp_min)/2)*10) && HUMAN == 1){motor_pwm = 600;
TIM_SetCompare1(MOTOR_DIANJI_TIM,855+motor_pwm/20);}
else if((temp_value > temp_min*10) && HUMAN == 1){motor_pwm = 300;
TIM_SetCompare1(MOTOR_DIANJI_TIM,855+motor_pwm/20);}
else{motor_pwm = 0;
TIM_SetCompare1(MOTOR_DIANJI_TIM,motor_pwm);}}if(countdown_hour != 0 || countdown_minute != 0 || countdown_second != 0)			//通風倒計時不為0flag_countdown_begin = 1;																										//開始倒計時,進入定時器中斷if(flag_1s == 1)																															//1s到達{flag_1s = 0;if(countdown_second > 0)																										//倒計時秒>0countdown_second--;																												//倒計時秒-1else//倒計時秒=0{if(countdown_minute > 0)																									//如果倒計時分>0{countdown_minute--;																											//倒計時分-1countdown_second = 59;																									//倒計時秒=59}else//如果倒計時分=0{if(countdown_hour > 0)																									//如果倒計時時>0{countdown_hour--;																											//倒計時時-1countdown_minute = 59;																								//倒計時分=59countdown_second = 59;																								//倒計時秒=59}else//如果倒計時時=0,倒計時結束{flag_countdown_begin = 0;flag_countdown_end = 1;}}}}if(flag_countdown_end == 1)																										//倒計時結束,關閉風扇進入手動模式{flag_countdown_end = 0;motor_pwm = 0;TIM_SetCompare1(MOTOR_DIANJI_TIM,motor_pwm);Beep=1;
Delay_ms(1000);Beep=0;flag_mode = 1;}
if(motor_pwm == 0)flag_direction = 0;
if(flag_direction == 1)																	//如果在搖頭模式,步進電機搖頭{
if(flag_bujin_state == 0){flag_bujin_foreward = 1;flag_bujin_reversal = 0;}
else{flag_bujin_foreward = 0;flag_bujin_reversal = 1;}}
else{flag_bujin_foreward = 0;flag_bujin_reversal = 0;}}
else//設置界面,關閉風扇{flag_countdown_begin = 0;flag_direction = 0;flag_bujin_foreward = 0;flag_bujin_reversal = 0;motor_pwm = 0;
TIM_SetCompare1(MOTOR_DIANJI_TIM,motor_pwm);}
}

七、單片機實物資料

資料獲取?查看主頁介紹:兆龍電子單片機設計

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/923625.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/923625.shtml
英文地址,請注明出處:http://en.pswp.cn/news/923625.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

git clone vllm

這個錯誤不是 vLLM 本身的問題&#xff0c;而是 pip 在 clone GitHub 倉庫時失敗了&#xff1a; error: RPC failed; curl 16 Error in the HTTP2 framing layer fatal: expected flush after ref listing根因通常是&#xff1a; 網絡問題&#xff08;訪問 GitHub 被中斷 / 代理…

光譜相機的新興領域應用

光譜相機在?新興領域?的應用正快速拓展&#xff0c;結合?AI、納米技術、量子傳感?等前沿科技&#xff0c;突破傳統檢測極限。以下是六大最具潛力的新興應用方向及技術突破點&#xff1a;?1. 元宇宙與數字孿生??應用場景?&#xff1a;?虛擬材質建模?&#xff1a;通過高…

深入理解數據結構之復雜度

文章目錄1.數據結構前言1.1 數據結構1.2 算法2.算法效率2.1 復雜度的概念2.2 復雜度的重要性3.1 大O的漸進表式法3.2 時間復雜度計算示例3.2.1 示例13.2.2 示例23.2.3 示例33.2.4 示例43.2.5 示例53.2.6 示例63.2.7 示例74.空間復雜度4.1 空間復雜度計算示例4.1.1 示例14.1.2 示…

【Vue3】10-編寫vue項目時,ref的應用(2)

合集篇&#xff1a; 1.【Vue3】創建并運行一個簡易的Vue3項目 2.【Vue3】編寫vue實現一個簡單效果&#xff0c;并使用setup糖簡化代碼 目錄refref 定義對象類型的響應式數據1. 概念理解a. 概念b. 分析2. 代碼實操代碼場景步驟一&#xff1a;導入ref步驟二&#xff1a;修改數據形…

clickhouse 中SUM(CASE WHEN ...) 返回什么類型?

文章目錄clickhouse 中SUM(CASE WHEN ...) 返回什么類型&#xff1f;CASE WHENSUM(CASE WHEN ...) 返回什么類型&#xff1f;clickhouse 中SUM(CASE WHEN …) 返回什么類型&#xff1f; CASE WHEN ClickHouse中的CASE WHEN用法與SQL標準中的用法基本相同&#xff0c;用于實現…

【算法】C語言多組輸入輸出模板

在 C語言 里&#xff0c;“多組輸入輸出”是很多在線評測系統&#xff08;OJ&#xff09;常見的模式&#xff0c;通常有兩種情況&#xff1a;1. 輸入到文件結束&#xff08;EOF&#xff09;比如題目沒有告訴有多少組數據&#xff0c;就需要一直讀直到輸入結束。#include <st…

【Ubuntu】sudo apt update出現E :倉庫***沒有Release文件

【Ubuntu】sudo apt update出現E &#xff1a;倉庫***沒有Release文件 1 問題描述 在執行sudo apt update更新一下軟件包時出現了如下報錯 E: 倉庫***沒有Release 文件。 N: 無法安全地用該源進行更新&#xff0c;所以默認禁用該源。 N:參見apt-secure&#xff08;8&#xf…

全球后量子遷移進展:區域特色與產業落地差異

一、量子威脅具象化&#xff1a;從技術風險到產業沖擊量子計算對傳統密碼體系的威脅已從理論走向現實&#xff0c;其破壞性不僅體現在算法破解效率的飛躍&#xff0c;更滲透到數據全生命周期的安全防護中。以金融領域為例&#xff0c;2024 年國際安全機構模擬實驗顯示&#xff…

貪心算法應用:決策樹(ID3/C4.5)詳解

Java中的貪心算法應用&#xff1a;決策樹&#xff08;ID3/C4.5&#xff09;詳解 決策樹是一種常用的機器學習算法&#xff0c;它通過遞歸地將數據集分割成更小的子集來構建樹形結構。ID3和C4.5是兩種經典的決策樹算法&#xff0c;它們都使用了貪心算法來選擇最優的特征進行分割…

華為任旭東:開源協作,激發創新,共創智能世界 | GOSIM HANGZHOU 2025

GOSIM HANGZHOU 2025峰會盛大開幕&#xff0c;華為首席開源聯絡官、CNCF基金會董事任旭東以《開源協作&#xff0c;激發創新&#xff0c;共創智能世界》為題發表Keynote演講。顛覆性技術到工業應用的轉換時間越來越短&#xff0c;AI技術正在推動傳統軟件產業的演進&#xff0c;…

本地部署 GPS 跟蹤系統 Traccar 并實現外部訪問

Traccar 是一款集成了強大的 java 后端服務的 GPS 跟蹤系統 。它支持在多種設備使用&#xff0c;在物流運輸、資產管理和個人安全等領域應用。本文將詳細的介紹如何利用 Docker 在本地部署 Traccar 并結合路由俠實現外網訪問本地部署的 Traccar 。 第一步&#xff0c;本地部署…

【開題答辯全過程】以 “川趣玩”旅行團預定微信小程序為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

Android Doze低電耗休眠模式 與 WorkManager

1. Doze模式下&#xff0c;WorkManager setInitialDelay設置小于15分鐘&#xff0c;被系統強制到15分鐘執行&#xff0c;怎么辦 ? Android 擁有兩項省電功能&#xff0c;通過管理設備未連接電源時應用的行為來延長用戶電池續航時間&#xff1a;低電耗模式 (Doze) 和應用待機模…

iOS 能耗監控與電池優化實戰:如何查看App耗電量、分析CPU、GPU內存使用、(uni-app iOS開發性能調試指南)

在 iOS 應用開發中&#xff0c;能耗與電池消耗是用戶最直觀的體驗指標。 即便功能完善&#xff0c;如果 App 存在以下問題&#xff1a; 電池掉電快、設備發熱嚴重&#xff1b;后臺任務執行過多&#xff1b;頁面渲染與文件操作引發 CPU/GPU 過載&#xff1b;日志或緩存導致頻繁 …

Git 本地分支推送多個遠程分支

方法一&#xff1a;一次性推送命令 命令格式&#xff1a; git push <遠程倉庫名> <本地分支引用>:<遠程分支名1> <本地分支引用>:<遠程分支名2> ...具體步驟&#xff1a; 確保你的代碼修改已經提交到了本地分支 git add . git commit -m "你…

抖音私信評論互動消息通知監聽自動獲取,通過qq機器人轉發到qq來通知

抖音私信評論互動消息通知監聽自動獲取&#xff0c;通過qq機器人轉發到qq來通知 如果不是抖音平臺&#xff0c;其他平臺也類似的&#xff0c;也可以實現&#xff0c;只是目前懶得寫了 本期視頻點贊過10個就開源代碼 有需要的人可以在視頻底下留言 需求反饋多的我可以實現

UVM驗證工具--gvim

目錄 gvim語法高亮 gvim支持git Linux環境自帶gvim工具&#xff0c;我們需要做如下設置&#xff1a; 支持UVM、SystemVerilog、verilog語法高亮支持git&#xff08;實時顯示對文件的修改&#xff09; gvim語法高亮 gvim支持git

MyBatis 從入門到精通(第二篇)—— 核心架構、配置解析與 Mapper 代理開發

在第一篇博客中&#xff0c;我們掌握了 MyBatis 的基礎概念與環境搭建&#xff0c;成功通過簡單查詢實現了數據持久化。但要真正用好 MyBatis&#xff0c;還需深入理解其 “內部工作原理” 與 “企業級開發規范”。本篇將聚焦三大核心&#xff1a;MyBatis 架構與核心類、全局配…

uniapp+<script setup lang=“ts“>單個時間格式轉換(format)

有問題的時間&#xff08;只示例&#xff0c;不是真實數據&#xff09;修改后的時間展示&#xff08;只示例&#xff0c;不是真實數據&#xff09;原代碼<view v-else-if"item?.payTime" class"order-info-item">支付時間&#xff1a;item?.payTim…

運維安全05,iptables規則保存與恢復

一&#xff1a;網絡安全1.1、昨日功能優化配置后引發的問題&#xff1a;配置iptables后防火墻起到了防護作用&#xff0c;但使用127.0.0.1訪問不了數據庫了[rootlocalhost /]# mysql -u admin -p -h 127.0.0.1 Enter password:思考&#xff1a;如果使用localhost可以訪問嗎&…