目录
一、前言
项目成品图片:
哔哩哔哩视频链接:
STM32智能家电控制系统
(资料分享见文末)
二、项目简介
1.功能详解
基于STM32的智能家电控制系统
功能如下:
- STM32F103C8T6单片机系统板作为主控单元
- 显示功能:温湿度数据实时显示在OLED屏幕上
- 自动控制:判断温湿度是否在阈值范围内,否则蜂鸣器报警
- 阈值更改:按键可调节阈值大小
- 远程控制:通过机智云APP远程控制灯光、风扇和窗帘的开关
- 远程监视:机智云APP可以远程监视环境温湿度数据信息
2.主要器件
- STM32F103C8T6单片机
- OLED 屏幕
- DHT11温湿度传感器
- ESP8266-01S WiFi模块
- 继电器
- 大功率LED灯模块
- 风扇模块
- 步进电机
三、原理图设计
四、PCB硬件设计
PCB图
五、程序设计
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
OLED_Init();
DHT11_UserConfig();
MOTOR_UserConfig();
Key_Init();
USB_Init();
Buzzer_Init();
Temp_value = FLASH_R(FLASH_START_ADDR); //从指定页的地址读FLASH
Humi_value = FLASH_R(FLASH_START_ADDR+2); //从指定页的地址读FLASH
Timer2_Init(9,14398);
uart2_init(9600);
uart1_init(115200);
GENERAL_TIM_Init();
userInit(); //完成初始赋值
gizwitsInit();
IWDG_Init();
while (1)
{
IWDG_ReloadCounter(); //重新加载计数值 喂狗
switch(Menu)
{
case 1:
Menu1(); //显示菜单1
/*判断电机启动标志位是否为1*/
if(Curtain_ON_Flag == 1)
{
MOTOR_Direction_Angle(1,0,180,1); //顺时针电机旋转 180度
MOTOR_STOP(); //电机停止
Curtain_ON_Flag = 0;
}
/*判断电机关闭标志位是否为1*/
if(Curtain_OFF_Flag == 1)
{
MOTOR_Direction_Angle(0,0,180,1); //逆时针电机旋转 180度
MOTOR_STOP(); //电机停止
Curtain_OFF_Flag = 0;
}
break;
case 2:
OLED_Clear(); //清屏
Menu2(); //显示菜单2
Menu = 3;
case 3:
OLED_Option(SetNum); //显示当前选择的位置
OLED_ShowNum(2,10,Temp_value,2); //显示温度阈值数据
OLED_ShowNum(3,10,Humi_value,2); //显示湿度阈值数据
/*累计按键1按下的次数*/
if(KeyNum == 1)
{
KeyNum = 0;
SetNum++;
if(SetNum > 2)
{
SetNum = 1;
}
}
/*当位置指向温度阈值根据按键3或4调节数值*/
if(SetNum == 1)
{
if(KeyNum == 3)
{
KeyNum = 0;
Temp_value++;
if(Temp_value >= 100)
{
Temp_value = 0;
}
}
if(KeyNum == 4)
{
KeyNum = 0;
Temp_value--;
if(Temp_value >= 100)
{
Temp_value = 99;
}
}
}
/*当位置指向湿度阈值根据按键3或4调节数值*/
if(SetNum == 2)
{
if(KeyNum == 3)
{
KeyNum = 0;
Humi_value++;
if(Humi_value >= 100)
{
Humi_value = 0;
}
}
if(KeyNum == 4)
{
KeyNum = 0;
Humi_value--;
if(Humi_value >= 100)
{
Humi_value = 99;
}
}
}
/*当按键2按下时回到主菜单*/
if(KeyNum == 2)
{
KeyNum = 0;
/*将更改过的阈值存入Flash中*/
FLASH_W(FLASH_START_ADDR,Temp_value,Humi_value);
OLED_Clear(); //清屏
Menu = 1; //显示菜单1
}
break;
default : break;
}
userHandle();
gizwitsHandle((dataPoint_t *)¤tDataPoint);
}
}