一、前言

实物项目成品:
在这里插入图片描述

仿真项目成品:
在这里插入图片描述

哔哩哔哩开源视频链接(复制浏览器打开):
https://www.bilibili.com/video/BV1fThc6LEWR/?vd_source=10da4d04d580bd6b34f7298120737c50

(资料分享见文末)

二、项目功能简介

功能介绍:
(1)数据采集: 实时采集周围环境温度数据、土壤湿度数据、光照强度
(2)显示功能: 将采集到的环境数据显示在oled屏幕上,数据异常时屏幕闪烁提示
(3)控制功能: 当光照强度低于设定值时,开启补光灯;
温度高于设定值,开启风扇;蜂鸣器报警
土壤湿度低于设定值,开启水泵;蜂鸣器报警
(4)WIFI通信:环境数据上传到手机APP,可以设置阈值,开关设备
(5)自动模式:自动模式可根据阈值工作
(6)手动模式:手动模式可以自行操控各个设备的开关

三、PCB设计

在这里插入图片描述

四、原理图设计

在这里插入图片描述

五、程序设计

代码如下:

#include "sys.h"
#include "adc.h"
#include "delay.h"
#include "OLED.h"
#include "ds18b20.h"
#include "timer.h"
#include "gpio.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>


unsigned int  light=0;
unsigned char temperature=0;
unsigned int  soilMoisture; 
unsigned char setTempValue=35;       
unsigned int  setSoilMoisture=10;	
unsigned char setLightValue=20;       

bool mode = 0;               
bool shuaxin  = 0;
bool shanshuo = 0;

u8 buff[30];//参数显示缓存数组
u8 count;

unsigned char setn=0;

void displayLight(void)
{
		u16 test_adc=0;
		static u16 last_light[5] = {0}; // 保存最近5次的光照值,用于滑动平均滤波
		static u8 filter_index = 0;     // 当前滤波数组索引
		u16 sum = 0;                    // 用于计算平均值的总和
	  
	  // 增加采样次数,从20次增加到30次
	  test_adc = Get_Adc_Average(ADC_Channel_8,30);
}

void displaySoilMoisture(void)
{
	  float voltage = 0.0;

	   voltage = Get_Adc_Average(ADC_Channel_9,10)*3.3/4096;
		{
			sprintf((char*)buff,"%2d%%",soilMoisture);
			OLED_ShowString(2,11,(char*)buff);	//显示温度
			
		}
}

void displayTemperature(void)
{
		temperature=ReadTemperature();
	 
				 sprintf((char*)buff,"%2dC",temperature);
				OLED_ShowString(1,11,(char*)buff);	
}


void keyscan(void)
{
	if(KEY1 == 0)
	{
	 	delay_ms(20);
		if(RELAY2==1)delay_ms(50);
		if(KEY1 == 0)
		{
		 	while(KEY1 == 0);
			if(setn == 0)
			 {
				  mode = !mode;
					 if(mode==0)
					  {
						  OLED_ShowChinese(4,6,19);
						  OLED_ShowChinese(4,7,20);
					  }
					  else 
					  {
						  RELAY1=0;  
						  RELAY2=0;  
						  RELAY3=0;  
						  OLED_ShowChinese(4,6,21);
						  OLED_ShowChinese(4,7,22);
					  }
			 }
		}
	}
	if(KEY2 == 0)
	{
	 	delay_ms(20);
		
		if(KEY2 == 0)
		{
			while(KEY2 == 0);
			 BEEP=0;
			if(mode==0)
			{
				setn ++;
				 RELAY1=0;  
				RELAY2=0;  
				RELAY3=0; 
				
			}
			if(setn == 1)
			{
				OLED_Clear();
			}
			if(mode==1)
			{
				RELAY3=~RELAY3;;
			}
			
			 if(setn == 1||setn == 2||setn == 3)
			 {
				 OLED_ShowChinese(1,3,16);
				 OLED_ShowChinese(1,6,17);
				 
				//显示"环境温度:"
				OLED_ShowChinese(2, 1, 0);
				OLED_ShowChinese(2, 2, 1);
				OLED_ShowChinese(2, 3, 2);
				OLED_ShowChinese(2, 4, 3);	
				OLED_ShowChar(2, 9, ':');
				
				//显示"土壤温度:"
				OLED_ShowChinese(3, 1, 4);
				OLED_ShowChinese(3, 2, 5);
				OLED_ShowChinese(3, 3, 6);
				OLED_ShowChinese(3, 4, 7);	
				OLED_ShowChar(3, 9, ':');

				//显示"光照强度:"
				OLED_ShowChinese(4, 1, 8);
				OLED_ShowChinese(4, 2, 9);	
				OLED_ShowChinese(4, 3, 10);
				OLED_ShowChinese(4, 4, 11);	
				OLED_ShowChar(4, 9, ':');
			 }
			
			 {OLED_Clear();
					setn = 0;
				//显示"环境温度:"
	OLED_ShowChinese(1, 1, 0);
	OLED_ShowChinese(1, 2, 1);
	OLED_ShowChinese(1, 3, 2);
	OLED_ShowChinese(1, 4, 3);	
	OLED_ShowChar(1, 9, ':');
	
	//显示"土壤温度:"
	OLED_ShowChinese(2, 1, 4);
	OLED_ShowChinese(2, 2, 5);
	OLED_ShowChinese(2, 3, 6);
	OLED_ShowChinese(2, 4, 7);	
	OLED_ShowChar(2, 9, ':');

	//显示"光照强度:"
	OLED_ShowChinese(3, 1, 8);
	OLED_ShowChinese(3, 2, 9);	
	OLED_ShowChinese(3, 3, 10);
	OLED_ShowChinese(3, 4, 11);	
	OLED_ShowChar(3, 9, ':');
				 
				
	//显示"工作模式:"
	OLED_ShowChinese(4,1,12);
	OLED_ShowChinese(4,2,13);
	OLED_ShowChinese(4,3,14);
	OLED_ShowChinese(4,4,15);
	OLED_ShowChar(4, 9, ':');
				 
					
				  if(mode==0)
					  {
						  OLED_ShowChinese(4,6,19);
						  OLED_ShowChinese(4,7,20);
					  }
					  else 
					  {
						  OLED_ShowChinese(4,6,21);
						  OLED_ShowChinese(4,7,22);
					  }
			 }
		}
	}
	if(KEY3 == 0)//加
	{
		delay_ms(20);//
		
		if(KEY3 == 0 )
		{
			while(KEY3 == 0);
			if(setn == 0 && mode==1)
			 {
					RELAY1=~RELAY1;
			 }
			if(setn == 2)
			 {
					if(setSoilMoisture<99)setSoilMoisture++;
			 }
			 if(setn == 1)
			 {
					if(setTempValue<99)setTempValue++;
			 }
			 if(setn == 3)
			 {
				 if(setLightValue<99)setLightValue++;
			 }
		}
	}
	
	if(KEY4 == 0)//减
	{
		delay_ms(20);//
		if(RELAY2==1)delay_ms(50);
		if(KEY4 == 0 )
		{
			while(KEY4 == 0);
			if(setn == 0 && mode==1)
			 {
					RELAY2=~RELAY2;
			 }
      if(setn == 2)
			 {
					if(setSoilMoisture>0)setSoilMoisture--;
			 }
			 if(setn == 1)
			 {
					if(setTempValue>0)setTempValue--;
			 }
			 if(setn == 3)
			 {
				 if(setLightValue>0)setLightValue--;
			 }
		}
	}
}

