【32项目】基于stm32f103c8t6WIFI远程监控智慧农业大棚(含完整代码)

目录

前言

设计背景

设计原理

所需材料

JW01二氧化碳传感器介绍

YL-69土壤湿度传感器介绍

PCB及原理图

部分代码(完整代码见文章末尾)


前言

随着农业现代化的发展,智慧农业的概念越来越受到重视。智慧农业利用物联网、大数据、人工智能等技术,实现对农业生产过程的智能化管理,提高农业生产效率和效益。

本人每天会不定时更新一些项目。

设计背景

随着人口的不断增长和气候变化的不确定性,传统的农业生产模式已经无法满足日益增长的食品需求。智能农业大棚作为一种现代化的农业生产方式,借助先进的传感技术、自动化控制和远程监测,能够实现对植物生长环境的精准调控,提高农作物的产量和质量,同时减少资源浪费和环境污染。

本研究以STM32微控制器为核心,结合先进的传感器技术和云平台连接,设计了一套智能农业大棚管理系统。该系统不仅能够实时监测大棚内的环境参数,如温湿度、光照强度和土壤状况,还能通过自动化控制实现对风扇、水泵和步进电机等设备的精准操作。通过远程监控和控制,用户可以随时随地了解大棚内部情况,并进行远程调节,使得农业生产更加智能高效。

设计原理

智能农业大棚管理系统的设计基于STM32微控制器,目的在实现对大棚环境的全面监测和自动化控制。系统涉及硬件和软件两个层面,下面将分别介绍这两个方面的设计思路。

(1)硬件部分

硬件设计是系统的基础,主要包括STM32微控制器、传感器模块、执行模块以及显示模块。

首先,选择STM32微控制器作为系统的核心,由于其低功耗、高性能的特点,能够满足大棚管理系统对实时性和稳定性的要求。同时,STM32具有丰富的外设接口,便于与各种传感器和执行模块进行连接。

传感器模块包括环境温湿度传感器、土壤温湿度传感器、光照强度传感器和二氧化碳传感器。这些传感器通过模拟或数字接口与STM32连接,实时采集大棚内的环境数据。

执行模块主要包括风扇、水泵和步进电机。这些模块通过数字输出口与STM32连接,实现对大棚内环境的精准控制。

最后,为了方便用户了解系统运行状态,采用OLED屏幕进行数据显示。用户可以通过屏幕直观地查看大棚内的温湿度、光照强度等信息。

(2)软件部分

软件设计是系统的智能核心,主要包括检测功能、显示功能、控制功能、手动模式、自动模式、报警功能、阈值调节、接入云平台和远程控制。

检测功能通过编程实现对各种传感器的数据采集,确保系统能够及时准确地获取大棚内的环境信息。

显示功能通过STM32控制OLED屏幕,将检测到的环境数据实时显示,使用户能够直观地了解大棚内部状况。

控制功能通过编写控制算法,实现对风扇、水泵和步进电机等执行模块的精准控制,以满足大棚内环境的需求。

手动模式通过手机APP或小程序,用户可以远程手动控制设备的运行状态,灵活应对特殊情况。

自动模式通过设定预设的阈值,系统能够自动判断环境状态,实现自动控制设备的开启和关闭,从而维持大棚内的理想环境。

报警功能通过蜂鸣器进行提示,当传感器数据超出设定的阈值范围时,系统及时报警,提醒用户注意。

阈值调节通过按键手动调节传感器的阈值,使系统更加灵活适应不同的种植需求。

接入云平台通过ESP8266 WIFI模块连接网络,实现数据传输和接入机智云服务器,为系统提供更广泛的监控和控制手段。

远程控制通过APP,用户可以随时随地查看传感器数据,并进行远程控制,实现对大棚的全程管理。

所需材料

