基于STM32的環境監測系統(自制藍牙APP)

目錄

項目概述

實物圖

演示視頻

概述

硬件模塊

原理圖以及PCB

?0.96寸OLED屏幕(SSD1306)

CubeMX配置

初始化代碼

MQ-2煙霧傳感器

CubeMX配置

初始化代碼

DHT11溫濕度模塊

驅動代碼

HC-05藍牙模塊

CubeMX配置

?編輯

空閑中斷回調函數

有源蜂鳴器和TB6612電機驅動模塊

CubeMX配置

核心代碼

使用AI2Offline制作藍牙APP

UI界面設計

邏輯界面設計


項目概述

實物圖

演示視頻

概述

? ? ? ? 主控為stm32f103c8t6。使用DHT11溫濕度傳感器和MQ-2煙霧傳感器,讀取并實時刷新在0.96寸OLED屏幕上,同時通過藍牙模塊HC-05使用串口通信將數據上傳到上位機(自制藍牙APP)。可手動控制蜂鳴器以及電機作為報警器和風扇;在自動預警模式下,監測到溫度高出設定的閾值后打開風扇降溫;當監測到煙霧濃度高出設定閾值后將關閉風扇防止火情蔓延,并開啟蜂鳴器報警,上位機同步更新報警狀態。


硬件模塊

stm32f103c8t6最小系統板0.96寸OLED屏幕
MQ-2煙霧傳感器(5V)DHT11溫濕度傳感器
有源蜂鳴器HC-05藍牙模塊(5V)

TB6612電機驅動模塊(5V)

直流電機(5V)
面包板

排母若干


原理圖以及PCB

原理圖:

PCB:


?0.96寸OLED屏幕(SSD1306)

? ? ? ? 見我上傳的資源:OLED驅動代碼,設置成免費下載了。

CubeMX配置

? ? ? ? 勾選I2C1,設置為快速模式即可。

初始化代碼

//oled初始化
HAL_Delay(20);
//屏幕啟動比stm32要慢,上電延時20ms
OLED_Init();

MQ-2煙霧傳感器

? ? ? ? 使用ADC的連續轉換模式,可參考這篇博客:HAL庫教程。

CubeMX配置

? ? ? ? 記得配置Continuous Conversion ModeEnabled,這樣就開啟了ADC的連續轉換模式。

初始化代碼

//煙霧傳感器初始化
HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);

DHT11溫濕度模塊

? ? ? ? 由于該模塊是單數據線,需要在代碼里不斷改變引腳狀態,因此不需要在CubeMX里配置,我這里用的是PA2引腳。

驅動代碼

dht11.c:

#include "dht11.h"uint8_t datas[5];//空氣溫濕度數據void delay_us(uint16_t cnt)
{uint8_t i;while(cnt){for (i = 0; i < 10; i++){}	cnt--;}
}void DHT_GPIO_Init(uint32_t Mode)
{GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_2;GPIO_InitStruct.Mode = Mode;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}void DHT11_Start(void)
{DHT_GPIO_Init(GPIO_MODE_OUTPUT_PP);DHT_HIGHT;DHT_LOW;HAL_Delay(30);DHT_HIGHT;DHT_GPIO_Init(GPIO_MODE_INPUT);while(DHT_VALUE);while(!DHT_VALUE);while(DHT_VALUE);
}void Read_Data_From_DHT(void)
{int i;//輪int j;//每一輪讀多少次char tmp;char flag;DHT11_Start();DHT_GPIO_Init(GPIO_MODE_INPUT);for(i= 0;i < 5;i++){for(j=0;j<8;j++){while(!DHT_VALUE);//等待卡g點delay_us(40);if(DHT_VALUE == 1){flag = 1;while(DHT_VALUE);}else{flag = 0;}tmp = tmp << 1;tmp |= flag;}datas[i] = tmp;}
}

dht11.h:

#ifndef __DHT11_H__
#define __DHT11_H__#include "main.h"#define DHT_HIGHT HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET)
#define DHT_LOW HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET)
#define DHT_VALUE HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2)extern uint8_t datas[5];void Read_Data_From_DHT(void);#endif

? ? ? ? 后續直接調用Read_Data_From_DHT函數讀取數據就好了,數據會存放在datas數組里:datas[0]是濕度的整數數據、datas[1]是濕度的小數數據、datas[2]是溫度的整數數據、datas[3]是溫度的小數數據、datas[5]是校驗數據。


HC-05藍牙模塊

? ? ? ? 使用串口收發數據,借助藍牙APP,可以把這個模塊當作平常用的CH340模塊來用。

