基于STM32的蔬菜大棚温湿度智能控制系统设计

一、前言

随着人们对健康和可持续生活方式的关注不断增加,蔬菜大棚成为了现代农业中的重要组成部分。蔬菜大棚提供了一个受控的环境,使得农民能够在任何季节种植蔬菜,并根据需要进行调节。为了实现最佳的蔬菜生长和产量,对温度和湿度等环境条件的精确控制至关重要。

传统的蔬菜大棚管理通常依赖于人工监测和调节。这种方法存在一些问题,例如人工监测容易出现误差和延迟,而且对于大规模的蔬菜大棚来说,人工调节工作量巨大。所以开发一种基于智能控制系统的蔬菜大棚温湿度管理方案变得非常重要。

基于STM32微控制器的蔬菜大棚温湿度智能控制系统用于解决传统管理方法的问题,并提供一种自动化的解决方案。该系统利用STM32微控制器的强大计算和控制能力,结合温湿度传感器和执行器,实现对蔬菜大棚环境的精确监测和控制。

通过该系统,农民可以实时监测蔬菜大棚内的温度和湿度,并根据预设的目标范围自动调节。系统可以自动控制温室内的加热器、通风设备和加湿器等设备,以维持最适宜的生长环境条件。项目的目标是提高蔬菜大棚的生产效率和质量,降低能源消耗,并减少人力投入。通过智能控制系统的应用,农民能够实现更加可持续和高效的农业生产,为社会提供更多健康的蔬菜产品。

image-20230802152046578

二、系统设计流程

2.1 硬件选型

硬件选型是设计蔬菜大棚温湿度智能控制系统的重要环节。

【1】主控芯片:STM32F103ZET6 主控芯片使用STM32F103ZET6,它是一款高性能的ARM Cortex-M3内核微控制器,具有丰富的外设资源和强大的处理能力。该芯片可满足本项目对控制和数据处理的要求。

【2】温湿度传感器:DHT11 空气温湿度采集选用DHT11传感器,它采用数字信号输出,具有简单、低成本和较好的精度,适合大棚环境的温湿度监测。

【3】土壤湿度传感器:土壤湿度传感器 土壤湿度采集选用土壤湿度传感器,通过模拟-数字转换器(ADC)接口采集土壤湿度数据。该传感器能够准确测量土壤湿度,为农作物提供合适的灌溉水量。

【4】通风风机:5V小风扇+继电器 为了实现通风控制,选择5V小风扇作为通风装置,并通过继电器控制其开关状态。根据温度数据和设定阈值,通过STM32的GPIO口控制继电器的高低电平实现通风风扇的启停控制。

【5】照明灯:LED白色灯模块 为了提供适当的照明条件,选择LED白色灯模块作为照明装置。该模块使用STM32的GPIO口控制其开关状态,实现灯光的开启和关闭。

【6】灌溉系统:抽水电机+继电器 灌溉系统采用抽水电机作为水源,并通过继电器控制其开启和关闭。通过单片机控制继电器的高低电平来控制抽水电机的工作状态,实现灌溉系统的自动化操作。

【7】显示模块:LCD显示屏 为了方便用户观察当前的温湿度等数据,选用LCD显示屏进行数据的显示。通过STM32的数字接口与LCD显示屏进行通信,将采集到的数据实时显示在屏幕上。

2.2 软件设计思路

本项目的代码设计思路可以分为以下几个关键部分:

【1】初始化设置:首先,需要进行主控芯片的初始化设置,包括引脚配置、时钟设置等。同时,还需要对LCD显示屏进行初始化配置,以便后续显示数据。

【2】传感器数据采集:使用合适的库函数或代码,读取DHT11传感器和土壤湿度传感器的数据。通过适当的接口与主控芯片进行通信,获取温度、湿度和土壤湿度的数值。

【3】数据处理与判断:根据采集到的温湿度和土壤湿度数值,进行相应的数据处理和判断。判断当前温度是否超出设定范围,以及土壤湿度是否低于设定阈值等。

【4】控制执行器:根据数据处理和判断的结果,控制相应的执行器,如通风风扇、照明灯和灌溉系统。通过设置相应的引脚电平或触发继电器,实现执行器的开启或关闭。

