当前位置: 首页 > article >正文

基于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界面设计

控件如下:

逻辑界面设计

蓝牙连接逻辑:

按键发送逻辑:

接收数据逻辑:


需要实物或者完整源码的可以私信我。

相关文章:

基于STM32的环境监测系统(自制蓝牙APP)

目录 项目概述 实物图 演示视频 概述 硬件模块 原理图以及PCB 0.96寸OLED屏幕&#xff08;SSD1306&#xff09; CubeMX配置 初始化代码 MQ-2烟雾传感器 CubeMX配置 初始化代码 DHT11温湿度模块 驱动代码 HC-05蓝牙模块 CubeMX配置 ​编辑 空闲中断回调函数 有…...

C++ Windows下屏幕截图

屏幕截图核心代码&#xff08;如果要求高帧率&#xff0c;请使用DxGI&#xff09;&#xff1a; // RGB到YUV的转换公式 #define RGB_TO_Y(r, g, b) ((int)((0.299 * (r)) (0.587 * (g)) (0.114 * (b)))) #define RGB_TO_U(r, g, b) ((int)((-0.169 * (r)) - (0.331 * (g)) …...

月结保障:回滚慢、行锁频发

问题背景 3.1号月结现场保障&#xff0c;到场了先让kill了一个账务的会话&#xff0c;回滚了20min&#xff0c;巡检的时候发现报表库有几条行锁&#xff1a;enq: TX - row lock contention&#xff0c;sql&#xff1a;delete from table_name 语句已经失败&#xff0c;正在回滚…...

Golang的微服务服务发现机制

## 1. Golang微服务服务发现机制 微服务架构已经成为当今软件开发的主流趋势&#xff0c;它能将复杂的单体应用拆分成小而独立的服务单元&#xff0c;实现更快的开发、部署和扩展。在微服务架构中&#xff0c;服务发现是非常重要的一环&#xff0c;它能够实现服务之间的自动发现…...

Keepalived 入门详解:高可用集群部署最佳实践!

1. 什么是 Keepalived&#xff1f; 在分布式集群中&#xff0c;单点故障&#xff08;SPOF&#xff09; 是影响系统稳定性的重要问题。Keepalived 作为一款高可用服务软件&#xff0c;可以有效防止集群单点故障&#xff0c;保障系统的高可用性。 Keepalived 最初是为 LVS&#…...

SparkStreaming之04:调优

SparkStreaming调优 一 、要点 4.1 SparkStreaming运行原理 深入理解 4.2 调优策略 4.2.1 调整BlockReceiver的数量 案例演示&#xff1a; object MultiReceiverNetworkWordCount {def main(args: Array[String]) {val sparkConf new SparkConf().setAppName("Networ…...

开发博客系统

前言 准备工作 数据库表分为实体表和关系表 第一&#xff0c;建数据库表 然后导入前端页面 创建公共模块 就是统一返回值&#xff0c;异常那些东西 自己造一个自定义异常 普通类 mapper 获取全部博客 我们只需要返回id&#xff0c;title&#xff0c;content&#xff0c;us…...

微信小程序上如何使用图形验证码

1、php服务器生成图片验证码的代码片段如下&#xff1a; 注意红框部分的代码&#xff0c;生成的是ArrayBuffer类型的二进制图片 2、显示验证码 显示验证码&#xff0c;不要直接image组件加上src显示&#xff0c;那样拿不到cookie&#xff0c;没有办法做图形验证码的验证&…...

IntelliJ IDEA 构建项目时内存溢出问题

问题现象 在使用 IntelliJ IDEA 构建 Java 项目时&#xff0c;遇到了以下错误&#xff1a; java: java.lang.OutOfMemoryError: Java heap space java.lang.RuntimeException: java.lang.OutOfMemoryError: Java heap space这是一个典型的 Java 堆内存不足错误&#xff0c;表…...

大模型微调与RAG检索增强技术深度解析

一、引言 随着人工智能技术的飞速发展&#xff0c;大模型&#xff08;如BERT、GPT等&#xff09;在自然语言处理、计算机视觉等领域取得了显著成效。然而&#xff0c;这些预训练好的大模型往往难以直接应用于特定业务场景&#xff0c;因此&#xff0c;大模型微调&#xff08;F…...