0.96OLED模块_4P1
风扇1
串口1
水泵1
JW01二氧化碳传感器1
YL-69土壤湿度传感器1
按键11
按键21
按键31
按键41
4.7kΩ3
GL5528(10-20)光敏电阻1
10kΩ1
2kΩ2
20kΩ2
20Ω2
150Ω1
继电器2
DHT11温湿度传感器1
S80503
ULN2003A1
步进电机1
STM32F103C8T6核心板1
DS18B20温度传感器1

JW01二氧化碳传感器介绍

JW01 二氧化碳传感器是一种用于检测空气中二氧化碳浓度的传感器。它通常用于以下应用:

室内空气质量监测:监测室内二氧化碳浓度,以确保空气质量良好,并提醒用户通风。
温室气体监测: 监测温室中的二氧化碳浓度,以优化植物生长条件。
工业过程控制: 监测工业过程中的二氧化碳浓度,以确保安全和效率。

JW01 二氧化碳传感器的工作原理是基于非分散红外 (NDIR) 技术。NDIR 技术利用二氧化碳对特定波长的红外光的吸收特性来检测二氧化碳浓度。

JW01 二氧化碳传感器的主要特点:

高精度:能够准确测量空气中的二氧化碳浓度。
低功耗: 功耗低,适合电池供电的应用。
快速响应: 能够快速响应二氧化碳浓度变化。
稳定性好:具有良好的长期稳定性,能够长时间可靠地工作。
体积小巧:体积小巧,易于安装。

JW01 二氧化碳传感器的应用:

智能家居: 用于监测室内空气质量,并提醒用户通风。
智能农业:用于监测温室中的二氧化碳浓度,以优化植物生长条件。
工业自动化:用于监测工业过程中的二氧化碳浓度,以确保安全和效率。
医疗保健: 用于监测患者呼出的二氧化碳浓度,以诊断和治疗疾病。

JW01 二氧化碳传感器是一种可靠且实用的传感器,可用于各种应用。
 

引脚功能
+5电源正极
GND电源负极
ARXD
BTXD

YL-69土壤湿度传感器介绍

YL-69 土壤湿度传感器是一种用于测量土壤水分含量的传感器。它通常用于以下应用:

  • 农业: 监测土壤水分,以优化灌溉时间和水量,提高作物产量。
  • 园艺: 监测盆栽植物的土壤水分,以确保植物获得充足的水分。
  • 环境监测: 监测土壤水分,以评估土壤水分状况和水资源管理。

YL-69 土壤湿度传感器的工作原理是基于电阻式测量原理。传感器包含两个电极,当土壤水分含量较高时,电极之间的电阻较低,反之则较高。传感器通过测量电极之间的电阻来判断土壤水分含量。

YL-69 土壤湿度传感器的主要特点:

  • 高灵敏度: 能够准确测量土壤水分含量的细微变化。
  • 响应速度快: 能够快速响应土壤水分含量的变化。
  • 耐用性强: 能够承受恶劣的土壤环境。
  • 体积小巧: 体积小巧,易于安装。
  • 价格低廉: 价格低廉,适合大规模应用。

YL-69 土壤湿度传感器的应用:

  • 智能灌溉系统: 用于监测土壤水分,并自动控制灌溉系统,以优化灌溉时间和水量。
  • 温室控制系统: 用于监测土壤水分,并自动控制温室环境,以确保植物获得最佳生长条件。
  • 土壤水分监测系统: 用于监测土壤水分,以评估土壤水分状况和水资源管理。

YL-69 土壤湿度传感器是一种可靠且实用的传感器,可用于各种土壤水分监测应用。

PCB及原理图

部分代码(完整代码见文章末尾)

main.c部分

#include "stm32f10x.h"                  // Device header
#include "iwdg.h"
#include "adcx.h"
#include "ldr.h"
#include "oled.h"
#include "dht11.h"
#include "led.h"
#include "key.h"
#include "tim2.h"   
#include "tim3.h"   
#include "usart3.h"   
#include "usart.h"
#include "yl_69.h"
#include "motor.h"
#include "sensormodules.h"
#include "gizwits_product.h"
#include "flash.h"