【5】LCD显示:将采集到的温湿度和土壤湿度数值通过LCD显示屏进行显示,以便用户实时监测。

【6】用户交互:通过按键输入或其他方式,实现用户与系统的交互。设置土壤湿度阈值、调节温度范围等。

【7】循环运行:将上述步骤组织成一个循环运行的程序,确保系统能够持续采集数据、处理判断和控制执行器的操作。

三、代码实现

3.1 DHT11温湿度读取

读取DHT11传感器环境温湿度并通过串口打印出来。

#include "stm32f10x.h"
#include "stdio.h"// 定义DHT11数据引脚
#define DHT11_PIN   GPIO_Pin_0
#define DHT11_PORT  GPIOA// DHT11初始化函数
void DHT11_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;// 使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 配置DHT11引脚为推挽输出GPIO_InitStructure.GPIO_Pin = DHT11_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
}// 延时函数,单位为微秒
void Delay_us(uint32_t nCount)
{uint32_t i;for(i=0; i<nCount; i++);
}// 软件延时函数,单位为毫秒
void Delay_ms(uint32_t nCount)
{uint32_t i;for(i=0; i<nCount*1000; i++);
}// 从DHT11读取一位数据
uint8_t DHT11_ReadBit(void)
{uint8_t retries = 0;while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == Bit_RESET){if (retries++ > 100) return 0;Delay_us(1);}Delay_us(40);   // 延时40usif (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == Bit_SET)retries = 100;  // 超时标识elseretries = 0;while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == Bit_SET){if (retries++ > 100) return 0;Delay_us(1);}return 1;
}// 从DHT11读取一个字节数据
uint8_t DHT11_ReadByte(void)
{uint8_t i, temp = 0;for(i=0; i<8; i++){temp <<= 1;temp |= DHT11_ReadBit();}return temp;
}// 读取DHT11的温湿度值
uint8_t DHT11_ReadData(uint8_t* temperature, uint8_t* humidity)
{uint8_t data[5], checksum;// 主机将总线拉低至少18msGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = DHT11_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DHT11_PORT, &GPIO_InitStructure);GPIO_ResetBits(DHT11_PORT, DHT11_PIN);Delay_ms(20);GPIO_SetBits(DHT11_PORT, DHT11_PIN);Delay_us(30);// 设置为输入模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(DHT11_PORT, &GPIO_InitStructure);// 等待 DHT11 响应if (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == Bit_RESET){while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == Bit_RESET);while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == Bit_SET);// 读取5字节数据for(uint8_t i=0; i<5; i++)data[i] = DHT11_ReadByte();// 读取校验和checksum = DHT11_ReadByte();// 校验数据if((data[0] + data[1] + data[2] + data[3]) != checksum)return 0;*humidity = data[0];*temperature = data[2];return 1;}else{return 0;}
}// 初始化USART1
void USART1_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// 使能USART1和GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);// 配置USART1的引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  // TXGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  // RXGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置USART1USART_InitStructure.USART_BaudRate = 115200;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);// 使能USART1USART_Cmd(USART1, ENABLE);
}// 发送字符到USART1
void USART1_SendChar(char ch)
{while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);USART_SendData(USART1, (uint8_t)ch);
}// 发送字符串到USART1
void USART1_SendString(const char* str)
{while(*str){USART1_SendChar(*str++);}
}int main(void)
{uint8_t temperature, humidity;// 初始化DHT11和USART1DHT11_Init();USART1_Init();while(1){if (DHT11_ReadData(&temperature, &humidity)){// 发送温湿度数据到串口char buffer[50];sprintf(buffer, "Temperature: %d°C, Humidity: %d%%\r\n", temperature, humidity);USART1_SendString(buffer);}Delay_ms(2000);  // 2秒钟读取一次数据}
}

将代码下载到STM32F103ZET6开发板上,接上DHT11。当成功运行时,环境温湿度数据会通过USART1串口打印出来。

3.2 读取土壤湿度值

通过ADC1的通道1采集土壤传感器的湿度值,打印到串口.

