✔零知IDE 是一个真正属于国人自己的开源软件平台,在开发效率上超越了Arduino平台并且更加容易上手,大大降低了开发难度。零知开源在软件方面提供了完整的学习教程和丰富示例代码,让不懂程序的工程师也能非常轻而易举的搭建电路来创作产品,测试产品。快来动手试试吧!

✔访问零知实验室,获取更多实战项目和教程资源吧!

www.lingzhilab.com

目录

一、硬件连接部分

1.1 硬件清单

1.2 接线方案

1.3 具体接线图

1.4 接线实物图

二、关键代码解析

2.1 主循环设计

2.2 红外信号处理

2.3 显示更新优化

2.4 风扇驱动控制

2.5 系统完整代码

三、项目结果演示

3.1 操作流程

3.2 界面展示

3.3 视频演示

四、JQC-3FF-S-Z工作原理

4.1 基本结构

4.2 动作机制

五、常见问题解答

Q1: 如何调整光控的灵敏度?

Q2: 如何修改定时时间?

Q3: 舵机转动不流畅怎么办?


(1)项目概述

        本项目基于STM32F103RBT6主控芯片(零知标准板),设计并实现了一个功能丰富的智能风扇控制系统。融合了红外遥控、自动光控、定时关闭、睡眠模式等多种智能控制方式。系统采用JQC-3FF-S-Z继电器作为主要控制元件,通过红外遥控器实现远程控制,同时集成了光敏传感器实现环境光线自适应控制。

(2)项目难点及解决方案

       问题描述:系统需要同时处理红外信号接收、舵机控制、传感器数据采集和显示更新等多个任务。

解决方案: 采用基于millis()的时间管理方法,避免使用delay(),确保系统响应及时

一、硬件连接部分

1.1 硬件清单

组件名称型号/规格数量备注
主控板零知标准板(STM32F103RBT6)1核心控制单元
继电器模块JQC-3FF-S-Z1控制风扇电源
TFT显示屏ST7789 240x2401用户界面显示
红外控制模块IR Receiver红外接收模块1接收红外信号
舵机SG901实现风扇摇头功能
光敏电阻光敏电阻模块1环境光线检测
直流电机3.3V1被控对象

1.2 接线方案

        注意:JQC-3FF-S-Z的D+接5V,其他器件电源接3.3V

组件零知标准板引脚说明
继电器IN6继电器控制引脚
红外接收DATA3红外信号输入
舵机信号5舵机控制
TFT_SCL13显示屏时钟线
TFT_SDA11显示屏数据输入
TFT_CS10显示屏片选
TFT_DC9显示屏数据/命令
TFT_RST8显示屏复位
光敏电阻OUT0光线传感器信号

1.3 具体接线图

        PS:直流电机的其中一极接3.3V电源,另一极接JQC-3FF-S-Z继电器的COM公共端

1.4 接线实物图

二、关键代码解析

2.1 主循环设计

void loop() {// 处理红外信号if (irrecv.decode(&results)) {handleIRCommand(results.value);irrecv.resume();redrawNeeded = true;}// 处理舵机摆动handleSwing();// 处理定时器handleTimer();// 处理睡眠模式handleSleepMode();// 读取光线传感器数据readLightSensor();// 自动模式处理if (operationMode == MODE_LIGHT_AUTO) {handleAutoMode();}// 更新显示updateDisplay();delay(100); // 短暂延迟以减少CPU使用率
}

        主循环采用非阻塞设计,通过状态标志控制各功能的执行,确保系统响应及时。

2.2 红外信号处理