#define KEY_1	1
#define KEY_2	2
#define KEY_3	3
#define KEY_4	4

#define FLASH_START_ADDR	0x0801f000	//写入的起始地址

SensorModules sensorData;	//声明传感器数据结构体变量
SensorThresholdValue Sensorthreshold;	//声明传感器阈值结构体变量

uint8_t menu = 1;	//显示菜单变量
uint8_t OLED_Clear_Flag;	//阈值设置界面的清屏标志位
uint8_t mode = 0;	//系统模式

enum 
{
	display_page1 = 1,
	display_page2,
	settingsPage
	
}MenuPages;

/**
  * @brief  显示菜单1的固定内容
  * @param  无
  * @retval 无
  */
void OLED_Menu1(void)
{
	//显示系统名
	OLED_ShowChinese(1, 1, 0);
	OLED_ShowChinese(1, 2, 1);
	OLED_ShowChinese(1, 3, 2);
	OLED_ShowChinese(1, 4, 3);
	OLED_ShowChinese(1, 5, 4);
	OLED_ShowChinese(1, 6, 5);
	OLED_ShowChinese(1, 7, 6);
	OLED_ShowChinese(1, 8, 7);
	
	//显示“系统模式:”
	OLED_ShowChinese(2, 1, 6);
	OLED_ShowChinese(2, 2, 7);
	OLED_ShowChinese(2, 3, 19);
	OLED_ShowChinese(2, 4, 20);	
	OLED_ShowChar(2, 9, ':');
	
	//显示”光照强度:  Lux“
	OLED_ShowChinese(3, 1, 15);
	OLED_ShowChinese(3, 2, 16);	
	OLED_ShowChinese(3, 3, 28);
	OLED_ShowChinese(3, 4, 29);	
	OLED_ShowChar(3, 9, ':');
	OLED_ShowString(3, 14, "Lux");
	
	//显示“二氧化碳: ”
	OLED_ShowChinese(4, 1, 24);
	OLED_ShowChinese(4, 2, 25);
	OLED_ShowChinese(4, 3, 26);
	OLED_ShowChinese(4, 4, 27);
	OLED_ShowChar(4, 9, ':');
	OLED_ShowString(4, 14, "ppm");
}

/**
  * @brief  显示菜单2的固定内容
  * @param  无
  * @retval 无
  */
void OLED_Menu2(void)
{
	//显示“环境温度:  C”
	OLED_ShowChinese(1, 1, 13);
	OLED_ShowChinese(1, 2, 14);
	OLED_ShowChinese(1, 3, 8);
	OLED_ShowChinese(1, 4, 9);	
	OLED_ShowChar(1, 9, ':');
	OLED_ShowChar(1, 12, 'C');
	
	//显示“环境湿度:  %”
	OLED_ShowChinese(2, 1, 13);
	OLED_ShowChinese(2, 2, 14);
	OLED_ShowChinese(2, 3, 10);
	OLED_ShowChinese(2, 4, 9);	
	OLED_ShowChar(2, 9, ':');
	OLED_ShowChar(2, 12, '%');		
	
	//显示“土壤温度:  C”
	OLED_ShowChinese(3, 1, 11);
	OLED_ShowChinese(3, 2, 12);
	OLED_ShowChinese(3, 3, 8);
	OLED_ShowChinese(3, 4, 9);	
	OLED_ShowChar(3, 9, ':');
	OLED_ShowChar(3, 12, 'C');		
	
	//显示“土壤湿度:  %”
	OLED_ShowChinese(4, 1, 11);
	OLED_ShowChinese(4, 2, 12);
	OLED_ShowChinese(4, 3, 10);
	OLED_ShowChinese(4, 4, 9);	
	OLED_ShowChar(4, 9, ':');
	OLED_ShowChar(4, 12, '%');	
}