[liorf_localization_imuPreintegration-2] process has died

使用liorf&#xff0c;编译没报错&#xff0c;但是roslaunch报错如下&#xff1a; 解决方法&#xff1a; step1: 如果你之前没有安装 GTSAM&#xff0c;可以尝试安装它 step2: 检查是否缺少依赖库 ldd /home/zz/1210/devel/lib/liorf_localization/liorf_localization_imuPr…...

2024 年 MySQL 8.0.40 安装配置、Workbench汉化教程最简易(保姆级)

首先到官网上下载安装包&#xff1a;http://www.mysql.com 点击下载&#xff0c;拉到最下面&#xff0c;点击社区版下载 windows用户点击下面适用于windows的安装程序 点击下载&#xff0c;网络条件好可以点第一个&#xff0c;怕下着下着断了点第二个离线下载 双击下载好的安装…...

数列极限入门习题

数列极限入门习题 lim ⁡ n → ∞ ( 1 1 2 1 3 ⋯ 1 n ) 1 n \lim\limits_{n\rightarrow\infty}(1 \frac{1}{2}\frac{1}{3}\cdots\frac{1}{n})^{\frac{1}{n}} n→∞lim​(121​31​⋯n1​)n1​ lim ⁡ n → ∞ ( 1 n 1 1 n 2 ⋯ 1 n n ) \lim\limits_{n\rightarrow\…...

【Python/Pytorch】-- 创建3090Ti显卡所需环境

文章目录 文章目录 01 服务器上&#xff0c;存在三个anaconda&#xff0c;如何选择合适的&#xff0c;创建python环境&#xff1f;02 conda、anaconda、cuda、cudnn区别03 用到一些指令04 如何指定cuda的版本&#xff1f;05 conda跟pip的区别&#xff1f;06 pycharm控制台07 服…...

如何在无图形化界面的服务器上下载百度网盘的超大文件(10GB以上)?

目录 登录百度网盘账号 进入特定的文件夹 下载 完整教程 登录百度网盘账号 第一次登录的时候会展示&#xff1a; Please visit: https://openapi.baidu.com/oauth/2.0/authorize?client_idxxx And authorize this app Paste the Authorization Code here within 10 minut…...

AI应用测试:遇到类ChatGPT的流式接口要如何压测?

先说结论: 使用最普遍的JMeter 就能支持类 OpenAI 的流式接口(如 ChatGPT 的流式聊天接口)的测试 总体设置 JMeter 支持测试 OpenAI 的流式接口,但需要额外配置(如启用 KeepAlive 和调整超时)。如果需要实时处理流式响应,使用 Regular Expression Extractor 或自定义脚…...

Linux磁盘情况查询

一、查询系统整体磁盘使用情况 1、基本语法 df -h 2、示例 二、查询指定目录的磁盘占用情况 1、基本语法 du -h 查询指定目录的磁盘占用情况&#xff0c;默认为当前目录 2、常用选项 选项 说明 -h 以人类可读的格式显示磁盘使用情况&#xff08;例如&#xff0c;KB、…...

数据库原理3

1.在SQL中&#xff0c;外模式对应于试图(VIEW)和部分基本表;模式对应于基本表;内模式对应于存储文件。 2.FETCH&#xff1a;实施游标推进 3.数据操纵&#xff1a;insert,update,delete 数据控制&#xff1a;grant,revoke 数据定义&#xff1a;create,drop,alter 4.物理结构…...

【3D格式转换SDK】HOOPS Exchange技术概览(二):3D数据处理高级功能

​ 在当今数字化工程领域&#xff0c;HOOPS Exchange作为一款强大的SDK&#xff0c;为3D工程应用程序的开发提供了关键支持。本文将深入剖析其基本组件、特定功能以及数据结构&#xff0c;带您全面了解这一驱动3D数据处理的核心工具。 一、概述 HOOPS Exchange专注于访问和重…...

利用Adobe Acrobat 实现PPT中图片分辨率的提升

1. 下载适用于 Windows 的 64 位 Acrobat 注册方式参考&#xff1a;https://ca.whu.edu.cn/knowledge.html?type1 2. 将ppt中需要提高分辨率的图片复制粘贴到新建的pptx问价中&#xff0c;然后执行“文件—>导出---->创建PDF、XPS文档” 3. 我们会发现保存下来的distrib…...

Python frozenset介绍

在 Python 中&#xff0c;frozenset 是一种不可变&#xff08;immutable&#xff09;的集合类型&#xff0c;它是 set 的不可变版本。与普通的 set 类型不同&#xff0c;frozenset 的内容一旦创建就不能被修改&#xff0c;这使得它在某些场景下非常有用。 1. 特点 不可变性&am…...

docer swarm集群部署springboot项目

1.准备两台服务器&#xff0c;安装好docker、docker-compose 因为用到了docker仓库&#xff0c;安装harbor,可以从github下载离线安装包 2. 我这边用到了gitlab-ci,整体流程也都差不多 1&#xff09;打包mvn clean install 2&#xff09;打镜像 docker-compose -f docker-compo…...

Elasticsearch:解锁深度匹配,运用Elasticsearch DSL构建闪电般的高效模糊搜索体验

目录 Elasticsearch查询分类 叶子查询 全文检索查询 match查询 multi_match查询 精确查询 term查询 range查询 复杂查询 bool查询简单应用 bool查询实现排序和分页 bool查询实现高亮 场景分析 问题思考 解决方案 search_after方案(推荐) point in time方案 方案…...

解决局域网访问Dify却仅显示nginx页面的问题

为什么dify在本机可以正常访问&#xff0c;局域网通过ip访问却只看到欢迎使用nginx的提示&#xff0c;如果访问服务器ip/apps则直接提示404 Not Found。这是怎么回事该如何解决呢&#xff1f;文章中将一步步解决这些问题。 前言 之前在服务器部署了dify&#xff0c;也在服务器…...

deepseek思考,谁是下一个deepseek?

这两天连续看了两篇某B站up关于AI的分析&#xff0c;也是感触很多 讲得内容咱先不说&#xff0c;讲得是真好。怎么说呢&#xff0c;就“活该人家能赚到钱”就对了。 第一篇&#xff0c;他说了一个事儿&#xff0c;就是AI未来的趋势&#xff0c;1000天内&#xff0c;代替世界上…...

从小米汽车召回看智驾“命门”:智能化时代 — 时间就是安全

2025年1月&#xff0c;小米因车辆“授时同步异常”召回3万余辆小米SU7&#xff0c;成为其造车历程中的首个重大安全事件。 从小米SU7召回事件剖析&#xff0c;授时同步何以成为智能驾驶的命门&#xff1f; 2024年11月&#xff0c;多名车主反馈SU7标准版的智能泊车辅助功能出现…...

OpenAI 最后一代非推理模型:OpenAI 发布 GPT-4.5预览版

最后一代非推理大模型 在人工智能领域&#xff0c;OpenAI 一直以其创新的技术和卓越的产品引领着行业的发展。近期&#xff0c;OpenAI 正式发布了 GPT-4.5 研究预览版。不仅如此&#xff0c;官方还宣称 GPT-4.5 被定位为 “最后一代非推理模型”&#xff0c;这一消息再次引起了…...

React Native国际化实践(react-i18next)

React Native国际化实践 一、主流国际化方案选择 react-i18next react-native-localize react-i18next&#xff1a;功能强大的国际化框架&#xff0c;支持复数、插值、嵌套等复杂语法&#xff0c;且与React无缝集成。react-native-localize&#xff1a;用于获取设备语言和地区…...

ioday2----->标准io函数

思维导图&#xff1a; 练习&#xff1a; 1将当前的时间写入到time. txt的文件中&#xff0c;如果ctrlc退出之后&#xff0c;在再次执行支持断点续写 1.2022-04-26 19:10:20 2.2022-04-26 19:10:21 3.2022-04-26 19:10:22 //按下ctrlc停止&#xff0c;再次执行程序 4.2022…...

竞争只属于失败者

“竞争只属于失败者”这一观点源自知名投资人、PayPal联合创始人彼得蒂尔&#xff08;Peter Thiel&#xff09;。他在斯坦福大学的创业课程中提出&#xff0c;成功的企业应追求垄断地位&#xff0c;而非陷入激烈的市场竞争。蒂尔认为&#xff0c;垄断使企业能够专注于长期发展和…...