下面将自己最近做的一个简易的智能加湿系统进行分享
准备工作
一、硬件部分
加湿器 |
---|
继电器 |
蜂鸣器 |
水位传感器 |
OLED显示屏 |
DHT11温湿度传感器 |
按键若干 |
杜邦线若干 |
stm32c8t6最小系统板 |
图1 c8t6
图5 继电器
图6 dht11
图7 蜂鸣器
二、软件部分
1开发环境 烧入 调试工具
2 主程序
/************************************智能加湿器系统********************************
1、可以通过按键设置湿度阈值。
2、可以通过按键设置湿度阈值。
3、如果当前湿度低于阈值,则加湿器打开,否则加湿器断开。3、液晶屏幕可以实时显示湿度和湿度阈值。
4、如果当前湿度低于阈值,则加湿器打开,否则加湿器断开。3、液晶屏幕可以实时显示湿度和湿度阈值。
5、环境湿度测量范围:20%-95% RH,测量误差:±5%。5、具有容器水位检测功能。
6、环境湿度测量范围:20%~95%RH,测量误差:±5%。5、具有容器水位检测功能。
系统采用3个不同颜色的LED灯表示三种不同的湿度状态
湿度<40 40 < s湿度< 60 湿度 > 60
*******************************************************************************
Author:xiao yin
Date:2022-4
*******************************************************************************/
#include "stm32f10x.h"
#include "usart.h"
#include "oled.h"
#include "delay.h"
#include "led.h"
#include "adc.h"
#include "key.h"
#include "buzzer.h"
#include "string.h"
#include "jdq.h"
#include "dht11.h"
#include "water.h"
uint16_t i;
uint8_t k;
uint8_t kk;
uint8_t kkk; //温湿度变量相关
unsigned char keyvalue;//按键返回值
unsigned char flag;//界面切换标志
unsigned char flag_function = 0;//函数功能标志位
unsigned char interface_flag = 0; //在温湿度实现界面标志
unsigned char m_humidity = 20; //修改湿度变量 设置初值
unsigned char Relay = 1;// 继电器状态标志 默认为关 0开
unsigned char water = 20; //水位高度
unsigned char hfier = 1;// 加湿器状态标志 默认为关 0 开
extern unsigned int ad_value;
extern unsigned int val;
void main_interface(void); //主界面
void Interface2(void); //湿度数值界面
void Key_Mode(void); //模式切换
/*********************************************界面显示函数*****************************/
//主页面
void main_interface(void)
{
// OLED_Clear(0);
// delay_ms(10);
OLED_ShowCHinese_six(6,0,0);//智
OLED_ShowCHinese_six(26,0,1);//能
OLED_ShowCHinese_six(46,0,2);//加
OLED_ShowCHinese_six(66,0,3);//湿
OLED_ShowCHinese_six(82,0,4);//系
OLED_ShowCHinese_six(98,0,5);//统
OLED_ShowNum(6,3,2022,4,16);
OLED_ShowCHinese_TWO(40,3,0);//年
OLED_ShowNum(50,3,4,2,16);
OLED_ShowCHinese_TWO(74,3,1);//月
OLED_ShowNum(92,3,12,2,16);
OLED_ShowCHinese_TWO(108,3,2);//日
OLED_ShowCHinese_six(35,6,6); //名字显示
OLED_ShowCHinese_six(55,6,7);
OLED_ShowCHinese_six(75,6,8);
}
//界面2 温湿度显示及湿度修改值
void Interface2(void)
{
//以字符串的形式显示
OLED_ShowString(35,1,(unsigned char *)"C_T:",3); // Current_Temperature 当前温度
OLED_ShowCHinese_Three(85,0,11); //C
OLED_ShowString(35,3,(unsigned char *)"C_H:",3); // Current_Humidity 当前湿度
OLED_ShowCHinese_Three(85,2,13); //.
OLED_ShowString(35,5,(unsigned char *)"M_H:",3); // Modi_Humidity 修改当前湿度
OLED_ShowCHinese_Three(85,5,13); //.
}
//界面三 水位、继电器、加湿器状态显示
void Interface3(void)
{
//以字符串的形式显示
OLED_ShowString(35,1,(unsigned char *)"Relay:",6); //Realy 状态 0-》开 on 1 -》关 off
OLED_ShowNum(88,1,Relay,1,3); //状态值
OLED_ShowString(35,3,(unsigned char *)"Hfier:",6); // 加湿器状态 0->开On 1-》关 0ff
OLED_ShowNum(88,3,hfier,1,3);//状态值
OLED_ShowString(35,5,(unsigned char *)"Water:",6); // 水位高度
OLED_ShowNum(88,5,water/100,1,3); //状态值
OLED_ShowNum(96,5,water/10%10,1,3);
OLED_ShowNum(102,5,water%10,1,3);
}
/******************************三种LED控制********************************/
void Led_Switch(void)
{
//1.湿度 < 40
if(kk < 40)
{
Led1_on();
//printf("led1_on\n");
}
else
{
Led1_off();
//printf("led1_off\n");
}
//2.40 < 湿度 < 60
if((kk > 40) &&(kk < 60))
{
Led2_on();
//printf("led2_on\n");
}
else
{
Led2_off();
//printf("led2_off\n");
}
//3.湿度 > 60
if(kk > 60)
{
Led3_on();
//printf("led3_on\n");
}
else
{
Led3_off();
//printf("led3_off\n");
}
}
//温度获取函数
void Get_Temperature(void)
{
// uint16_t i;
// uint8_t k;
// uint8_t kk;
// uint8_t kkk;
//上面定义为全局 其他地方要用到
DHT11_UpdateData();
i = Rxbuff[0]+ Rxbuff[1]+Rxbuff[2]+ Rxbuff[3];
if(Rxbuff[4] ==i)
{
k=Rxbuff[2];
kk=Rxbuff[0];
kkk=Rxbuff[3];
OLED_ShowNum(68,1,k/10,3,3);
OLED_ShowNum(76,1,k%10,3,3);
OLED_ShowNum(68,3,kk/10,3,3);
OLED_ShowNum(76,3,kk%10,3,3);
OLED_ShowNum(68,5,m_humidity/10,3,3); //修改湿度值显示
OLED_ShowNum(76,5,m_humidity%10,3,3);
}
Led_Switch();
//printf("t:%d %d\n",k,kk); //测试的时候通过串口打印数据
}
/************************************功能函数********************************************/
//通过按键来进行界面的切换
void Key_Mode(void)
{
keyvalue = KEY_Scan(); //按键1来进行模式的切换
if(keyvalue == 1) //判断按键1是否被按下 向上进行界面切换
{
Buzzer_On();
delay_ms(100);
Buzzer_Off();
delay_ms(100);
flag++;
if(flag > 3) //界面边界处理
{
flag = 1;
}
}
if(keyvalue == 4) //向下进行界面切换
{
Buzzer_On();
delay_ms(100);
Buzzer_Off();
delay_ms(100);
flag--;
if(flag < 1) //界面边界处理
{
flag = 3;
}
}
if(flag == 2) //按键处理 进行湿度修改
{
if(keyvalue == 2)
{
Buzzer_On();
delay_ms(100);
Buzzer_Off();
delay_ms(100);
m_humidity +=2; //每次加2
if(m_humidity >= 95) //边界处理最大95
{
m_humidity = 20; //超过最大值重新置为初值
}
}
if(keyvalue == 3)
{
Buzzer_On();
delay_ms(100);
Buzzer_Off();
delay_ms(100);
m_humidity -= 2;//每次减2
if(m_humidity <= 20) //边界最小处理
{
m_humidity = 95; //小于最小值设置为最大值
}
}
}
}
void Relay_Controal(void)
{
unsigned char i =0;//次数
//通过比较当前湿度与我们设置的阈值 和水位控制继电器的开与断
//当前湿度小于我们所设置的阈值 打开继电器进行加湿
if((kk < m_humidity) &&((water !=0)))
{
Relayopen();
Relay = 0; //打开标志
hfier = 0; //加湿标志
}
else if(kk > m_humidity)//关闭
{
Relayoff();
Relay = 1; //关闭标志
hfier = 1; //加湿标志
}
//水位为0 是发出警报
else if(water == 0)
{
Relayoff();
Relay = 1; //关闭标志
hfier = 1; //加湿标志
for(i =0;i<5;i++)
{
Buzzer_On();
delay_ms(100);
Buzzer_Off();
delay_ms(100);
}
}
}
/*****************************************主函数*********************************/
int main(void)
{
KEY_GPIO_INIT();//按键初始化
USART_INIT(115200);
LED_GPIO_INIT();// led初始化
InitRelay();
ADC1_Init(); //水位传感器初始化
Buzzer_GPIO_Init();//蜂鸣器初始化
OLED_Init(); //初始化OLED
OLED_Clear(0);
Relayoff();
while(1)
{
Key_Mode();
switch(flag)
{
case 1: OLED_Clear(0);main_interface();break;
case 2: OLED_Clear(0);Get_Temperature();Interface2();break;
case 3: OLED_Clear(0);Interface3();break;
default:
break;
}
Relay_Controal();
Led_Switch();
water = water_Get_Value();
}
}
三、效果图
接线有点乱 整体效果还是有的
工程链接
链接:https://pan.baidu.com/s/1m8LwLMFuzUaNjzjuQDCazQ
提取码:exrd
–来自百度网盘超级会员V4的分享