/**
  * @brief  显示菜单1的传感器数据
  * @param  无
  * @retval 无
  */
void SensorDataDisplay1(void)
{
	//显示系统状态数据
	if (!mode)
	{
		OLED_ShowChinese(2, 6, 21);
		OLED_ShowChinese(2, 7, 22);		
	}
	else
	{
		OLED_ShowChinese(2, 6, 23);
		OLED_ShowChinese(2, 7, 22);			
	}
	
	//显示光照强度数据
	OLED_ShowNum(3, 10, sensorData.lux, 4);
	
	//显示CO2浓度数据
	OLED_ShowNum(4, 10, sensorData.CO2, 4);
}

/**
  * @brief  显示菜单2的传感器数据
  * @param  无
  * @retval 无
  */
void SensorDataDisplay2(void)
{
	//显示环境温度数据
	OLED_ShowNum(1, 10, sensorData.temp, 2);
	
	//显示环境湿度数据
	OLED_ShowNum(2, 10, sensorData.humi, 2);
	
	//显示土壤温度数据
	OLED_ShowNum(3, 10, sensorData.soilTemp, 2);
	
	//显示土壤湿度数据
	OLED_ShowNum(4, 10, sensorData.soilHumi, 2);
}

/**
  * @brief  显示阈值设置界面1的固定内容
  * @param  无
  * @retval 无
  */
void OLED_settingsPage1(void)
{
	//显示“环境温度:”
	OLED_ShowChinese(1, 2, 13);
	OLED_ShowChinese(1, 3, 14);
	OLED_ShowChinese(1, 4, 8);
	OLED_ShowChinese(1, 5, 9);	
	OLED_ShowChar(1, 11, ':');

	//显示“环境湿度:”
	OLED_ShowChinese(2, 2, 13);
	OLED_ShowChinese(2, 3, 14);
	OLED_ShowChinese(2, 4, 10);
	OLED_ShowChinese(2, 5, 9);	
	OLED_ShowChar(2, 11, ':');
	
	
	//显示“土壤温度:”
	OLED_ShowChinese(3, 2, 11);
	OLED_ShowChinese(3, 3, 12);
	OLED_ShowChinese(3, 4, 8);
	OLED_ShowChinese(3, 5, 9);	
	OLED_ShowChar(3, 11, ':');
	
	
	//显示“土壤湿度:”
	OLED_ShowChinese(4, 2, 11);
	OLED_ShowChinese(4, 3, 12);
	OLED_ShowChinese(4, 4, 10);
	OLED_ShowChinese(4, 5, 9);	
	OLED_ShowChar(4, 11, ':');
}

/**
  * @brief  显示阈值设置界面2的固定内容
  * @param  无
  * @retval 无
  */
void OLED_settingsPage2(void)
{
	//显示”光照强度:“
	OLED_ShowChinese(1, 2, 15);
	OLED_ShowChinese(1, 3, 16);	
	OLED_ShowChinese(1, 4, 28);
	OLED_ShowChinese(1, 5, 29);	
	OLED_ShowChar(1, 11, ':');
	
	//显示“二氧化碳:”
	OLED_ShowChinese(2, 2, 24);
	OLED_ShowChinese(2, 3, 25);
	OLED_ShowChinese(2, 4, 26);
	OLED_ShowChinese(2, 5, 27);
	OLED_ShowChar(2, 11, ':');	
}

/**
  * @brief  显示阈值界面1的传感器数据
  * @param  无
  * @retval 无
  */
void settingsThresholdDisplay1(void)
{
	//显示环境温度阈值数据
	OLED_ShowNum(1, 13, Sensorthreshold.tempValue, 2);
	
	//显示环境湿度阈值数据
	OLED_ShowNum(2, 13, Sensorthreshold.humiValue, 2);
	
	//显示土壤温度阈值数据
	OLED_ShowNum(3, 13, Sensorthreshold.soilTempValue, 2);
	
	//显示土壤湿度阈值数据
	OLED_ShowNum(4, 13, Sensorthreshold.soilHumiValue, 2);
}