// 删除WIFI数据发送接收函数UsartSendReceiveData

int main(void)
{	
	delay_init();	   
	NVIC_Configuration();
	delay_ms(500);      
	DS18B20_GPIO_Init();
	Adc_Init();          
	KEY_GPIO_Init();  
     
	DS18B20_Init();
	ReadTemperature();
	OLED_Init();				//OLED初始化
	OLED_ShowString(2,1,"   Loading...   ");	
	delay_ms(500);
	OLED_Clear();		
	// 添加调试信息,确认清屏后程序继续执行
	OLED_ShowString(2,1,"   Starting...   ");
	delay_ms(1000);
	OLED_Clear();
	
	//显示"环境温度:"
	OLED_ShowChinese(1, 1, 0);
	OLED_ShowChinese(1, 2, 1);
	OLED_ShowChinese(1, 3, 2);
	OLED_ShowChinese(1, 4, 3);	
	OLED_ShowChar(1, 9, ':');
	
	//显示"土壤温度:"
	OLED_ShowChinese(2, 1, 4);
	OLED_ShowChinese(2, 2, 5);
	OLED_ShowChinese(2, 3, 6);
	OLED_ShowChinese(2, 4, 7);	
	OLED_ShowChar(2, 9, ':');

	//显示"光照强度:"
	OLED_ShowChinese(3, 1, 8);
	OLED_ShowChinese(3, 2, 9);	
	OLED_ShowChinese(3, 3, 10);
	OLED_ShowChinese(3, 4, 11);	
	OLED_ShowChar(3, 9, ':');
				 
				
	//显示"工作模式:"
	OLED_ShowChinese(4,1,12);
	OLED_ShowChinese(4,2,13);
	OLED_ShowChinese(4,3,14);
	OLED_ShowChinese(4,4,15);
	OLED_ShowChar(4, 9, ':');
				 
	 
	TIM3_Init(99,719);  
	//Tout = ((arr+1)*(psc+1))/Tclk ; 
		
	while(1)
	{  
		keyscan();
		if(setn == 0)
		{
			if(shuaxin == 1)
			{
				shuaxin = 0;
				displayLight();   
				displaySoilMoisture(); 
				displayTemperature(); 
		
				if(mode==0)   
				{
					if(light<=setLightValue)RELAY1=1;else RELAY1=0;             
					if(soilMoisture<=setSoilMoisture)RELAY2=1;else RELAY2=0;       
					if(temperature>=setTempValue)RELAY3=1;else RELAY3=0;         
					if(light<=setLightValue||temperature>=setTempValue||soilMoisture<=setSoilMoisture)BEEP=1;else BEEP=0;  
					OLED_ShowChinese(4,6,19);
					OLED_ShowChinese(4,7,20);
				}
				else
				{
					BEEP=0;
					OLED_ShowChinese(4,6,21);
					OLED_ShowChinese(4,7,22);
				}
			}
		}

		delay_ms(20);
	}	
}

六、包含内容

在这里插入图片描述

七、资料分享

资料获取:请查看主页介绍搜索或观看开源视频获取

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