void handleIRCommand(unsigned long value) {Serial.print("IR Code Received: 0x");Serial.println(value, HEX);switch(value) {case BTN_POWER:togglePower();break;// 其他按键处理...}
}

        红外信号处理函数通过switch-case结构解析不同按键的功能,代码结构清晰易懂。

2.3 显示更新优化

void updateDisplay() {// 只在需要时重绘if (!redrawNeeded) {// 对于定时器模式,每秒更新一次时间显示if (operationMode == MODE_TIMER && timerActive) {unsigned long currentTime = millis();if (currentTime - lastTimerUpdate >= 1000) {lastTimerUpdate = currentTime;updateTimerDisplay();}}// 省略其他模式...return;}// 全屏刷新逻辑...
}

        显示更新函数通过redrawNeeded标志控制刷新频率,避免不必要的屏幕刷新,提高系统效率。

2.4 风扇驱动控制

void turnOffFan() {digitalWrite(RELAY_PIN, HIGH);fanState = FAN_OFF;swingState = SWING_OFF; // 关闭风扇时也停止摆动timerActive = false; // 取消定时sleepActive = false; // 取消睡眠模式Serial.println("Fan Turned OFF");
}void turnOnFan() {digitalWrite(RELAY_PIN, LOW);fanState = FAN_ON;Serial.println("Fan Turned ON");
}void handleSwing() {if (swingState == SWING_OFF) return;unsigned long currentTime = millis();if (currentTime - lastSwingTime >= swingSpeed) {lastSwingTime = currentTime;// 摆动范围 20-160 度static int direction = 1; // 1为增加角度,-1为减少角度swingAngle += direction;myservo.write(swingAngle);// 到达边界时改变方向if (swingAngle >= 160 || swingAngle <= 20) {direction = -direction;}}
}

        JQC-3FF-S-Z继电器模块控制风扇电源并设置标志位

2.5 系统完整代码

#include "IRremote.h"
#include "Servo.h"
#include <Adafruit_GFX.h>
#include <Adafruit_ST7789.h>// 引脚定义
#define IR_RECV_PIN 3     // 红外接收 DAT 引脚
#define RELAY_PIN 6       // 继电器控制引脚
#define SERVO_PIN 5       // 舵机控制引脚
#define TFT_CS 10         // TFT显示屏片选引脚
#define TFT_DC 9          // TFT显示屏数据/命令引脚
#define TFT_RST 8         // TFT显示屏复位引脚
#define LIGHT_SENSOR A0   // 光敏电阻引脚// 红外按键编码
enum IR_CODES {BTN_POWER = 0xFF30CF,   // 按键1 - 电源开关BTN_SWING = 0xFF18E7,   // 按键2 - 摇头开关BTN_TIMER_10 = 0xFF7A85, // 按键3 - 10秒定时BTN_TIMER_30 = 0xFF10EF, // 按键4 - 30秒定时BTN_MODE = 0xFF38C7,    // 按键5 - 模式切换BTN_SLEEP = 0xFF4AB5    // 按键8 - 睡眠模式
};// 系统状态
enum FAN_STATE {FAN_OFF,FAN_ON
};enum SWING_STATE {SWING_OFF,SWING_ON
};enum OPERATION_MODE {MODE_NORMAL,MODE_LIGHT_AUTO,MODE_TIMER,MODE_SLEEP
};// 全局变量
IRreceiver irrecv(IR_RECV_PIN);
IRdecode_results results;
Servo myservo;
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);int fanState = FAN_OFF;
int swingState = SWING_OFF;
int operationMode = MODE_NORMAL;
int swingAngle = 90;     // 舵机角度
int swingSpeed = 15;     // 舵机速度 (ms延迟,值越小越快)
unsigned long lastSwingTime = 0;
unsigned long timerStartTime = 0;
unsigned long timerDuration = 0;
bool timerActive = false;
unsigned long sleepStartTime = 0;
unsigned long sleepDuration = 5 * 1000; // 8小时睡眠模式  8 * 60 * 60 * 1000
bool sleepActive = false;
int lightLevel = 0;
int lastLightLevel = 0;
unsigned long lastTimerUpdate = 0;
bool redrawNeeded = true;// 显示区域定义
#define STATUS_AREA 40
#define DATA_AREA 80
#define LIGHT_THRESHOLD 500 // 光线阈值void setup() {Serial.begin(9600);// 初始化引脚pinMode(RELAY_PIN, OUTPUT);digitalWrite(RELAY_PIN, HIGH);  // 初始关闭继电器// 初始化红外接收和舵机irrecv.enableIRIn();myservo.attach(SERVO_PIN);myservo.write(swingAngle);      // 初始位置// 初始化显示屏tft.init(240, 240);tft.setRotation(1);tft.fillScreen(ST77XX_BLACK);// 初始化光敏电阻pinMode(LIGHT_SENSOR, INPUT);// 显示准备界面showReadyScreen();Serial.println("\nSmart Fan Control System Started");
}void loop() {// 处理红外信号if (irrecv.decode(&results)) {handleIRCommand(results.value);irrecv.resume();redrawNeeded = true;}// 处理舵机摆动handleSwing();// 处理定时器handleTimer();// 处理睡眠模式handleSleepMode();// 读取光线传感器数据readLightSensor();// 自动模式处理if (operationMode == MODE_LIGHT_AUTO) {handleAutoMode();}// 更新显示updateDisplay();delay(100); // 短暂延迟以减少CPU使用率
}void showReadyScreen() {tft.fillScreen(ST77XX_BLACK);// 显示标题tft.setCursor(60, 80);tft.setTextColor(ST77XX_CYAN);tft.setTextSize(3);tft.println("READY");// 绘制进度条tft.drawRect(20, 120, 200, 20, ST77XX_WHITE);for (int i = 0; i <= 100; i += 5) {tft.fillRect(20, 120, i * 2, 20, ST77XX_BLUE);delay(50);}delay(1000);tft.fillScreen(ST77XX_BLACK);redrawNeeded = true;
}void handleIRCommand(unsigned long value) {Serial.print("IR Code Received: 0x");Serial.println(value, HEX);switch(value) {case BTN_POWER:togglePower();break;case BTN_SWING:toggleSwing();break;case BTN_TIMER_10:setTimer(10);break;case BTN_TIMER_30:setTimer(30);break;case BTN_MODE:switchMode();break;case BTN_SLEEP:toggleSleepMode();break;default:Serial.println("Unknown Command");break;}
}void togglePower() {if (fanState == FAN_OFF) {turnOnFan();} else {turnOffFan();}
}void turnOffFan() {digitalWrite(RELAY_PIN, HIGH);fanState = FAN_OFF;swingState = SWING_OFF; // 关闭风扇时也停止摆动timerActive = false; // 取消定时sleepActive = false; // 取消睡眠模式Serial.println("Fan Turned OFF");
}void turnOnFan() {digitalWrite(RELAY_PIN, LOW);fanState = FAN_ON;Serial.println("Fan Turned ON");
}void toggleSwing() {if (fanState == FAN_OFF) {Serial.println("Please Turn ON Fan First");return;}swingState = !swingState;Serial.print("Swing Function ");Serial.println(swingState ? "Enabled" : "Disabled");
}void setTimer(int seconds) {if (fanState == FAN_OFF) {Serial.println("Please Turn ON Fan First");return;}timerDuration = seconds * 1000; // 转换为毫秒timerStartTime = millis();timerActive = true;operationMode = MODE_TIMER;redrawNeeded = true;Serial.print("Timer Set: ");Serial.print(seconds);Serial.println(" seconds");
}void switchMode() {if (operationMode == MODE_NORMAL) {operationMode = MODE_LIGHT_AUTO;} else if (operationMode == MODE_LIGHT_AUTO) {operationMode = MODE_NORMAL;} else {// 如果是定时器或睡眠模式,切换到普通模式operationMode = MODE_NORMAL;}redrawNeeded = true;if (operationMode == MODE_NORMAL) {Serial.println("Normal Mode");} else if (operationMode == MODE_LIGHT_AUTO) {Serial.println("Light Auto Mode");}
}void toggleSleepMode() {if (fanState == FAN_OFF) {Serial.println("Please Turn ON Fan First");return;}sleepActive = !sleepActive;if (sleepActive) {sleepStartTime = millis();operationMode = MODE_SLEEP;Serial.println("Sleep Mode Activated - Fan will turn off at 6 AM");} else {operationMode = MODE_NORMAL;Serial.println("Sleep Mode Deactivated");}redrawNeeded = true;
}void handleSwing() {if (swingState == SWING_OFF) return;unsigned long currentTime = millis();if (currentTime - lastSwingTime >= swingSpeed) {lastSwingTime = currentTime;// 摆动范围 20-160 度static int direction = 1; // 1为增加角度,-1为减少角度swingAngle += direction;myservo.write(swingAngle);// 到达边界时改变方向if (swingAngle >= 160 || swingAngle <= 20) {direction = -direction;}}
}void handleTimer() {if (!timerActive) return;unsigned long currentTime = millis();unsigned long elapsedTime = currentTime - timerStartTime;if (elapsedTime >= timerDuration) {turnOffFan();operationMode = MODE_NORMAL;Serial.println("Timer Finished - Fan Turned OFF");redrawNeeded = true;}
}void handleSleepMode() {if (!sleepActive) return;unsigned long currentTime = millis();unsigned long elapsedTime = currentTime - sleepStartTime;// 模拟6点关闭(8小时睡眠时间)if (elapsedTime >= sleepDuration) {turnOffFan();sleepActive = false;operationMode = MODE_NORMAL;Serial.println("Sleep Mode Finished - Fan Turned OFF");redrawNeeded = true;}
}void readLightSensor() {// 读取光线强度int newLightLevel = analogRead(LIGHT_SENSOR);// 添加一些滤波以减少噪声lightLevel = (lightLevel * 0.7) + (newLightLevel * 0.3);
}void handleAutoMode() {if (operationMode != MODE_LIGHT_AUTO) return;if (fanState == FAN_OFF && lightLevel < LIGHT_THRESHOLD) {turnOnFan();Serial.println("Low Light - Auto ON");redrawNeeded = true;}if (fanState == FAN_ON && lightLevel >= LIGHT_THRESHOLD) {turnOffFan();Serial.println("Bright Light - Auto OFF");redrawNeeded = true;}
}void updateDisplay() {// 只在需要时重绘if (!redrawNeeded) {// 对于定时器模式,每秒更新一次时间显示if (operationMode == MODE_TIMER && timerActive) {unsigned long currentTime = millis();if (currentTime - lastTimerUpdate >= 1000) {lastTimerUpdate = currentTime;updateTimerDisplay();}}// 对于睡眠模式,每分钟更新一次时间显示else if (operationMode == MODE_SLEEP && sleepActive) {unsigned long currentTime = millis();if (currentTime - lastTimerUpdate >= 10000) {lastTimerUpdate = currentTime;updateSleepDisplay();}}return;}lastLightLevel = lightLevel;// 清除整个屏幕tft.fillScreen(ST77XX_BLACK);// 绘制标题和模式指示器tft.setCursor(20, 10);tft.setTextColor(ST77XX_CYAN);tft.setTextSize(2);tft.println("SMART FAN");// 绘制模式指示器uint16_t modeColor;String modeText;switch(operationMode) {case MODE_NORMAL:modeColor = ST77XX_BLUE;modeText = "NORM";break;case MODE_LIGHT_AUTO:modeColor = ST77XX_GREEN;modeText = "AUTO";break;case MODE_TIMER:modeColor = ST77XX_YELLOW;modeText = "TIMER";break;case MODE_SLEEP:modeColor = ST77XX_MAGENTA;modeText = "SLEEP";break;}tft.fillRect(180, 10, 50, 20, modeColor);tft.setCursor(185, 15);tft.setTextColor(ST77XX_WHITE);tft.setTextSize(1);tft.println(modeText);// 绘制分隔线tft.drawFastHLine(10, 35, 220, ST77XX_WHITE);// 根据模式更新显示switch(operationMode) {case MODE_NORMAL:updateNormalModeDisplay();break;case MODE_LIGHT_AUTO:updateLightModeDisplay();break;case MODE_TIMER:updateTimerDisplay();break;case MODE_SLEEP:updateSleepDisplay();break;}redrawNeeded = false;lastTimerUpdate = millis();
}void updateNormalModeDisplay() {// 清除数据区域tft.fillRect(10, STATUS_AREA, 220, 200, ST77XX_BLACK);// 显示风扇状态tft.setCursor(20, 50);tft.setTextColor(ST77XX_WHITE);tft.setTextSize(2);tft.print("FAN: ");tft.setTextColor(fanState == FAN_ON ? ST77XX_GREEN : ST77XX_RED);tft.println(fanState == FAN_ON ? "ON" : "OFF");// 显示摇头状态tft.setCursor(20, 80);tft.setTextColor(ST77XX_WHITE);tft.print("SWING: ");tft.setTextColor(swingState == SWING_ON ? ST77XX_GREEN : ST77XX_RED);tft.println(swingState == SWING_ON ? "ON" : "OFF");// 显示舵机速度tft.setCursor(20, 110);tft.setTextColor(ST77XX_WHITE);tft.print("SPEED: ");tft.setTextColor(ST77XX_YELLOW);tft.print(swingSpeed);tft.println("ms");// 显示光线数据tft.setCursor(20, 140);tft.setTextColor(ST77XX_WHITE);tft.print("LIGHT: ");tft.setTextColor(ST77XX_GREEN);tft.println(lightLevel);// 底部状态栏tft.fillRect(0, 220, 240, 20, ST77XX_BLUE);tft.setCursor(70, 225);tft.setTextColor(ST77XX_WHITE);tft.setTextSize(1);tft.print("NORMAL MODE");
}void updateLightModeDisplay() {// 清除数据区域tft.fillRect(10, STATUS_AREA, 220, 200, ST77XX_BLACK);// 显示标题tft.setCursor(20, 50);tft.setTextColor(ST77XX_WHITE);tft.setTextSize(2);tft.println("LIGHT CONTROL");// 显示光线数据tft.setCursor(20, 80);tft.setTextColor(ST77XX_WHITE);tft.print("LIGHT: ");tft.setTextColor(ST77XX_GREEN);tft.println(lightLevel);// 显示阈值信息tft.setCursor(20, 110);tft.setTextColor(ST77XX_WHITE);tft.print("THRESHOLD: ");tft.setTextColor(ST77XX_YELLOW);tft.println(LIGHT_THRESHOLD);// 显示控制状态tft.setCursor(20, 140);tft.setTextColor(ST77XX_WHITE);tft.print("CONTROL: ");if (lightLevel < LIGHT_THRESHOLD) {tft.setTextColor(ST77XX_GREEN);tft.println("FAN ON");} else {tft.setTextColor(ST77XX_RED);tft.println("FAN OFF");}// 显示当前风扇状态tft.setCursor(20, 170);tft.setTextColor(ST77XX_WHITE);tft.print("FAN: ");tft.setTextColor(fanState == FAN_ON ? ST77XX_GREEN : ST77XX_RED);tft.println(fanState == FAN_ON ? "ON" : "OFF");// 底部状态栏tft.fillRect(0, 220, 240, 20, ST77XX_GREEN);tft.setCursor(70, 225);tft.setTextColor(ST77XX_WHITE);tft.setTextSize(1);tft.print("AUTO LIGHT MODE");
}void updateTimerDisplay() {// 清除数据区域tft.fillRect(10, STATUS_AREA, 220, 200, ST77XX_BLACK);// 显示标题tft.setCursor(20, 50);tft.setTextColor(ST77XX_WHITE);tft.setTextSize(2);tft.println("TIMER MODE");// 显示剩余时间tft.setCursor(20, 80);tft.setTextColor(ST77XX_WHITE);tft.print("TIME LEFT: ");if (timerActive) {unsigned long remaining = (timerDuration - (millis() - timerStartTime)) / 1000;tft.setTextColor(ST77XX_YELLOW);tft.print(remaining);tft.println("s");} else {tft.setTextColor(ST77XX_RED);tft.println("INACTIVE");}// 显示风扇状态tft.setCursor(20, 110);tft.setTextColor(ST77XX_WHITE);tft.print("FAN: ");tft.setTextColor(fanState == FAN_ON ? ST77XX_GREEN : ST77XX_RED);tft.println(fanState == FAN_ON ? "ON" : "OFF");// 底部状态栏tft.fillRect(0, 220, 240, 20, ST77XX_YELLOW);tft.setCursor(90, 225);tft.setTextColor(ST77XX_BLACK);tft.setTextSize(1);tft.print("TIMER MODE");
}void updateSleepDisplay() {// 清除数据区域tft.fillRect(10, STATUS_AREA, 220, 200, ST77XX_BLACK);// 显示标题tft.setCursor(20, 50);tft.setTextColor(ST77XX_WHITE);tft.setTextSize(2);tft.println("SLEEP MODE");// 显示剩余时间tft.setCursor(20, 80);tft.setTextColor(ST77XX_WHITE);tft.print("TIME LEFT: ");if (sleepActive) {unsigned long remaining = (sleepDuration - (millis() - sleepStartTime)) / 1000;unsigned long hours = remaining / 3600;unsigned long minutes = (remaining % 3600) / 60;tft.setTextColor(ST77XX_MAGENTA);tft.print(hours);tft.print("h ");tft.print(minutes);tft.println("m");} else {tft.setTextColor(ST77XX_RED);tft.println("INACTIVE");}// 显示关闭时间tft.setCursor(20, 110);tft.setTextColor(ST77XX_WHITE);tft.print("TURNS OFF: ");tft.setTextColor(ST77XX_YELLOW);tft.println("6:00 AM");// 显示风扇状态tft.setCursor(20, 140);tft.setTextColor(ST77XX_WHITE);tft.print("FAN: ");tft.setTextColor(fanState == FAN_ON ? ST77XX_GREEN : ST77XX_RED);tft.println(fanState == FAN_ON ? "ON" : "OFF");// 底部状态栏tft.fillRect(0, 220, 240, 20, ST77XX_MAGENTA);tft.setCursor(90, 225);tft.setTextColor(ST77XX_WHITE);tft.setTextSize(1);tft.print("SLEEP MODE");
}
模块名称核心职责关键函数
红外遥控接收并解析红外按键指令,映射到对应功能handleIRCommand()togglePower()
风扇动作控制控制风扇电源(继电器)和摇头(舵机)turnOnFan()turnOffFan()等
模式控制管理普通、光线自动、定时、睡眠 4 种工作模式switchMode()handleAutoMode()
传感器数据读取并滤波光敏传感器数据,为自动模式提供依据readLightSensor()
显示驱动控制 TFT 屏显示系统状态(定时 / 睡眠剩余时间)updateTimerDisplay()等

三、项目结果演示

3.1 操作流程

(1)系统启动

        上电后系统显示准备界面,完成自检后进入主界面

(2)系统控制

        "电源键:开关风扇、"摇头键:启用/禁用摇头功能、"模式键:切换普通/光控模式                定时功能:设置10秒 / 30秒后系统自动关闭、启用睡眠模式 8 小时自动关闭

3.2 界面展示

(1)普通模式界面

        显示风扇状态、摇头状态、舵机速度和光线值

(2)光控模式界面

        显示光线值、阈值和控制状态

(3)定时模式界面

        显示剩余时间和风扇状态

(4)睡眠模式界面

        显示剩余时间和关闭时间

3.3 视频演示

JQC-3FF-S-Z继电器驱动小风扇

红外遥控操作控制智能风扇实现自动光控功能、摇头功能、模式切换以及系统定时功能

四、JQC-3FF-S-Z工作原理

4.1 基本结构

        继电器主要由电磁线圈、铁芯、铁片(衔铁)、复位弹簧、常开触点和常闭触点等部分组成。

4.2 动作机制

        根据触点的动作形式,可分为常闭式和常开式。常闭式继电器在未通电时触点闭合,通电后断开;常开式继电器在未通电时触点断开,通电后闭合。

        电器的动作机制基于电磁感应原理。当线圈通电后,产生的磁场使铁心运动,带动与铁心相连的触点动作。

五、常见问题解答

Q1: 如何调整光控的灵敏度?

A: 修改代码中的LIGHT_THRESHOLD值:

        值越小,对光线越敏感(更容易触发)。值越大,需要更暗的环境才会触发

Q2: 如何修改定时时间?

A: 在setTimer函数中修改时间参数,或者添加更多的定时选项:

void setTimer(int seconds) {// 修改这里的seconds参数即可timerDuration = seconds * 1000;// ...
}

Q3: 舵机转动不流畅怎么办?

A: 调整swingSpeed参数:

        值越小,转动越快。值越大,转动越慢(建议范围5-30ms)

项目资源整合

        继电器数据手册:JQC-3FF-S-Z

        显示屏数据手册:ST7789

        通过本项目的学习,读者可以掌握STM32开发的基本技能,了解继电器控制原理,并学会如何设计用户友好的交互界面。欢迎各位读者在此基础上进行扩展和改进,创造出更多有趣的智能家居应用!

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ReACT Agent概述

目录 1. 核心思想&#xff1a;解决传统方法的局限性 2. ReACT 的工作原理&#xff1a;一个循环过程 3. 技术实现的关键要素 4. ReACTAgent 在任务中的具体工作流程 5. 优势与重要性 6. 挑战与局限性 总结 ReACT 是一个非常重要的框架&#xff0c;它代表了构建能够推理&a…

必知!机器人的分类与应用:RPA、人形与工业机器人

每当提及“机器人”这三个字&#xff0c;许多人的第一反应或许仍是科幻电影中那种具备人类外形、可自由行走与对话的仿生装置。然而&#xff0c;一个值得深入探讨的科技现实是&#xff1a;我们对于人形机器人的迷恋&#xff0c;更多源自文化叙事与情感投射&#xff0c;而非真实…

最快的 C 语言 JSON 库 - yyjson

文章目录DOM 模式下的性能比对一、AWS EC2 (AMD EPYC 7R32, gcc 9.3)二、iPhone (Apple A14, clang 12)持续更新中 持续更新中 持续更新中一个用 ANSI C(C89) 编写的高性能 JSON 库 API.md DOM 模式下的性能比对 DOM 模式&#xff0c;即构建完整 JSON 内存结构后访问数据的模…

TP8 模型save更新不成功

一、User文件头部代码class User extends Model {const TITLE_NAME 用户;//名称//不能删除protected $name user_; //表名 protected $connection \app\services\database\model\DbConnModel::CONN_DB_SITE; //数据库的连接二、更新部分我要更新user_1用户表中的用户信息$se…

中囯移动电视盒子(魔百和)B860AV2.1-A2和CM311-5-zg刷机手记

文章目录B860AV2.1-A2电视盒子情况打开隐藏或屏蔽的功能进入Recovery模式打开WiFi&#xff08;如果被隐藏&#xff09;打开运维调试打开ADB调试安装第三方应用、设置第三方桌面等&#xff08;Fiddler抓包替换官方App安装包&#xff09;开启ADB和使用ADB禁止“首次启动设置”刷机…

【系统架构设计(14)】项目管理下:软件质量与配置管理:构建可靠软件的基础保障

文章目录一、核心思想二、软件质量属性&#xff1a;定义"好软件"的标准三、质量保证与控制&#xff1a;实现质量标准的方法四、CMMI模型&#xff1a;组织质量能力的演进路径五、软件配置管理&#xff1a;质量成果的保护机制六、软件工具&#xff1a;质量管理的技术支…

码农的“必修课”:深度解析Rust的所有权系统(与C++内存模型对比)

在软件开发的世界里&#xff0c;内存管理是至关重要的一个环节。它是程序运行的基础&#xff0c;直接关系到程序的性能、稳定性和安全性。一个糟糕的内存管理策略&#xff0c;可能导致内存泄漏、野指针、缓冲区溢出等一系列令人头疼的问题&#xff0c;甚至带来灾难性的安全漏洞…

Java全栈学习笔记30

# MySQL 卸载安装版电脑管家/360/控制面板卸载mysql服务即可删除ProgramData中的MySQL目录解压版winr 输入 services.msc 打开服务管理。查看是否存在MySQL&#xff0c;如果存在则删除注册表 winR regedit 打开注册表计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Servic…

Transformers 学习入门:前置知识补漏

在学习 Transformers 之前&#xff0c;打好神经网络和自然语言处理的基础至关重要。本文整理了需要掌握的核心前置知识&#xff0c;用通俗的例子帮你快速理解复杂概念&#xff0c;为后续学习铺平道路。​ 一、神经网络基础​ 1. 多层感知机&#xff08;MLP&#xff09;&#xf…

双摄工业相机的主要特点和应用场景

双摄工业相机&#xff08;双目摄像头&#xff09;在工业领域中的应用非常广泛&#xff0c;其核心优势在于通过双镜头模拟人眼立体视觉&#xff0c;能够获取深度信息并实现高精度三维重建。 一、双摄工业相机的核心优势 深度感知与三维重建 双目摄像头通过两个镜头从不同角度拍…

YOLOv11改进:FocalModulation替换SPPF(精度更高的空间金字塔池化)

YOLOv11&#xff1a;FocalModulation替换SPPF&#xff08;精度更高的空间金字塔池化&#xff09; 引言 在目标检测领域&#xff0c;YOLO系列算法以其高效性和准确性广受欢迎。作为YOLO系列的最新成员之一&#xff0c;YOLOv11在多个方面进行了优化和改进。其中&#xff0c;空间金…

LLM与数据工程的融合:衡石Data Agent的语义层与Agent框架设计

在数字经济浪潮中&#xff0c;企业数据智能正经历从"工具辅助"到"智能协同"的范式跃迁。传统BI系统受限于静态报表与预设指标&#xff0c;难以应对动态业务场景的复杂需求。衡石科技发布的HENGSHI SENSE 6.0通过"Data AI Agent"架构创新&#x…

假设一个算术表达式中包含圆括号、方括号和花括号3种类型的括号,编写一个算法来判别,表达式中的括号是否配对,以字符“\0“作为算术表达式的结束符

思想:这道题是栈的应用类型&#xff0c;我们可以建立一个栈来保存(,[,{,通过遍历字符串如果是三个左括号其中一个则入栈&#xff0c;当遇到)]}则出栈配对&#xff0c;如果左右匹配&#xff0c;则遍历下一个元素&#xff0c;如果不匹配直接返回&#xff0c;如果遍历字符串结束&a…

鸿蒙Next的UI国际化与无障碍适老化实践:构建全球包容的数字世界

科技不应让任何人掉队&#xff0c;鸿蒙Next正将这一理念变为现实在全球化日益深入的今天&#xff0c;应用的国际化与无障碍设计不再是"锦上添花"&#xff0c;而是不可或缺的核心竞争力。华为鸿蒙Next系统从设计之初就深入考虑了这些需求&#xff0c;为开发者提供了完…

深度学习——迁移学习

迁移学习作为深度学习领域的一项革命性技术&#xff0c;正在重塑我们构建和部署AI模型的方式。本文将带您深入探索迁移学习的核心原理、详细实施步骤以及实际应用中的关键技巧&#xff0c;帮助您全面掌握这一强大工具。迁移学习的本质与价值迁移学习的核心思想是"站在巨人…

RAG|| LangChain || LlamaIndex || RAGflow

大模型&#xff1a;预训练模型 外挂知识库&#xff1a;知识库->向量数据库 输入-》预处理成向量 提示词-》llm归纳总结 离线&#xff1a;企业原文本存到向量数据库 向量&#xff1a; 同一个向量模型&#xff08;第二代检索&#xff0c;推荐&#xff0c;个人助理&#xff0c;…

mcp_clickhouse代码学习

引言:当ClickHouse遇上MCP 作为一个基于Model Context Protocol(MCP)框架的ClickHouse查询服务器,mcp_clickhouse不仅在技术实现上展现了优雅的设计思路,更在架构层面提供了许多值得借鉴的解决方案。 一、项目概览:架构初探 mcp_clickhouse是一个专为ClickHouse数据库设计…

前端三件套+springboot后端连通尝试

本文承接自跨域请求问题浅解-CSDN博客 后端&#xff1a; //主启动类 SpringBootApplication public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}} //控制类 RestController RequestMapping(&quo…

决策树、ID3决策树(信息熵、信息增益)

目录 一、决策树简介 决策树建立过程 二、ID3决策树 核心思想&#xff1a;决策树算法通过计算​​信息增益​​来选择最佳分裂特征 1、信息熵 2、信息熵的计算方法 3、信息增益 4、信息增益的计算&#xff08;难点&#xff09; 5、ID3决策树构建案例 三、总结 一、决策树简介 决…

SpringBoot文件下载(多文件以zip形式,单文件格式不变)

SpringBoot文件下载&#xff08;多文件以zip形式&#xff0c;单文件格式不变&#xff09;初始化文件服务器&#xff08;我的是minio&#xff09;文件下载# 样例# # 单文件# # 多文件初始化文件服务器&#xff08;我的是minio&#xff09; private static MinioClient minioClie…