/**
  * @brief  显示阈值界面2的传感器数据
  * @param  无
  * @retval 无
  */
void settingsThresholdDisplay2(void)
{
	//显示光照强度阈值数据
	OLED_ShowNum(1, 13, Sensorthreshold.luxValue, 4);
	
	//显示CO2浓度阈值数据
	OLED_ShowNum(2, 13, Sensorthreshold.CO2Value, 4);
}

/**
  * @brief  显示阈值界面的选择符号
  * @param  num 为显示的位置
  * @retval 无
  */
void OLED_Option(uint8_t num)
{
	switch(num)
	{
		case 1:	
			OLED_ShowChar(1,1,'>');
			OLED_ShowChar(2,1,' ');
			OLED_ShowChar(3,1,' ');
			OLED_ShowChar(4,1,' ');
			break;
		case 2:	
			OLED_ShowChar(1,1,' ');
			OLED_ShowChar(2,1,'>');
			OLED_ShowChar(3,1,' ');
			OLED_ShowChar(4,1,' ');
			break;
		case 3:	
			OLED_ShowChar(1,1,' ');
			OLED_ShowChar(2,1,' ');
			OLED_ShowChar(3,1,'>');
			OLED_ShowChar(4,1,' ');
			break;
		case 4:	
			OLED_ShowChar(1,1,' ');
			OLED_ShowChar(2,1,' ');
			OLED_ShowChar(3,1,' ');
			OLED_ShowChar(4,1,'>');
			break;
		case 5:	
			OLED_ShowChar(1,1,'>');
			OLED_ShowChar(2,1,' ');
			OLED_ShowChar(3,1,' ');
			OLED_ShowChar(4,1,' ');
			break;
		case 6:	
			OLED_ShowChar(1,1,' ');
			OLED_ShowChar(2,1,'>');
			OLED_ShowChar(3,1,' ');
			OLED_ShowChar(4,1,' ');
			break;
		default: break;
	}
}

/**
  * @brief  根据标志位控制步进电机的运行
  * @param  无
  * @retval 无
  */
void MotorOperation(void)
{
	if (motorFlag == 1)
	{
		MOTOR_Direction_Angle(1, 0, 90, 1);
		MOTOR_STOP();
		motorFlag = 0;
	}
	else if (motorFlag == 2)
	{
		MOTOR_Direction_Angle(0, 0, 90, 1);
		MOTOR_STOP();
		motorFlag = 0;		
	}

}

/**
  * @brief  记录阈值界面下按KEY1的次数
  * @param  无
  * @retval 返回次数
  */
uint8_t SetSelection(void)
{
	static uint8_t count = 1;
	if(KeyNum == KEY_1)
	{
		KeyNum = 0;
		count++;
		if (count == 5)
		{
			OLED_Clear();
		}
		else if (count > 6)
		{
			OLED_Clear();
			count = 1;
		}
	}
	return count;
}

/**
  * @brief  对阈值界面的传感器阈值进行修改
  * @param  num 为当前用户需要更改的传感器阈值位置
  * @retval 无
  */
