STM32项目开源:智能浇花养殖系统(代码+原理图+仿真)
·
一、前言
实物项目成品:

仿真项目成品:

哔哩哔哩开源视频链接(复制浏览器打开):
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);
}
}
六、包含内容

七、资料分享
资料获取:请查看主页介绍搜索或观看开源视频获取
更多推荐



所有评论(0)