本设计的硬件构成:
STM32F103C8T6单片机最小系统板(包含+3.3V稳压电路+时钟晶振电路+复位电路(上电自复位,手动复位)),光敏电阻,ULN2003驱动电路,LCD液晶显示屏、按键、蜂鸣器、LED灯,wifi通信模块,步进电机,电源接口组成;
功能介绍:
1、采用LCD显示屏对窗帘的开关状态、光照强度和控制模式进行实时显示。
2、用户可通过按键,在手动模式下,对窗帘进行开启或者关闭;
3、在自动模式下,系统可通过检测光照强度的亮暗来控制窗帘的开关;
4、系统使用步进电机的正传和反转来模拟窗帘的开启和关闭;
5、实物共有四个按键,按键一:手动、自动模式切换键;按键二:设置键;按键三:在设置状态下,加一键;在手动模式下,窗帘开启键;按键四:在设置状态下,减一键;在手动模式下,窗帘关闭键;
5、 手机APP可以连接wifi模块,APP可实时显示窗帘当前的状态、环境的光强度,也可以发送控制指令,对窗帘进行控制。(具体控制指令可见视频)
主要物料清单及型号:
显示屏:LCD1602-5V;
单片机:STM32F103C8T6;
Wifi模块:ESP-M1;
电机驱动芯片:ULN2003;
光敏电阻:5516-10k;
步进电机:28YBJ48-4相5线;
PCB:
部分程序源码:
int main(void)
{
u8 key=0;
u8 dir=1;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600); //串口初始化为115200
KEY_Init();
LED_Init(); //LED端口初始化
Lcd_Init();
TIM2_PWM_Init(3999,18); //不分频。PWM频率=72000000/4000=18Khz,占空比最大为(3999+1)
TIM3_Int_Init(499,7199);//10Khz的计数频率,计数到500为50ms
Adc_Init();
motor_init();
ascii_light[4]=0;
ascii_setlight[4]=0;
Lcd_Puts(0,0,"Light:0000xL AU");
Lcd_Puts(0,1,"State:OFF S:0000");
while(1)
{
key=KEY_Scan(0);
key_handle(key);
APP_Command_Process();
if(T_100ms>=15)
{
T_100ms=0;
light=(Get_Adc_Average(8,10)-700)*1.2;
if(refresh==1)
{
ascii_light[0]=light/1000+0x30;
ascii_light[1]=light%1000/100+0x30;
ascii_light[2]=light%100/10+0x30;
ascii_light[3]=light%10+0x30;
ascii_setlight[0]=set_light/1000+0x30;
ascii_setlight[1]=set_light%1000/100+0x30;
ascii_setlight[2]=set_light%100/10+0x30;
ascii_setlight[3]=set_light%10+0x30;
printf("当前光强度为:");
printf("%s",ascii_light);
printf("xL \t\n");
printf("当前设置光强度为:");
printf("%s",ascii_setlight);
printf("xL \t\n");
if(ctl_mode==AUTO_MODE)
printf("当前状态为自动模式!!\t\n");
else
printf("当前状态为手动模式!!\t\n");
if(state==OFF)
printf("当前为关窗状态!!\t\n");
else
printf("当前为开窗状态!!\t\n");
printf("\t\n");
}
if(ctl_mode==AUTO_MODE &&(set==0))
{
if(light>set_light)
{
if(state!=OFF)
{
motor_close();
motor_close();
state=OFF;
printf("已关窗!!\r\n");
}
}
else
{
if(state!=ON)
{
motor_open();
motor_open();
state=ON;
printf("已开窗!!\r\n");
}
}
}
if(set==0)
LCD_Refresh();
}
}
}