void ThresholdModification(uint8_t num)
{
	switch (num)
	{
		case 1:
			if (KeyNum == 3)
			{
				KeyNum = 0;
				Sensorthreshold.tempValue++;
				if (Sensorthreshold.tempValue > 99)
				{
					Sensorthreshold.tempValue = 1;
				}
			}
			else if (KeyNum == 4)
			{
				KeyNum = 0;
				Sensorthreshold.tempValue--;
				if (Sensorthreshold.tempValue < 1)
				{
					Sensorthreshold.tempValue = 99;
				}				
			}
			break;
		case 2:
			if (KeyNum == 3)
			{
				KeyNum = 0;
				Sensorthreshold.humiValue++;
				if (Sensorthreshold.humiValue > 99)
				{
					Sensorthreshold.humiValue = 1;
				}
			}
			else if (KeyNum == 4)
			{
				KeyNum = 0;
				Sensorthreshold.humiValue--;
				if (Sensorthreshold.humiValue < 1)
				{
					Sensorthreshold.humiValue = 99;
				}				
			}			
			break;
		case 3:
			if (KeyNum == 3)
			{
				KeyNum = 0;
				Sensorthreshold.soilTempValue++;
				if (Sensorthreshold.soilTempValue > 99)
				{
					Sensorthreshold.soilTempValue = 1;
				}
			}
			else if (KeyNum == 4)
			{
				KeyNum = 0;
				Sensorthreshold.soilTempValue--;
				if (Sensorthreshold.soilTempValue < 1)
				{
					Sensorthreshold.soilTempValue = 99;
				}				
			}
			break;
		case 4:
			if (KeyNum == 3)
			{
				KeyNum = 0;
				Sensorthreshold.soilHumiValue++;
				if (Sensorthreshold.soilHumiValue > 99)
				{
					Sensorthreshold.soilHumiValue = 1;
				}
			}
			else if (KeyNum == 4)
			{
				KeyNum = 0;
				Sensorthreshold.soilHumiValue--;
				if (Sensorthreshold.soilHumiValue < 1)
				{
					Sensorthreshold.soilHumiValue = 99;
				}				
			}
			break;
		case 5:
			if (KeyNum == 3)
			{
				KeyNum = 0;
				Sensorthreshold.luxValue += 10;
				if (Sensorthreshold.luxValue > 2000)
				{
					Sensorthreshold.luxValue = 0;
				}
			}
			else if (KeyNum == 4)
			{
				KeyNum = 0;
				Sensorthreshold.luxValue -= 10;
				if (Sensorthreshold.luxValue > 2000)
				{
					Sensorthreshold.luxValue = 2000;
				}				
			}			
			break;
		case 6:
			if (KeyNum == 3)
			{
				KeyNum = 0;
				Sensorthreshold.CO2Value += 10;
				if (Sensorthreshold.CO2Value > 2000)
				{
					Sensorthreshold.CO2Value = 0;
				}
			}
			else if (KeyNum == 4)
			{
				KeyNum = 0;
				Sensorthreshold.CO2Value -= 10;
				if (Sensorthreshold.CO2Value > 2000)
				{
					Sensorthreshold.CO2Value = 2000;
				}				
			}
			break;	
		default: break;		
	}
}

/**
  * @brief  获取二氧化碳数据
  * @param  *data 为数据传参
  * @retval 无
  */
void CO2GetData(uint16_t *data)
{
	if (Usart3_RxFlag == 1)
	{
		Usart3_RxFlag = 0;
		*data = Usart3_RxPacket[1] * 256 + Usart3_RxPacket[2];
	}
}

/**
  * @brief  传感器数据扫描
  * @param  无
  * @retval 无
  */
void SensorScan(void)
{
	DHT11_Read_Data(&sensorData.humi, &sensorData.temp);
	YL69_PercentageData(&sensorData.soilHumi);
	LDR_LuxData(&sensorData.lux);
	CO2GetData(&sensorData.CO2);
	DS18B20_Read_Temp(&sensorData.soilTemp);
}