#include "stm32f10x.h"
#include "stdio.h"// 函数声明
void ADC_Configuration(void);
void UART_Configuration(void);
void USART1_SendChar(char ch);int main(void)
{// 初始化ADC和串口ADC_Configuration();UART_Configuration();while (1){// 启动ADC转换ADC_SoftwareStartConvCmd(ADC1, ENABLE);// 等待转换完成while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));// 读取ADC值uint16_t adcValue = ADC_GetConversionValue(ADC1);// 将ADC值转换为湿度百分比float humidity = (float)adcValue / 4095 * 100;// 将湿度值打印到串口char buffer[20];sprintf(buffer, "Humidity: %.2f%%\r\n", humidity);for (int i = 0; buffer[i] != '\0'; i++){USART1_SendChar(buffer[i]);}// 延时一段时间for (int i = 0; i < 1000000; i++);}
}// ADC配置
void ADC_Configuration(void)
{ADC_InitTypeDef ADC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;// 使能ADC1和GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);// 配置GPIOA.1为模拟输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOA, &GPIO_InitStructure);// ADC配置ADC_DeInit(ADC1);ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode = DISABLE;ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &ADC_InitStructure);// 配置ADC1的通道1为采样通道ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);// 使能ADC1ADC_Cmd(ADC1, ENABLE);// ADC校准ADC_ResetCalibration(ADC1);while (ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);while (ADC_GetCalibrationStatus(ADC1));
}// 串口配置
void UART_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// 使能USART1和GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);// 配置USART1引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);// USART配置USART_InitStructure.USART_BaudRate = 115200;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);// 使能USART1USART_Cmd(USART1, ENABLE);
}// 发送字符到USART1
void USART1_SendChar(char ch)
{USART_SendData(USART1, (uint8_t)ch);while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

以上代码使用STM32的标准库函数进行配置和操作。在ADC_Configuration函数中进行ADC的初始化配置,包括GPIO引脚配置、ADC时钟使能、通道配置等。
UART_Configuration函数中进行串口USART1的初始化配置,包括GPIO引脚配置、波特率设置等。

在主函数中,进入一个无限循环。在循环中,启动ADC转换,并等待转换完成。
通过ADC_GetConversionValue函数读取ADC转换结果,将其转换为湿度百分比。
使用sprintf函数将湿度值格式化为字符串,并使用USART1_SendChar函数将字符串逐个字符发送到USART1串口。
通过延时函数进行一段时间的延时,以控制打印速率。

3.3 大棚补光灯控制

以下是使用STM32F103ZET6读取BH1750光照传感器输出的光照强度,并根据阈值控制LED补光灯灯开关实现代码:

#include "stm32f10x.h"
#include "i2c.h"
#include "delay.h"#define BH1750_ADDRESS 0x23void BH1750_Init()
{// 初始化I2C总线I2C_Init();
}void BH1750_Start()
{// 启动BH1750测量uint8_t cmd = 0x01; // 单次高分辨率模式I2C_Start();I2C_SendByte(BH1750_ADDRESS);I2C_WaitAck();I2C_SendByte(cmd);I2C_WaitAck();I2C_Stop();
}uint16_t BH1750_Read()
{// 读取BH1750测量结果uint16_t lux;I2C_Start();I2C_SendByte(BH1750_ADDRESS + 1); // 发送读命令I2C_WaitAck();lux = I2C_ReceiveByte() << 8; // 读取高字节I2C_Ack();lux |= I2C_ReceiveByte(); // 读取低字节I2C_NAck();I2C_Stop();return lux;
}void LED_Control(uint8_t state)
{// 控制LED照明灯开关if (state)GPIO_SetBits(GPIOA, GPIO_Pin_8); // 打开LEDelseGPIO_ResetBits(GPIOA, GPIO_Pin_8); // 关闭LED
}int main(void)
{// 初始化GPIO口GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// 初始化BH1750传感器BH1750_Init();while (1){// 启动测量BH1750_Start();// 延时等待测量完成DelayMs(200);// 读取光照强度uint16_t lux = BH1750_Read();// 判断阈值并控制LEDif (lux > 1000)LED_Control(1); // 光照强度高于阈值,打开LEDelseLED_Control(0); // 光照强度低于阈值,关闭LED}
}

代码中初始化I2C总线和BH1750传感器,通过BH1750_Init()函数实现。在主循环中,启动测量延时等待测量完成。使用BH1750_Read()函数读取测量结果,即光照强度。根据阈值判断光照强度是否高于设定值,通过LED_Control()函数控制LED的开关状态。

四、总结

本项目基于STM32微控制器实现了一个蔬菜大棚温湿度智能控制系统。系统的主控芯片采用了STM32F103ZET6,用于控制和协调各个硬件模块的工作。系统包括空气温湿度采集模块(DHT11)、土壤湿度采集模块(ADC接口)、通风风机(5V小风扇+继电器控制)、照明灯(LED白色灯模块)、灌溉系统(抽水电机+继电器控制)以及LCD显示屏。

系统的功能包括温湿度的实时监测、土壤湿度的检测、通风风扇的自动控制、灌溉系统的自动控制和数据的显示。通过按键设置土壤湿度阈值,实现自动浇水功能,当土壤湿度低于阈值时,系统自动开启灌溉系统进行浇水。同时,根据设定的温度阈值,系统自动控制通风风扇进行降温。

蔬菜大棚温湿度智能控制系统利用STM32微控制器和各种传感器实现了对环境参数的监测和控制,提高了蔬菜大棚的自动化程度和生产效率。同时,通过自动控制灌溉和通风系统,能够更好地满足蔬菜生长的需求,提高农作物的产量和质量。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

RedisTemplate出现\xac\xed\x00\x05t\x00\x0f前缀解决

问题描叙 出现这种乱码前缀的原因是没有进行序列化&#xff0c;因此导致在传输过程出现乱码问题&#xff0c;存到数据库&#xff0c;发现 key,hash key/value 都有 \xAC\xED\x00\x05t\x00 前缀。RedisTemplate类中默认是没有设置序列化的。 解决方法 设置RedisTemplate的序列…

微机原理与接口技术

一、微型计算机系统概述二、总线 总线(Bus)&#xff1a;是连接计算机各部件的一组公共信号线;总线上能同时传送二进制信息的位数称为总线宽度。 优点&#xff1a;大大减少传输线数目&#xff0c;结构简单&#xff0c;便于扩充 总线按传送信息分类:地址总线、数…

华为小型智能园区网络解决方案

云时代来袭&#xff0c;数字化正在从园区办公延伸到生产和运营的方方面面&#xff0c;智慧校园&#xff0c;柔性制造&#xff0c;掌上金融和电子政务等&#xff0c;面对各种各样的新兴业态的涌现&#xff0c;企业需要构建一张无所不联、随心体验、业务永续的全无线网络&#xf…

burpsuite只有intruder中文乱码

burpsuite 只有intruder模块中文乱码 现象&#xff1a;解决方案 现象&#xff1a; 在proxy、repeater等模块下中文均可正常显示&#xff0c;如下图&#xff1a; 在intruder模块&#xff0c;中文显示乱码 解决方案 在payloads标签下payload processing中添加“Decode”

web服务基础

前言&#xff1a;web服务怎么做&#xff0c;怎样使用&#xff0c;这是一个长期的任务 1、DNS解析原理 在windows 客户端查看本地缓存的DNS解析记录 C:\Users\86157>ipconfig /displaydns #其中这两个字符之间会有空格 在windows11 中的命令行运行结果如下 清除win客户端…

【区块链 | DID】白话数字身份

《十四五数字经济发展规划》提出建立健全政务数据共享协调机制&#xff0c;加快数字身份统一认证和电子证照、电子签章、电子公文等互信互任&#xff0c;推进发票电子化改革&#xff0c;促进政务数据共享、流程优化和业务协同。在数字经济逐渐成形的背景下&#xff0c;推进数字…

Elasticsearch 集群时的内部结构是怎样的?

Apache Lucene : Flush, Commit Elasticsearch 是一个基于 Apache Lucene 构建的搜索引擎。 它利用 Lucene 的倒排索引、查询处理和返回搜索结果等功能来执行搜索。 它还扩展了 Lucene 的功能&#xff0c;添加分布式处理功能以支持大型数据集的搜索。 让我们看一下 Apache Luc…

Learn Prompt- Midjourney Prompt:Prompt 提示语

基础结构​ 一个基本的提示可以简单到一个单词、短语或表情符号。非常短的提示将在很大程度上依赖于 Midjourney 的默认样式。 完整 prompt&#xff1a;可以包括一个或多个图像链接、多个文本短语或单词&#xff0c;以及一个或多个后缀参数 Image Prompts: 可以将图像 URL 添加…

比特币的蒙提霍尔问题

把钱放在嘴边 我们在比特币上建立了蒙提霍尔问题模拟。 如果您知道概率谜题的正确答案&#xff0c;不仅炫耀您的数学技能&#xff0c;还会获得金钱奖励。 它完全无需信任地在链上运行。 蒙提霍尔问题 蒙提霍尔问题&#xff08;三门问题&#xff09;是一个以蒙提霍尔命名的概率…

数据一致性:核心概念与实现策略

在当今的信息时代&#xff0c;数据已经成为了企业的核心资产之一。然而&#xff0c;随着数据量的不断增长和应用场景的不断扩大&#xff0c;如何保证数据的一致性成为了一个重要的挑战。数据一致性不仅关系到系统的正确性和可靠性&#xff0c;也直接影响到用户的体验和企业的业…

图像绘制-线段、矩形、圆形、椭圆等

在实际运用中&#xff0c;我们会在图片上添加一些图形&#xff0c;比如目标检测时在物体周围画个矩形框&#xff0c;人脸识别中将人脸的关键点用点&#xff08;圆形&#xff09;标出来。 OpenCV常用的形状绘制方法&#xff1a; 线段的绘制 线段的绘制是使用cv2.line(img, pt…

C++QT day11

绘制时钟 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent>//绘制事件类 #include <QDebug>//信息调试类 #include <QPainter>//画家类 #include <QTimer>//定时器类 #include <QTime> #include &…

积跬步致千里 || 可视化动图展示

可视化动图展示 目前只能在 jupyter notebook 中测试成功 %matplotlib notebook import numpy as np import matplotlib.pyplot as plt import timen 500 data np.random.normal(0,1,n)fig plt.figure() ax fig.add_subplot(111)fig.show() fig.canvas.draw()for i in ra…

网络编程-TCP协议(客户端和服务端)

需要了解UDP协议的&#xff0c;可以看往期文章 https://flypeppa.blog.csdn.net/article/details/133273416 TCP/IP参考模型 代码案例 服务端代码 package com.hidata.devops.paas.udp;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr…

Android之AMessage机制存/取原理(四十四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

Ribbon负载均衡器

两种&#xff1a; 1.1 集中式负载均衡&#xff0c;服务端负载均衡 硬件 nginx 轮询、负载、哈希、随机、权重 为什么要做负载均衡&#xff1f; 1.2 客户端负载均衡器 用客户端 负载均衡器 很多机制可以自定义 小知识&#xff1a;不想让别人调自己&#xff0c;只想用别人的…

似然和概率

前言 高斯在处理正态分布的首次提出似然&#xff0c;后来英国物理学家&#xff0c;费歇尔 概率是抛硬币之前&#xff0c;根据环境推断概率 似然则相反&#xff0c;根据结果推论环境 P是关于x的函数&#xff0c;比如x为正面朝上的结果&#xff0c;或者反面朝上的结果&#xf…

C语言连接MySQL并执行SQL语句(hello world)

1.新建一个控制台项目 参考【VS2022 和 VS2010 C语言控制台输出 Hello World】VS2022 和 VS2010 C语言控制台输出 Hello World_vs2022源文件在哪_西晋的no1的博客-CSDN博客 2.安装MySQL 参考【MySQL 8.0.34安装教程】MySQL 8.0.34安装教程_西晋的no1的博客-CSDN博客 3.复制MySQ…

Unity Bolt模块间通信

使用Bolt无代码设计开发的时候&#xff0c;我们不能简单的认为只需要一个FlowMachine就可以完成所有流程的开发。我们需要不同的模块进行拆分&#xff0c;以便更好的管理和协作。这就需要不同模块之间的通信处理。经过研究与使用&#xff0c;将常用的通信方式总结如下&#xff…

基于微信小程序的校园餐饮配送系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言学生微信小程序端的主要功能有&#xff1a;配送员微信小程序端的主要功能有&#xff1a;商家微信小程序端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&am…