基于单片机的家用智能浇灌系统
1、开发环境
keil5,STM32CubeMX、Altium Designer
2、硬件清单
单片机:STM32F051K8Ux
土壤湿度传感器:TL - 69
温度传感器:DS18B20(数字传感器直接输出数字信号)
OLED屏幕:OLED12864、
水泵:L9110等;
3、功能设计
传感器采集空气和土壤的温度以及湿度,将数据传输给单片机,经单片机处理后输出在OLED显示屏上。
4、硬件连接
- 将温度传感器DS18B20、土壤湿度传感器YL - 69、水泵L9110、连接到STM32的GPIO引脚上。
- 将OLED屏幕OLED12862连接到STM32的I2C引脚上。
5、功能分析
5.1总体功能
- 使用STM32的GPIO库和I2C库来配置和读取传感器数据。
- 编写代码来读取温度传感器DS18B20、湿度传感器YL - 69的数据。
- 根据传感器数据,编写代码判断植物是否需要灌溉,如果需要浇灌,使用GPIO库来控制水泵L9110的开关。
- 使用STM32的I2C库来驱动oled显示屏。
- 编写代码来实现空气温度和土壤湿度数据到OLED屏幕上。
5.2传感器采集数据
1. DS18B20温度传感器数据采集:
- DS18B20是一种数字温度传感器,采用单总线接口进行通信。单片机通过GPIO口与DS18B20进行通信。
- 通信过程中,单片机发送指令给DS18B20,例如读取温度的指令。
- DS18B20将温度数据以序列的形式通过单总线返回给单片机。单片机通过接收和解析这个序列,得到DS18B20传感器的原始温度数据。
- 单片机可以通过读取DS18B20的原始温度数据,并进行相应的计算,得到实际的温度值。
2. YL69湿度传感器数据采集:
- YL69湿度传感器是一种模拟湿度传感器,输出模拟电压信号。它通常需要一个模数转换器(ADC)将模拟信号转换为数字信号,以便单片机进行处理。
- 单片机通过GPIO口与YL69湿度传感器进行通信,读取YL69湿度传感器的模拟电压信号。
- 单片机将YL69湿度传感器的模拟电压信号输入到内部的ADC模块中进行转换。
- ADC模块将模拟电压信号转换为数字信号,并将转换后的数字数据传递给单片机。
- 单片机可以通过读取ADC转换后的数字数据,并进行相应的处理,得到YL69湿度传感器的湿度值。
需要注意的是,具体的数据采集方式和通信协议可能因单片机、传感器和硬件平台的不同而有所差异。因此,在实际应用中,需要根据所使用的硬件和软件平台的要求,以及传感器的规格和接口,进行相应的配置和编程。以上是一种可能的实现方式,具体的实现细节可能会有所不同。
6、代码编写
1、GPIO管脚配置
可以在STM32CubeMX中选择相应的引脚,并将其配置为推挽输出模式,然后生成相应的代码。
void GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;// 使能GPIOA和GPIOB的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);// 配置PA0引脚为推挽输出GPIO_InitStructure.GPIO_Pin = PUMP_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);
}
2、配置 I2C
在STM32CubeMX中,可以通过图形化界面选择I2C外设并进行相应的配置,然后生成对应的代码。
步骤如下:
1. 打开STM32CubeMX软件,并创建一个新的工程。
2. 选择目标STM32F051K8Ux微控制器型号。
3. 在"Pinout & Configuration"选项卡中,找到I2C1外设,并配置相关的引脚。
4. 在"Configuration"选项卡中,找到I2C1外设,并设置相关的参数,如时钟速度、地址等。
5. 确认配置无误后,点击"Project"菜单,选择"Generate Code"生成代码。
6. 在生成的代码中,可以找到类似于你提供的`I2C_Configuration`函数的代码。
void I2C_Configuration(void)
{I2C_InitTypeDef I2C_InitStructure;// 使能I2C1的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);// 配置I2C1的引脚GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);// 配置I2C1的参数I2C_DeInit(I2C1);I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;I2C_InitStructure.I2C_OwnAddress1 = 0x00;I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;I2C_InitStructure.I2C_ClockSpeed = 100000;I2C_Init(I2C1, &I2C_InitStructure);// 使能I2C1I2C_Cmd(I2C1, ENABLE);
}
3、温度采集函数
void DS18B20_ReadTemperature(float *temperature)
{uint8_t buffer[2];// 发送读取温度命令I2C_GenerateSTART(I2C1, ENABLE);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));I2C_Send7bitAddress(I2C1, DS18B20_ADDRESS, I2C_Direction_Transmitter);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));I2C_SendData(I2C1, 0x00);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));I2C_GenerateSTOP(I2C1, ENABLE);// 读取温度数据I2C_GenerateSTART(I2C1, ENABLE);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));I2C_Send7bitAddress(I2C1, DS18B20_ADDRESS, I2C_Direction_Receiver);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));buffer[0] = I2C_ReceiveData(I2C1);I2C_AcknowledgeConfig(I2C1, DISABLE);I2C_GenerateSTOP(I2C1, ENABLE);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));buffer[1] = I2C_ReceiveData(I2C1);// 计算温度值*temperature = (float)((buffer[1] << 8) | buffer[0]) / 16.0;
}
DS18B20_ReadTemperature函数从连接到I2C总线的DS18B20温度传感器中读取温度数据。以下是它的工作原理的逐步解释:
1. 声明一个数组 buffer 来存储2个字节的温度数据。
2. 通过在I2C总线上生成起始条件并将传感器选择为发送器,发送读取温度的命令。
3. 等待主发送器模式被选中,然后将温度寄存器的地址(0x00)发送给传感器。
4. 等待字节传输完成,然后生成停止条件来结束传输。
5. 通过在I2C总线上生成起始条件并将传感器选择为接收器,发送读取温度数据的命令。
6. 等待主接收器模式被选中,然后等待字节接收完成。
7. 将接收到的字节存储在 buffer[0] 中。
8. 禁用应答位,表示不再接收更多的字节。
9. 生成停止条件来结束传输。
10. 等待字节接收完成,并将其存储在 buffer[1] 中。
11. 通过将 buffer 中的两个字节组合起来并除以16.0来计算温度值。
12. 将温度值存储在由 temperature 指针指向的内存位置中。
总体而言,该函数从DS18B20传感器中读取温度数据,并计算出摄氏度的温度值。温度值然后存储在由 temperature 指针指向的内存位置中,以供进一步使用。
4、湿度采集函数
void YL69_ReadHumidity(float *humidity)
{uint8_t buffer[2];// 发送读取湿度命令I2C_GenerateSTART(I2C1, ENABLE);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));I2C_Send7bitAddress(I2C1, YL69_ADDRESS, I2C_Direction_Transmitter);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));I2C_SendData(I2C1, 0x00);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));I2C_GenerateSTOP(I2C1, ENABLE);// 读取湿度数据I2C_GenerateSTART(I2C1, ENABLE);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));I2C_Send7bitAddress(I2C1, YL69_ADDRESS, I2C_Direction_Receiver);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));buffer[0] = I2C_ReceiveData(I2C1);I2C_AcknowledgeConfig(I2C1, DISABLE);I2C_GenerateSTOP(I2C1, ENABLE);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));buffer[1] = I2C_ReceiveData(I2C1);// 计算湿度值*humidity = (float)((buffer[1] << 8) | buffer[0]) / 1024.0 * 100.0;
}
读取YL69湿度传感器的湿度值,并将结果存储在 humidity 指针指向的内存位置中。
1. 定义一个 buffer 数组,用于存储从传感器读取的数据。
2. 发送读取湿度命令:
- 生成起始条件,启动I2C总线。
- 等待主模式选择事件。
- 发送传感器的I2C地址和传输方向(发送器)。
- 等待主传输器模式选择事件。
- 发送读取湿度数据的命令(0x00)。
- 等待主字节传输完成事件。
- 生成停止条件,结束传输。
3. 读取湿度数据:
- 生成起始条件,启动I2C总线。
- 等待主模式选择事件。
- 发送传感器的I2C地址和传输方向(接收器)。
- 等待主接收器模式选择事件。
- 等待主字节接收完成事件。
- 将接收到的字节存储在 buffer[0] 中。
- 禁用应答位,表示不再接收更多的字节。
- 生成停止条件,结束传输。
- 等待主字节接收完成事件。
- 将接收到的字节存储在 buffer[1] 中。
4. 计算湿度值:
- 将 buffer[1] 左移8位后与 buffer[0] 进行按位或操作,得到16位的湿度数据。
- 将湿度数据转换为浮点型,除以1024.0后乘以100.0,得到湿度百分比值。
- 将湿度百分比值存储在由 humidity 指针指向的内存位置中。
总体而言,这段代码通过I2C总线与YL69湿度传感器进行通信,发送读取湿度命令并读取湿度数据。然后,它将读取到的湿度数据转换为百分比值,并将结果存储在由`humidity`指针指向的内存位置中。
7、完整代码
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_i2c.h"
#include "stdio.h"#define DS18B20_ADDRESS 0x48
#define YL69_ADDRESS 0x5C
#define PUMP_PIN GPIO_Pin_0void GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;// 使能GPIOA和GPIOB的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);// 配置PA0引脚为推挽输出GPIO_InitStructure.GPIO_Pin = PUMP_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);
}void I2C_Configuration(void)
{I2C_InitTypeDef I2C_InitStructure;// 使能I2C1的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);// 配置I2C1的引脚GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);// 配置I2C1的参数I2C_DeInit(I2C1);I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;I2C_InitStructure.I2C_OwnAddress1 = 0x00;I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;I2C_InitStructure.I2C_ClockSpeed = 100000;I2C_Init(I2C1, &I2C_InitStructure);// 使能I2C1I2C_Cmd(I2C1, ENABLE);
}void DS18B20_ReadTemperature(float *temperature)
{uint8_t buffer[2];// 发送读取温度命令I2C_GenerateSTART(I2C1, ENABLE);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));I2C_Send7bitAddress(I2C1, DS18B20_ADDRESS, I2C_Direction_Transmitter);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));I2C_SendData(I2C1, 0x00);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));I2C_GenerateSTOP(I2C1, ENABLE);// 读取温度数据I2C_GenerateSTART(I2C1, ENABLE);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));I2C_Send7bitAddress(I2C1, DS18B20_ADDRESS, I2C_Direction_Receiver);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));buffer[0] = I2C_ReceiveData(I2C1);I2C_AcknowledgeConfig(I2C1, DISABLE);I2C_GenerateSTOP(I2C1, ENABLE);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));buffer[1] = I2C_ReceiveData(I2C1);// 计算温度值*temperature = (float)((buffer[1] << 8) | buffer[0]) / 16.0;
}void YL69_ReadHumidity(float *humidity)
{uint8_t buffer[2];// 发送读取湿度命令I2C_GenerateSTART(I2C1, ENABLE);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));I2C_Send7bitAddress(I2C1, YL69_ADDRESS, I2C_Direction_Transmitter);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));I2C_SendData(I2C1, 0x00);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));I2C_GenerateSTOP(I2C1, ENABLE);// 读取湿度数据I2C_GenerateSTART(I2C1, ENABLE);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));I2C_Send7bitAddress(I2C1, YL69_ADDRESS, I2C_Direction_Receiver);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));buffer[0] = I2C_ReceiveData(I2C1);I2C_AcknowledgeConfig(I2C1, DISABLE);I2C_GenerateSTOP(I2C1, ENABLE);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));buffer[1] = I2C_ReceiveData(I2C1);// 计算湿度值*humidity = (float)((buffer[1] << 8) | buffer[0]) / 1024.0 * 100.0;
}void ControlPump(float temperature, float humidity)
{if (temperature > 25.0 && humidity < 50.0) {// 打开水泵GPIO_SetBits(GPIOA, PUMP_PIN);} else {// 关闭水泵GPIO_ResetBits(GPIOA, PUMP_PIN);}
}void OLED_WriteString(uint8_t row, uint8_t col, char *str)
{// 在OLED屏幕上写入字符串// ...
}void OLED_Clear(void)
{// 清空OLED屏幕// ...
}void DisplayData(float temperature, float humidity)
{char str[16];// 清空OLED屏幕OLED_Clear();// 显示温度数据sprintf(str, "Temp: %.2f C", temperature);OLED_WriteString(0, 0, str);// 显示湿度数据sprintf(str, "Humidity: %.2f%%", humidity);OLED_WriteString(1, 0, str);
}int main(void)
{float temperature, humidity;// 初始化GPIO和I2CGPIO_Configuration();I2C_Configuration();while (1) {// 读取温度数据DS18B20_ReadTemperature(&temperature);// 读取湿度数据YL69_ReadHumidity(&humidity);// 控制水泵ControlPump(temperature, humidity);// 在OLED屏幕上显示数据DisplayData(temperature, humidity);// 延时一段时间// ...}
}
相关文章:
基于单片机的家用智能浇灌系统
1、开发环境 keil5,STM32CubeMX、Altium Designer 2、硬件清单 单片机:STM32F051K8Ux 土壤湿度传感器:TL - 69 温度传感器:DS18B20(数字传感器直接输出数字信号) OLED屏幕:OLED12864、 水…...
Solr的入门使用
Solr是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化,被很多需要搜索的网站中广泛使用。…...

css鼠标样式 cursor: pointer
cursor: none; cursor:not-allowed; 禁止选择 user-select: none; pointer-events:none;禁止触发事件, 该样式会阻止默认事件的发生,但鼠标样式会变成箭头...

【解决】Kafka Exception thrown when sending a message with key=‘null‘ 异常
问题原因: 如下图,kafka 中配置的是监听域名的方式,但程序里使用的是 ip:port 的连接方式。 解决办法: kafka 中配置的是域名的方式,程序里也相应配置成 域名:port 的方式(注意:本地h…...

中心极限定理 简明教程
中心极限定理是概率论中的一组定理,它们描述了一些独立随机变量的和或平均值的分布在一定条件下趋近于正态分布的现象。中心极限定理有多种形式,其中最常见的是独立同分布的中心极限定理,它可以用数学公式表示为: 前提条件&#x…...

商城-学习整理-基础-库存系统(八)
一、整合ware服务 1、配置注册中心 2、配置配置中心 3、配置网关,重启网关 二、仓库维护 http://localhost:8001/#/ware-wareinfo 在前端项目module中创建ware文件夹保存仓库系统的代码。 将生成的wareinfo.vue文件拷贝到项目中。 根据功能,修改后台接…...

【C++ 学习 ⑬】- 详解 list 容器
目录 一、list 容器的基本介绍 二、list 容器的成员函数 2.1 - 迭代器 2.2 - 修改操作 三、list 的模拟实现 3.1 - list.h 3.2 - 详解 list 容器的迭代器 3.2 - test.cpp 一、list 容器的基本介绍 list 容器以类模板 list<T>(T 为存储元素的类型&…...
设计模式十五:命令模式(Command Pattern)
命令模式(Command Pattern)是一种行为型设计模式,它旨在将请求或操作封装成一个对象,从而允许你将不同的请求参数化,并且能够在不同的时间点执行或者队列化这些请求。这种模式使得请求发送者与接收者之间解耦ÿ…...

FPGA GTP全网最细讲解,aurora 8b/10b协议,HDMI视频传输,提供4套工程源码和技术支持
目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、GTP 全网最细解读GTP 基本结构GTP 发送和接收处理流程GTP 的参考时钟GTP 发送接口GTP 接收接口GTP IP核调用和使用 4、设计思路框架HDMI输入视频配置及采集视频数据组包GTP aurora 8b/10b数据对齐视频数据解包图像…...

用dcker极简打包java.jar镜像并启动
用dcker极简打包java.jar镜像并启动 一、本地打包好jar包 二、新建文件夹,将步骤1中的jar包拷贝到文件夹下 三、同目录下新建Dockerfile ## 基础镜像,这里用的是openjdk:8 FROM openjdk:8## 将步骤一打包好的jar包 拷贝到镜像的 跟目录下[目录可以自定义…...
设计模式——创建型
1.单例模式 单例模式主要用于某个类有且只能用一个对象的场景,单例模式下不能外部实例化对象,由类内部自行私有化实例对象并提供一个可以获得该对象的方法。单例模式主要有饿汉模式(安全,但在编译时就会自动创建对象,…...

iTOP-i.MX8M开发板添加USB网络设备驱动
选中支持 USB 网络设备驱动,如下图所示: [*] Device Drivers→ *- Network device support → USB Network Adapters→ {*} Multi-purpose USB Networking Framework 将光标移动到 save 保存,如下图所示: 保存到 arch/arm64/c…...

分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测
分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测 目录 分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测 2.代码说明:要求于Matlab 2021版及以上版本。 程序…...

JMeter 的并发设置教程
JMeter 是一个功能强大的性能测试工具,可以模拟许多用户同时访问应用程序的情况。在使用 JMeter 进行性能测试时,设置并发是非常重要的。本文将介绍如何在 JMeter 中设置并发和查看报告。 设置并发 并发是在线程组下的线程属性中设置的。 线程数&#…...
数据治理有哪些产品
数据治理是现代企业管理中至关重要的一个环节。随着企业的数据量不断增长,如何有效地管理和利用数据成为了一个亟待解决的问题。幸运的是,市场上已经涌现出了许多优秀的数据治理产品,下面就来介绍一些常见的数据治理产品。 首先,我…...

windows安装go,以及配置工作区,配置vscode开发环境
下载安装go 我安装在D:\go路径下配置环境变量 添加GOROOT value为D:\go修改path 添加%GOROOT%\bin添加GOPATH value为%USERPROFILE%\go 其中GOPATH 是我们自己开发的工作区,其中包含三个folder bin,pkg,以及src,其中src为我们编写代码的位置 配置vscod…...
第五章nginx负载均衡
负载均衡:反向代理来实现 nginx的七层代理: 七层是最常用的反向代理方式,只能配置在nginx配置文件的hppt模块中。而且配置方法名称:upstream模块,不能写在server中,也不能在location中,在http…...

MATLAB计算一组坐标点的相互距离(pdist、squareform、pdist2函数)
如果有一组坐标P(X,Y),包含多个点的X和Y坐标,计算其坐标点之间的相互距离 一、坐标点 P[1 1;5 2;3 6;8 8;4 5;5 1; 6 9];二、pdist函数 输出的结果是一维数组,获得任意两个坐标之间的距离,但没有对应关系 Dpdist(P)三、square…...

我国农机自动驾驶系统需求日益增长,北斗系统赋能精准农业
中国现代农业的发展,离不开智能化、自动化设备,迫切需要自动驾驶系统与农用机械的密切结合。自动驾驶农机不仅能够缓解劳动力短缺问题,提升劳作生产效率,同时还能对农业进行智慧化升级,成为解决当下农业痛点的有效手段…...

防雷检测行业应用完整解决方案
防雷检测是指对雷电防护装置的性能、质量和安全进行检测的活动,是保障人民生命财产和公共安全的重要措施。防雷检测的作用和意义主要有以下几点: 防止或减少雷电灾害事故的发生。雷电是一种自然现象,具有不可预测、不可控制和高能量等特点&a…...
湖北理元理律师事务所:债务优化中的“生活锚点”设计
在债务重组领域,一个常被忽视的核心矛盾是:还款能力与生存需求的冲突。过度压缩生活支出还债,可能导致收入中断;放任债务膨胀,又加剧精神压力。湖北理元理律师事务所通过“三步平衡法”,尝试在法理框架内破…...

单细胞注释前沿:CASSIA——无参考、可解释、自动化细胞注释的大语言模型
细胞类型注释是单细胞RNA-seq分析的重要步骤,目前有许多注释方法。大多数注释方法都需要计算和特定领域专业知识的结合,而且经常产生不一致的结果,难以解释。大语言模型有可能在减少人工输入和提高准确性的同时扩大可访问性,但现有…...

技术-工程-管用养修保-智能硬件-智能软件五维黄金序位模型
融智学工程技术体系:五维协同架构 基于邹晓辉教授的框架,工程技术体系重构为:技术-工程-管用养修保-智能硬件-智能软件五维黄金序位模型: math \mathbb{E}_{\text{技}} \underbrace{\prod_{\text{Dis}} \text{TechnoCore}}_{\…...
WPF【11_7】WPF实战-重构与美化(ViewModel的嵌套与分解、海量数据不要Join)
11-12 【重构】ViewModel的嵌套与分解 目前我们的代码中有一个不易发现的致命问题,如果工作中这样写代码大概率会被打回去重做。那么这个问题是什么呢? --\ViewModels\MainViewModel.cs 视图模型中的 LoadCustomers() 方法,考虑一下在这里我…...
解决idea与springboot版本问题
遇到以下问题: 1、springboot3.2.0与jdk1.8 提示这个包org.springframework.web.bind.annotation不存在,但是pom已经引入了spring-boot-starter-web 2、Error:Cannot determine path to tools.jar library for 17 (D:/jdk17) 3、Error:(3, 28) java: …...

秋招Day10 - JVM - 内存管理
JVM组织架构主要有三个部分:类加载器、运行时数据区和字节码执行引擎 类加载器:负责从文件系统、网络或其他来源加载class文件,将class文件中的二进制数据加载到内存中运行时数据区:运行时的数据存放的区域,分为方法区…...
leetcode617.合并二叉树:递归思想下的树结构融合艺术
一、题目深度解析与核心规则 题目描述 合并两棵二叉树是一个经典的树结构操作问题,题目要求我们将两棵二叉树合并成一棵新二叉树。合并规则如下: 若两棵树的对应节点都存在,则将两个节点的值相加作为新节点的值若其中一棵树的节点存在&…...

服务发现Nacos
目录 Nacos server 安装 注册服务到Nacos server 接口访问Nacos server中的已注册服务 Nacos控制台介绍 Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 在分布式服务应用中,各类服务需要统一的注册、统一的管理,这个组件工具…...
微信小程序带数组参数跳转页面,微信小程序跳转页面带数组参数
在微信小程序中,带数组参数跳转页面需要通过JSON序列化和URL编码处理,以下是具体实现方法 传递数组参数(发送页面) wx.navigateTo({url: /pages/targetPage?arr encodeURIComponent(JSON.stringify(yourArray)) });接收数组参…...

如何发布npm包?
如何发布npm包? 1. 注册账号[npm官网](https://www.npmjs.com/)2. 检查 npm 源是否在官方 npm 仓库,如果不在,进行切换3. 检查4. 打包配置5. 发布6. 使用错误:版本更新命令 1. 注册账号npm官网 2. 检查 npm 源是否在官方 npm 仓库…...