int main(void)
{
	ADCX_Init();
	Timer2_Init(9,14398);
	Uart2_Init(9600);
	Uart1_Init(115200);
	Uart3_Init();
	IWDG_Init();	//初始化看门狗
	
	LDR_Init();
	YL69_Init();
	OLED_Init();
	DHT11_Init();
	LED_Init();
	Buzzer_Init();
	Relay_Init();
	MOTOR_Init();
	Key_Init();
	
	Sensorthreshold.CO2Value = FLASH_R(FLASH_START_ADDR);	//从指定页的地址读FLASH
	Sensorthreshold.luxValue = FLASH_R(FLASH_START_ADDR+2);	//从指定页的地址读FLASH
	Sensorthreshold.tempValue = FLASH_R(FLASH_START_ADDR+4);	//从指定页的地址读FLASH
	Sensorthreshold.humiValue = FLASH_R(FLASH_START_ADDR+6);	//从指定页的地址读FLASH
	Sensorthreshold.soilTempValue = FLASH_R(FLASH_START_ADDR+8);	//从指定页的地址读FLASH
	Sensorthreshold.soilHumiValue = FLASH_R(FLASH_START_ADDR+10);	//从指定页的地址读FLASH

	GENERAL_TIM_Init();
	userInit();		//完成机智云初始赋值
	gizwitsInit();	//开辟一个环形缓冲区
	
	while (1)
	{
		IWDG_ReloadCounter(); //重新加载计数值 喂狗
		SensorScan();	//获取传感器数据

		switch (menu)
		{
			case display_page1:
				SensorDataDisplay1();	//显示传感器1数据
				OLED_Menu1();	//显示主页面1固定信息
			
				if (KeyNum == KEY_2)	//是否按下按键2
				{
					KeyNum = 0;
					OLED_Clear();	//清屏
					menu = display_page2;	//menu = 主页面2
				}
				MotorOperation();
				break;
				
			case display_page2:		
				SensorDataDisplay2();	//显示传感器2数据		
				OLED_Menu2();	//显示主页面2固定信息
				if (KeyNum == KEY_2)	//是否按下按键2
				{
					KeyNum = 0;
					OLED_Clear();	//清屏
					menu = display_page1;	//menu = 主页面1
				}
				MotorOperation();
				break;
				
			case settingsPage:
				//从主页面跳转至设置页面时进行一次清屏
				if (OLED_Clear_Flag)
				{
					OLED_Clear_Flag = 0;	//清除清屏标志位
					OLED_Clear();	//清屏
				}
				ThresholdModification(SetSelection());	//调节传感器阈值
				
				OLED_Option(SetSelection());	//获取按键次数,从而判断“>”显示位置
			
				//按键次数小于等于4时,显示设置页面1
				if (SetSelection() <= 4)		
				{
					settingsThresholdDisplay1();	//显示传感器阈值1数据	
					OLED_settingsPage1();	//显示阈值设置界面1固定信息

				}
				else	//否则显示设置页面2
				{
					settingsThresholdDisplay2();	//显示传感器阈值2数据	
					OLED_settingsPage2();	//显示阈值设置界面2固定信息
				}
	
				if (KeyNum == KEY_2)	//判断用户是否按下退出按键
				{
					KeyNum = 0;
					OLED_Clear();	//清屏
					menu = display_page1;	//回到主页面1
					

					//存储修改的传感器阈值至flash内
					FLASH_W(FLASH_START_ADDR, Sensorthreshold.CO2Value, Sensorthreshold.luxValue,
							Sensorthreshold.tempValue, Sensorthreshold.humiValue,
							Sensorthreshold.soilTempValue, Sensorthreshold.soilHumiValue);
				}
				break;
			default: break;
		}
		userHandle();	//更新机智云数据点变量存储的值
		gizwitsHandle((dataPoint_t *)&currentDataPoint);	//数据上传至机智云					
	}
}

完整代码:

通过网盘分享的文件:4.程序.zip
链接: https://pan.baidu.com/s/1IxBrhDwdfaMWIZFxjigeYg?pwd=hubv 提取码: hubv

————由于博主还是大三的在读生,时间有限,每天会不定时更新一些学习经验和一些32的项目,如果喜欢就点点关注吧,大佬们!!!!————

