1、内容简介:通过STM32F103芯片驱动OLED显示环境温湿度、土壤温湿度和光照强度,并可以通过按键控制温湿度的预设值进行报警,当湿度小于预设值时开启水泵,并将数据上传到阿里云和手机APP。
2、硬件选型:主控:STM32F103C8T6
OLED:四脚OLED
温湿度检测:DHT11
土壤湿度:土壤湿度检测模块
WIFI:ESP8266-01S
3、主要程序
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "sys.h"
#include "OLED.h"
#include "DHT11.h"
#include "AD.h"
#include "Key.h"
#include <stdbool.h>
#include "MyUSART.h"
#include "esp.h"
#include "BH1750.h"
#define ADC1_DR_Address ((uint32_t)0x4001244C)//ADC的外设地址
int temperature,Humidity;
int soilHumidity;
float LightLux;
uint8_t MAN=0;
uint8_t OM,OX,Key_Num,Key1_Num,Key2_Num;
u16 WD=0,WD1=0,SI=0,SI1=0;
u16 temp=0,temp1=0;
float Light=10;
void BG_Init(void);
void LED_Init(void);
void Motor_Init(void);
void Fee_Init(void);
void Init_Pan(void);
int main(void)
{
uint8_t wendu,shidu;
int moisture;
MyUSART_Init();//串口初始化
Esp_Init();//esp初始化
BH1750_Init(); //BH1750初始化
OLED_Init();
DHT11_INIT();
BG_Init();
LED_Init();
Motor_Init();
Fee_Init();
Init_Pan();
Key_Init();
Adc_Init();
WD1=temp/10%10;
WD=temp%10;
SI1=temp1/10%10;
SI=temp1%10;
while (1)
{
Esp_PUB();
Read_DHT_Data(&wendu,&shidu);
temperature=wendu;
Humidity=shidu;
if (!i2c_CheckDevice(BH1750_Addr))
{
Light = LIght_Intensity(); //获取光照强度
}
LightLux=Light;
moisture=ADC_GetConversionValue(ADC1)*3.3/4096*10;
soilHumidity=moisture;
Key_Num=Key_GetNum();
Key1_Num=Key1_GetNum();
Key2_Num=Key2_GetNum();
if(Key_Num == 0)//主页面
{
OX=0;
OM++;
if(OM == 1 )
{
//光照
// OLED_Clear();//清屏一次
OLED_ShowCHINESE(1,1,14,15);
OLED_ShowString(1,5,":");
//空气温湿度
OLED_ShowCHINESE(2,1,0,2);//静态显示部分
OLED_ShowString(2,7,":");
OLED_ShowCHINESE(2,6,7,7);//OLED显示摄氏度
OLED_ShowString(2,16,"%");
//土壤湿度
OLED_ShowString(3,1,"Soil");
OLED_ShowString(3,5,":");
//光照阈值设置
OLED_ShowCHINESE(4,1,14,15);
OLED_ShowString(4,5,":");
}
OLED_ShowNum(1,8,Light,4);
OLED_ShowNum(2,8,wendu,2);//显示温度
OLED_ShowNum(2,14,shidu,2);//显示湿度
OLED_ShowNum(3,7,moisture,2);
//光照阈值设置
OLED_ShowNum(4,7, WD1,1);//显示光照
OLED_ShowNum(4,8,WD,1);
// OLED_ShowNum(3,5,CO2,2);
}
//设置湿度阈值
if(Key_Num == 1)
{
OM=0;
OX++;
if(OX == 1)
{
OLED_Clear();//清屏一次
OLED_ShowString(1,1,"Soil");
OLED_ShowString(1,5,":");
}
OLED_ShowNum(1,7, SI1,1);//显示湿度
OLED_ShowNum(1,8,SI,1);//显示湿度
}
//温度阈值
if(Key1_Num == 2&&Key_Num == 0)//加
{
WD+=1;
if(WD > 9)
{
WD=0;
WD1++;
}
}
if(Key2_Num == 3&&Key_Num == 0)//阈值设置(温度减)
{
if(WD==0)
{
WD1--;
WD=9;
}
else
{
WD--;
}
}
//湿度阈值
if(Key1_Num == 2&&Key_Num == 1)//加
{
SI+=1;
if(SI > 9)
{
SI=0;
SI1++;
}
}
if(Key2_Num == 3&&Key_Num == 1)//阈值设置(湿度减)
{
if(SI==0)
{
SI1--;
SI=9;
}
else
{
SI--;
}
}
//报警
if(Light<20||Light<WD1*10+WD)
{
GPIO_SetBits(GPIOA, GPIO_Pin_4);//开补光灯
}
if(Light>20&&Light>WD1*10+WD)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_4);//关补光灯
}
if(moisture<20||moisture<SI1*10+SI)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13);//湿度报警,小灯闪烁
Delay_ms(10);
GPIO_SetBits(GPIOC, GPIO_Pin_13);
GPIO_SetBits(GPIOA,GPIO_Pin_3);//开灌溉
}
if(moisture>20&&moisture>SI1*10+SI)
{
GPIO_SetBits(GPIOC, GPIO_Pin_13);//关小灯
GPIO_ResetBits(GPIOA,GPIO_Pin_3);//关灌溉
}
if(wendu >30)
{
GPIO_SetBits(GPIOA, GPIO_Pin_6);//温度大于30,开风扇
}
if(wendu<30)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_6);//温度小于30,开风扇
}
}
}