
开源协议
:GPL 3.0
(未经作者授权,禁止转载)描述
题目要求
基于梁山派的智能窗帘项目
题目分析
期望实现的功能
自动模式下
- 根据空气湿度判断是否开关窗帘(优先度高)
- 根据光照强度判断是否开关窗帘
自动/手动模式下
- 红外遥控控制
- 语音指令控制
原理图设计说明
(1)温湿度传感器模块:用于检测空气温湿度;
因为手边刚好只有这个DHT11温湿度检测模块,就使用它来代替雨滴检测模块啦,又省下了一笔支出。本项目中主要使用湿度的度数。
原理图:
我的模块实物图是这个样子滴,如下图,应该市面上这种模块的实物都大差不差,代码应该可以通用。
具体的移植方法及代码请参见下面链接中有关于DHT11模块的部分:【立创·梁山派】模块移植手册
(2)光线强度传感器模块:用于检测光线强度;
本项目方案跟随官方案例使用了简化方案,即直接使用一个分压电阻加上一个光敏电阻。
原理图:
(3)红外接收模块,用于遥控控制;
原理图:
使用了一个红外接收头串联一个10KΩ贴片电阻。
另外还需要配一个遥控器发送指令。
(4)步进电机模块:用于驱动窗帘;
原理图:
步进电机选择了与官方案例相同的二相四线步进电机和驱动芯片,用来显示。
步进电机实物图:
步进电机驱动芯片:
(5)语音识别模块,用于语音控制。
原理图:
语音识别模块实物图:海凌科V20模块,具体使用方法及教程详情请参见:海凌科语音识别模块的语音固件创建与下载
喇叭实物图:嗯,一个挺大的喇叭
麦克风实物图:需要注意库存,官方例程的麦克风缺货,连夜修改了PCB,换了一款小点的麦克风,功能没有什么区别。
拨码开关实物图:用于独立控制是否给语音控制模块供电,方便下载语音模块的SDK固件.
PCB设计说明
注意事项:
画PCB时要注意电源线的宽度;电机部分的电路要注意电源线先经过电容再连接到电机驱动芯片上;为了美观走线时可以尽量走底层,或者藏起来。
软件说明
部分代码说明:
本项目使用的是DHT11模块进行空气湿度的数值检测,所以雨滴传感器接口宏定义部分可以注释掉,添加了温湿度的阈值。另外温湿度及光照的阈值,需要自行在自己的环境中测试得出。
/*file:bsp_adc.h*/
#ifndef _BSP_ADC_H__
#define _BSP_ADC_H__
#include "gd32f4xx.h"
/* 雨滴传感器接口 PF8 ADC2_IN6 */
#define BSP_RAINDROP_GPIO_RCU RCU_GPIOF
#define BSP_RAINDROP_GPIO_PORT GPIOF
#define BSP_RAINDROP_GPIO_PIN GPIO_PIN_8
/* 光照传感器接口 PF6 ADC2_IN4 */
#define BSP_LIGHT_GPIO_RCU RCU_GPIOF
#define BSP_LIGHT_GPIO_PORT GPIOF
#define BSP_LIGHT_GPIO_PIN GPIO_PIN_6
#define BSP_ADC_RCU RCU_ADC2
#define BSP_ADC ADC2
#define BSP_LIGHT_ADC_CHANNEL ADC_CHANNEL_4
#define BSP_RAINDROP_ADC_CHANNEL ADC_CHANNEL_6
//雨滴阈值 越小说明雨越大
#define RAINDROP 60
//温湿度阈值
#define HUM_MIN 60
#define HUM_MAX 75
//光照阈值 越小说明越亮
#define LIGHT_MIN 600
#define LIGHT_MAX 3900
void raindrop_and_light_config(void);
unsigned int get_adc_value(uint8_t adc_channel_x);
#endif
测试代码直接写在了自动模式的函数里,方便在自动模式下通过串口接收数据观察数值变化,以及后续改动宏定义中的相关阈值。
void automatic_mode(void)
{
uint16_t light_value = 0;
uint16_t raindrop_value = 0;
uint16_t temperature_value = 0;
uint16_t humidity_value = 0;
DHT11_Read_Data();
//读取温,湿度值
temperature_value=Get_temperature();
humidity_value=Get_humidity();
//读取光照值
light_value = get_adc_value( BSP_LIGHT_ADC_CHANNEL );
//串口打印输出光照,温度,湿度值
printf("light_value=%d\r\n",light_value);
printf("temperature_value=%d\r\n",temperature_value);
printf("humidity_value=%d\r\n",humidity_value);
delay_1ms(1000);
if( humidity_value >= HUM_MAX )
{
printf("湿度很高\r\n");
//打开窗帘(高优先度)
open_curtain();
return;
}
//如果检测到光照很高
if( light_value < LIGHT_MIN )
{
printf("光照强度很高\r\n");
//展开窗帘
open_curtain();
}
//如果检测到光照很低
if( light_value >= LIGHT_MAX )
{
printf("光照强度很低\r\n");
//关闭窗帘
close_curtain();
}
}
项目中使用时钟频率为200MHz,需要在文件:"system_gd32f4xx.c"中将相关240MHz的宏定义注释掉,解开200MHz的注释
/* select a system clock by uncommenting the following line */
//#define __SYSTEM_CLOCK_IRC16M (uint32_t)(__IRC16M)
//#define __SYSTEM_CLOCK_HXTAL (uint32_t)(__HXTAL)
//#define __SYSTEM_CLOCK_120M_PLL_IRC16M (uint32_t)(120000000)
//#define __SYSTEM_CLOCK_120M_PLL_8M_HXTAL (uint32_t)(120000000)
//#define __SYSTEM_CLOCK_120M_PLL_25M_HXTAL (uint32_t)(120000000)
//#define __SYSTEM_CLOCK_168M_PLL_IRC16M (uint32_t)(168000000)
//#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL (uint32_t)(168000000)
//#define __SYSTEM_CLOCK_168M_PLL_25M_HXTAL (uint32_t)(168000000)
//#define __SYSTEM_CLOCK_200M_PLL_IRC16M (uint32_t)(200000000)
//#define __SYSTEM_CLOCK_200M_PLL_8M_HXTAL (uint32_t)(200000000)
#define __SYSTEM_CLOCK_200M_PLL_25M_HXTAL (uint32_t)(200000000)
//#define __SYSTEM_CLOCK_240M_PLL_IRC16M (uint32_t)(240000000)
//#define __SYSTEM_CLOCK_240M_PLL_8M_HXTAL (uint32_t)(240000000)
//#define __SYSTEM_CLOCK_240M_PLL_25M_HXTAL (uint32_t)(240000000)
其他部分代码都与官方教程无太大区别,详情请参考官方教学。
实物展示说明
焊接完成的实物 be like:
(请忽略我不小心烤化了一小半的麦克风)
焊接时的注意事项:我自己摸索的一些小规律,不知道对不对。**先焊一些较小的贴片元件(刀头和热风枪比较好用),再焊中等大小焊不太多的插件,最后焊最大最复杂的。**本项目的电机芯片的位置距离底层排母的排针较近,焊接时最好使用焊锡膏和热风枪来焊。另外,还要在此特别感谢一下李工,帮我找了好几天的bug,最后发现是电机芯片有个引脚没焊上。后面使用了热风枪和锡膏进行补焊。是的,麦克风就是那个时候烤化的,呜呜呜。
演示视频
欲知详情,点它点它:智能窗帘演示视频
设计图

BOM


评论