### 回答1: STM32F103C8T6是一款32位微控制器,而温湿度模块是STM32F103C8T6的一个附加模块,用于测量周围环境的温度和湿度。 这个温湿度模块通常由温湿度传感器和与之匹配的模拟数字转换芯片组成。传感器通常是一种感知环境的物理变化(温度和湿度)的元件,而模数转换芯片则负责将传感器输出的模拟信号转换为数字信号,以便微控制器能够处理和使用这些数据。 STM32F103C8T6温湿度模块可以通过微控制器的引脚与其它外部元件进行连接。通过读取传感器输出的模拟信号,并使用模数转换芯片将其转换为数字信号,微控制器可以获取准确的温度和湿度数据。这些数据可以用于环境监测、自动控制系统、气象站等各种应用。 由于STM32F103C8T6是一款强大的微控制器,具有较高的性能和丰富的外设资源,因此它可以轻松地处理温湿度模块的读取和数据处理。此外,通过使用STM32的开发工具和库,可以简化开发流程,快速实现温湿度模块的功能。 总之,STM32F103C8T6温湿度模块是一种方便、可靠的方式来测量环境的温度和湿度。它能够提供准确的数据,并且与STM32微控制器的结合可以实现更广泛的应用。 ### 回答2: STM32F103C8T6是一种基于ARM Cortex-M3内核的微控制器。它具有丰富的外设和强大的处理能力,广泛应用于物联网、嵌入式系统等领域。 温湿度模块是一种传感器模块,用于实时检测环境的温度和湿度。它通常由温湿度传感器和接口电路组成。温湿度传感器可以采集环境的温度值和湿度值,并将这些信号转换为电信号通过接口电路输出。 对于STM32F103C8T6微控制器来说,要使用温湿度模块,我们首先需要通过IO口与模块进行通信。可以通过GPIO外设设置引脚的输入或输出模式,并通过SPI、I2C等接口通信协议与温湿度模块进行数据传输。 一般来说,温湿度模块会提供相应的驱动程序,我们可以将其集成到STM32F103C8T6的开发环境中。通过编写相应的代码,我们可以实现对温湿度模块的读取和控制。 在编程方面,在初始化时,我们需要设置相应的引脚模式和通信协议,然后可以通过读取传感器的数据寄存器来获取温湿度数值。我们还可以根据需求设置阈值,实现温度和湿度的报警功能。 总之,STM32F103C8T6与温湿度模块的结合可以实现对环境温湿度的实时监测,并根据需求进行相应的控制。这种组合在许多场景下非常有用,比如温室大棚、仓库、气候控制系统等。 ### 回答3: STM32F103C8T6是一款常见的STM32系列微控制器,它采用了Cortex-M3内核,具有丰富的外设和强大的处理能力。温湿度模块是一种用于测量环境温度和湿度的传感器模块,通常基于数字式温湿度传感器。 STM32F103C8T6可以通过GPIO口与温湿度模块进行连接。首先,通过I2C或SPI通信协议将温湿度模块连接到STM32微控制器。随后,可以通过读取温湿度模块的寄存器,获取当前环境的温度和湿度数值。 对于I2C连接方式,可以使用STM32的I2C外设来与温湿度模块进行通信。在STM32的代码中,我们可以配置I2C的相关寄存器,设置通信速率和地址等参数。通过发送读取温度和湿度的命令,然后通过接收数据的方式获取温湿度数值。接收到的数据可以进行处理和显示。 对于SPI连接方式,可以使用STM32的SPI外设来与温湿度模块进行通信。在STM32的代码中,我们可以配置SPI的相关寄存器,设置通信速率、数据位数和极性等参数。通过发送读取温度和湿度的命令,然后通过接收数据的方式获取温湿度数值。接收到的数据可以进行处理和显示。 总之,通过使用STM32F103C8T6微控制器与温湿度模块进行连接和通信,我们可以实现对环境温度和湿度的实时监测和获取。这样的模块在许多应用领域中具有广泛的用途,例如智能家居、气象检测、工业自动化等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樱娆π(准备保研版)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值