CubeMX配置

? ? ? ? 使用串口1收發數據,波特率為115200,由于我們需要接收不定長數據,因此還要用到串口空閑中斷,不妨使用DMA模式下的空閑中斷:

? ? ? ? 點開DMA設置,為接收和發送都創建DMA通道(默認即可),并確保打開了串口中斷:

空閑中斷回調函數

//串口接收buffer
#define RX_BUF_SIZE 50
uint8_t receiveData[RX_BUF_SIZE] = "";void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{//每次進入回調函數之前判斷是哪個串口觸發的中斷if(huart == &huart1){	HAL_UARTEx_ReceiveToIdle_DMA(&huart1, (uint8_t *)receiveData, sizeof(receiveData));__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);}
}

有源蜂鳴器和TB6612電機驅動模塊

? ? ? ? 全部設置為推挽輸出即可,不需要對電機進行調速。

CubeMX配置

? ? ? ? PA3為蜂鳴器引腳,PA4~6分別為TB6612的PWMA、AIN2、AIN1。電機驅動模塊主要操作的是AIN2和AIN1引腳,要讓電機旋轉只需要隨便拉低一個引腳即可,蜂鳴器也是低電平觸發。


核心代碼

/* 頭文件包含 */
#include "main.h"        // HAL庫主頭文件
#include "adc.h"         // ADC驅動
#include "dma.h"         // DMA驅動
#include "i2c.h"         // I2C驅動(用于OLED)
#include "usart.h"       // 串口驅動
#include "gpio.h"        // GPIO驅動
#include "dht11.h"       // DHT11溫濕度傳感器驅動
#include "oled.h"        // OLED顯示驅動
#include <stdio.h>       // 標準輸入輸出(用于printf)
#include <string.h>      // 字符串操作/* 系統狀態宏定義 */
#define OFF 0            // 關閉狀態
#define ON  1            // 開啟狀態/* 蜂鳴器控制宏 */
#define BUZZER_ON HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET)  // PA3低電平觸發蜂鳴器
#define BUZZER_OFF HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET)   // PA3高電平關閉蜂鳴器/* 全局變量聲明 */
float smoke = 0.0;       // 煙霧濃度值(百分比)#define RX_BUF_SIZE 50   // 串口接收緩沖區大小
uint8_t receiveData[RX_BUF_SIZE] = ""; // 串口接收緩沖區// 設備狀態標志
uint8_t Buzzer_State = OFF;    // 蜂鳴器狀態
uint8_t Fan_State = OFF;       // 風扇狀態
uint8_t Auto_Alarm_State = OFF;// 自動報警模式狀態// 狀態顯示字符串(OLED用)
char State_String[2][5] = {"OFF", "ON"}; /* 自定義printf輸出重定向 */
int fputc(int ch, FILE *f)
{      HAL_UART_Transmit(&huart1, (const uint8_t *)&ch, 1, HAL_MAX_DELAY);  return ch;
}/* 串口接收完成回調函數 */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{char buffer[50] = "";memcpy(buffer, receiveData, sizeof(receiveData)); // 復制接收數據到臨時緩沖區if(huart == &huart1){    buffer[Size] = '\0'; // 添加字符串終止符/* 自動報警模式控制 */if(strcmp(buffer, "Auto_On\r\n") == 0) {Auto_Alarm_State = ON;HAL_UART_Transmit_DMA(&huart1, (uint8_t *)buffer, Size);}else if(strcmp(buffer, "Auto_Off\r\n") == 0) {// 關閉所有輸出設備HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 風扇IN1HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET); // 風扇IN2BUZZER_OFF;// 更新狀態標志Buzzer_State = OFF;Fan_State = OFF;Auto_Alarm_State = OFF;        // 返回確認信息printf("Buzzer_Off\r\nFan_Off\r\nAuto_Off\r\n");}/* 手動控制模式處理 */if(Auto_Alarm_State == OFF) {// 風扇控制if(strcmp(buffer, "Fan_On\r\n") == 0) {HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // IN1=0HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);   // IN2=1(正轉)Fan_State = ON;HAL_UART_Transmit_DMA(&huart1, (uint8_t *)buffer, Size);}else if(strcmp(buffer, "Fan_Off\r\n") == 0) {HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);   // IN1=1HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);   // IN2=1(剎車)Fan_State = OFF;HAL_UART_Transmit_DMA(&huart1, (uint8_t *)buffer, Size);}// 蜂鳴器控制else if(strcmp(buffer, "Buzzer_On\r\n") == 0) {BUZZER_ON;Buzzer_State = ON;HAL_UART_Transmit_DMA(&huart1, (uint8_t *)buffer, Size);}else if(strcmp(buffer, "Buzzer_Off\r\n") == 0) {BUZZER_OFF;Buzzer_State = OFF;HAL_UART_Transmit_DMA(&huart1, (uint8_t *)buffer, Size);}}// 重新啟動DMA接收HAL_UARTEx_ReceiveToIdle_DMA(&huart1, receiveData, sizeof(receiveData));__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT); // 禁用傳輸過半中斷}
}/* 自動報警處理函數 */
void Auto_Alarm(void)
{/* 煙霧濃度報警(閾值60%) */if(smoke > 60) {BUZZER_ON;if(Buzzer_State == OFF) { // 狀態變更時上報Buzzer_State = ON;printf("Buzzer_On\r\n");}} else {BUZZER_OFF;if(Buzzer_State == ON) {Buzzer_State = OFF;printf("Buzzer_Off\r\n");}}/* 溫度控制邏輯(閾值30℃) */if(datas[2] >= 30 && smoke < 60) { // 溫度高且無煙霧危險時開啟風扇HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 正轉HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);if(Fan_State == OFF) {printf("Fan_On\r\n");Fan_State = ON;}} else { // 關閉風扇HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);        if(Fan_State == ON) {printf("Fan_Off\r\n");Fan_State = OFF;}}
}/* 主函數 */
int main(void)
{// 硬件初始化HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_DMA_Init();MX_USART1_UART_Init();MX_I2C1_Init();MX_ADC1_Init();/* 外設初始化 */HAL_Delay(20); // 等待硬件穩定OLED_Init();   // OLED顯示屏初始化// ADC校準和啟動HAL_ADCEx_Calibration_Start(&hadc1);HAL_ADC_Start(&hadc1);HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);// 啟動串口DMA接收HAL_UARTEx_ReceiveToIdle_DMA(&huart1, receiveData, sizeof(receiveData));__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);/* 主循環 */while (1){OLED_NewFrame(); // 準備新顯示幀// 傳感器數據讀取Read_Data_From_DHT(); // 獲取溫濕度數據smoke = (HAL_ADC_GetValue(&hadc1) / 4095.0) * 100.0; // 計算煙霧濃度// 自動報警模式處理if(Auto_Alarm_State == ON) {Auto_Alarm();}/* OLED顯示內容格式化 */char Tem_mes[10], Hum_mes[10], Smo_mes[10], Sta_mes[20], BlueTooth_mes[30];sprintf(Tem_mes, "Tem:%d.%d", datas[2], datas[3]);    // 溫度顯示sprintf(Hum_mes, "Hum:%d.%d%%", datas[0], datas[1]);  // 濕度顯示sprintf(Smo_mes, "Smoke:%.1f%%", smoke);              // 煙霧濃度sprintf(Sta_mes, "A:%s B:%s F:%s",                   // 狀態顯示State_String[Auto_Alarm_State], State_String[Buzzer_State], State_String[Fan_State]);sprintf(BlueTooth_mes, "NULL;%d.%d;%d.%d;%.1f;NULL\r\n", // 藍牙數據格式datas[2], datas[3], datas[0], datas[1], smoke);/* OLED顯示更新 */OLED_PrintASCIIString(0, 0, Tem_mes, &afont16x8, OLED_COLOR_NORMAL);OLED_PrintString(65, 0, "℃", &font16x16, OLED_COLOR_NORMAL);OLED_PrintASCIIString(0, 17, Hum_mes, &afont16x8, OLED_COLOR_NORMAL);OLED_PrintASCIIString(0, 33, Smo_mes, &afont16x8, OLED_COLOR_NORMAL);OLED_PrintASCIIString(0, 49, Sta_mes, &afont12x6, OLED_COLOR_NORMAL);OLED_ShowFrame(); // 刷新顯示/* 藍牙數據傳輸 */HAL_UART_Transmit_DMA(&huart1, (uint8_t *)BlueTooth_mes, strlen(BlueTooth_mes));HAL_Delay(1000); // 主循環周期1秒}
}/* 注意事項:
1. GPIO分配:- PA3: 蜂鳴器控制- PA5/PA6: TB6612電機驅動控制引腳(IN1/IN2)- 確保實際硬件連接與代碼一致2. 傳感器數據格式:- datas數組來自DHT11驅動,索引:0: 濕度整數部分1: 濕度小數部分 2: 溫度整數部分3: 溫度小數部分3. 藍牙數據協議:"NULL;溫度;濕度;煙霧;NULL\r\n" 格式示例:"NULL;25.5;60.0;30.5;NULL\r\n"4. 改進建議:- 增加傳感器數據校驗- 添加看門狗防止死機- 使用RTOS進行任務管理- 添加EEPROM存儲報警閾值
*/

使用AI2Offline制作藍牙APP

UI界面設計

控件如下:

邏輯界面設計

藍牙連接邏輯:

按鍵發送邏輯:

接收數據邏輯:


需要實物或者完整源碼的可以私信我。

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

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

相關文章

linux離線安裝ollama并部署deepseek-r1模型 指南

這篇文章主要分為兩部分&#xff1a; (1)離線環境下如何部署Ollama&#xff1b; (2)在離線環境下如何配置大模型&#xff0c;其中這一步又分為&#xff1a; ?1)部署完整的deepseek大模型&#xff0c;如&#xff1a;deepseek-r1:32B; ?2)部署蒸餾版模型&#xff0c;如&#xf…

坐標變換介紹與機器人九點標定的原理

【備注】本文的C#代碼在下面鏈接中可以下載:Opencv的C#九點標定代碼資源-CSDN文庫 https://download.csdn.net/download/qq_34047402/90452336 一、坐標變換的介紹 1.繞原點旋轉的坐標變換 一個點(x,y)繞原點旋轉u度,其旋轉后的坐標(x1,y1)如何計算? 2.繞任意點的坐標變…

大語言模型 智能助手——既能生成自然語言回復,又能在必要時調用外部工具獲取實時數據

示例代碼&#xff1a; import json from langgraph.graph import Graph, END,StateGraph from langchain_core.utils.function_calling import convert_to_openai_function from langchain_community.tools.openweathermap import OpenWeatherMapQueryRun from langchain_core…

FPGA學習(一)——DE2-115開發板編程入級

FPGA學習&#xff08;一&#xff09;——DE2-115開發板編程入級 一、實驗目的 通過 1 位全加器的詳細設計&#xff0c;深入掌握原理圖輸入以及 Verilog 的兩種設計方法&#xff0c;熟悉 Quartus II 13.0 軟件的使用流程&#xff0c;以及在 Intel DE2-115 開發板上的硬件測試過…

中間件專欄之MySQL篇——MySQL事務原理、鎖機制分析

MySQL的事務性也是其重要特性之一。 什么是事務&#xff1a;事務的本質是并發控制的單元&#xff0c;是用戶定義的一個操作序列。這些操作要么都做&#xff0c;要么都不做&#xff0c;是 一個不可分割的工作單位。 目的&#xff1a;事務的目的在于將數據庫從一種一致性狀態轉…

機器學習的三個基本要素

機器學習的基本要素包括模型、學習準則&#xff08;策略&#xff09;和優化算法三個部分。機器學習方法之間的不同&#xff0c;主要來自其模型、學習準則&#xff08;策略&#xff09;、優化算法的不同。 模型 機器學習首要考慮的問題是學習什么樣的模型&#xff08;Model&am…

集成方案 | Docusign 能與哪些應用程序集成?

如何實現 Docusign 與多種系統平臺之間的高效集成&#xff1f; 在企業跨境簽約場景中&#xff0c;員工常常需要在電子簽系統與辦公應用&#xff08;如釘釘、企業微信&#xff09;、CRM、ERP 等系統之間來回切換&#xff0c;手動上傳合同、下載簽署文件并同步數據。這種繁瑣的操…

2025華為OD機試真題目錄【E卷+A卷+B卷+C卷+D卷】持續收錄中...

摘要 本專欄提供2025最新最全的華為OD機試真題庫&#xff08;EABCD卷&#xff09;&#xff0c;包括100分和200分題型。題目包含題目描述、輸入描述、用例、備注和解題思路、多種語言解法&#xff08;Java/JS/Py/C/C&#xff09;。希望小伙伴們認真學習、順利通過。 聲明 本專…

廣域互聯網關鍵技術詳解(GRE/LSTP/IPsec/NAT/SAC/SPR)

《廣域互聯網關鍵技術詳解》屬于博主的“廣域網”專欄&#xff0c;若想成為HCIE&#xff0c;對于廣域網相關的知識需要非常了解&#xff0c;更多關于廣域網的內容博主會更新在“廣域網”專欄里&#xff0c;請持續關注&#xff01; 一.前言 廣域互聯技術紛雜多樣&#xff0c;不…

AF3 _correct_post_merged_feats函數解讀

AlphaFold3 msa_pairing 模塊的 _correct_post_merged_feats 函數用于對合并后的特征進行修正,確保它們符合預期的格式和要求。這包括可能的對特征值進行調整或進一步的格式化,確保合并后的 FeatureDict 適合于后續模型的輸入。 主要作用是: 在多鏈蛋白質 MSA(多序列比對)…

Docker 學習(三)——數據管理

容器中的管理數據主要有兩種方式&#xff1a; 數據卷 &#xff08;Data Volumes&#xff09;&#xff1a; 容器內數據直接映射到本地主機環境&#xff1b; 數據 卷容器&#xff08; Data Volume Containers&#xff09;&#xff1a; 使用特定容器維護數據卷 1.數據卷 數據卷…

基于SSM+Vue+uniapp的考研交流(帶商城)小程序+LW示例參考

系列文章目錄 1.基于SSM的洗衣房管理系統原生微信小程序LW參考示例 2.基于SpringBoot的寵物攝影網站管理系統LW參考示例 3.基于SpringBootVue的企業人事管理系統LW參考示例 4.基于SSM的高校實驗室管理系統LW參考示例 5.基于SpringBoot的二手數碼回收系統原生微信小程序LW參考示…

2025-03-04 學習記錄--C/C++-PTA 練習5-3 字符金字塔

合抱之木&#xff0c;生于毫末&#xff1b;九層之臺&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、題目描述 ?? 二、解題步驟 ?? 第1步、把字符和一個空格看作整體&#xff0c;即"G_"&#xff1b; 第2步、外…

DeepSeek集成到VScode工具,讓編程更高效

DeepSeek與VScode的強強聯合&#xff0c;為編程效率樹立了新標桿。 DeepSeek&#xff0c;一款卓越的代碼搜索引擎&#xff0c;以其精準的索引和高速的檢索能力&#xff0c;助力開發者在浩瀚的代碼海洋中迅速定位關鍵信息。 集成至VScode后&#xff0c;開發者無需離開熟悉的編輯…

前端-css(預編譯器sass)

1.sass(scss->sass第三代) Sass3 -> Scss(Sassy CSS),SCSS(Sassy CSS) 是 CSS 語法的擴展. 2.scss注釋 Sass 支持標準的 CSS 多行注釋 /* */&#xff0c;以及單行注釋 //&#xff0c;前者會 被完整輸出到編譯后的 CSS 文件中&#xff0c;而后者則不會 3.scss定義變量 …

【計算機網絡入門】初學計算機網絡(十一)重要

目錄 1. CIDR無分類編址 1.1 CIDR的子網劃分 1.1.1 定長子網劃分 1.1.2 變長子網劃分 2. 路由聚合 2.1 最長前綴匹配原則 3. 網絡地址轉換NAT 3.1 端口號 3.2 IP地址不夠用&#xff1f; 3.3 公網IP和內網IP 3.4 NAT作用 4. ARP協議 4.1 如何利用IP地址找到MAC地址…

Android 獲取jks的SHA1值:java.io.IOException: Invalid keystore format

命令生成 keytool -list -v -keystore 全路徑.jks -alias 別名 -storepass 密碼 -keypass 密碼 1、遇到 的問題&#xff1a; 通過快捷鍵 ‘win r’ 啟動的小黑框運行上面的命令會出現下面這個錯誤keytool 錯誤: java.io.IOException: Invalid keystore format 2、解決問題 …

掌握 ElasticSearch 聚合查詢:Aggregations 入門與實戰

掌握 ElasticSearch 聚合查詢&#xff1a;Aggregations 入門與實戰 一、引言 (Introduction)二、數據準備 (Data Preparation)2.1 創建索引 (Create Index)2.2 批量導入數據 (Bulk Import Data) 三、聚合查詢基礎 (Aggregation Basics)3.1 什么是聚合查詢&#xff1f;(What are…

Microsoft.Office.Interop.Excel 的簡單操作

Microsoft.Office.Interop.Excel 的簡單操作 1、安裝 Microsoft.Office.Interop.Excel2、聲明引用 Microsoft.Office.Interop.Excel3、簡單的新建 EXCEL 操作代碼4、將 DataGridView 表數據寫到 EXCEL 操作代碼5、將 EXCEL 表數據讀取到 C# 數據表 DataTable 操作代碼 1、安裝 …

LLM 對話框組件 | 字節青訓營前端開發項目

系統介紹 LLM對話框項目系統介紹 一、項目概述 選題背景隨著人工智能技術的飛速發展,自然語言處理(NLP)領域取得了顯著進展,其中對話系統(Dialog System)作為NLP的重要應用方向,正逐漸滲透到人們的日常生活中。從智能客服到語音助手,從智能家居到在線教育,對話系統以…