基于STM32F103单片机WIFI无线APP控灯亮度灭设计
一、功能
由STM32F103C8T6单片机核心电路+两位白色高亮LED灯电路+WIFI模块ESP8266电路++电源电路组成。
1、stm32实时监测wifi数据,解析数据后通过pwm控制led的亮灭及亮度程度。
2、手机发送指令:
OPEN1,第一个灯亮;OPEN2,第二个灯亮;
CLOSE1,第一个灯灭;CLOSE2,第二个灯灭;
LED1-1,第一个等处于1档,LED1-2,第1个等处于2档,LED1-3,第一个等处于3档。
LED2-1,第2个等处于1档,LED2-2,第2个等处于2档,LED2-3,第2个等处于3档,
OPENALL:全亮
CLOSEALL:全灭!
二、材料清单
三、流程图
四、程序
主函数
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "timer.h"
#include "key.h"
#include "usart.h"
#include <string.h>
unsigned char led1Count=0; //led 对比pwm值计数
unsigned char led2Count=0;
unsigned char PWML_LED1=10;//led PWM 范围0-10
unsigned char PWML_LED2=10;
unsigned char BufTab[10]; //wifi数据暂存
unsigned char Count; //串口数据计数
unsigned char UartBusy=0; //判断忙碌
unsigned char ReadFlag=0;//读取标志
unsigned char sendDataFlag=0; //发送数据标志
u8 rebackFalg= 0; //数据返回标志
u8 MesCount=0; //发送内容计数
unsigned char i ;
int main(void)
{
delay_init(); //延时函数初始化
NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
LED_Init(); //初始化与LED连接的硬件接
uart_init(9600);
TIM3_Int_Init(499,7199);//10Khz的计数频率,计数到500为50ms
i=50;
while(i--) delay_ms(100);
printf("AT+CIPMUX=1\r\n"); //允许链接
i=10;
while(i--) delay_ms(100);
printf("AT+CIPSERVER=1,8080\r\n"); //创建端口号8080
while(1)
{
if(ReadFlag== 1) //读取串口数据标志
{
Count=0; //传授接收变量清零
UartBusy=0;
ReadFlag=0; //读取标识清零
if((strstr((const char *)BufTab,"PEN1")!=NULL)||(strstr((const char * )BufTab,"ED1-3")!=NULL)) //接收到LPEN1 LED1-3
{
PWML_LED1=10;rebackFalg=1;//设置pwm 发送标志置位
}
else if(strstr((const char * )BufTab,(const char * )"LOSE1")!=NULL) //接收到CLOSE1
{
PWML_LED1=0;rebackFalg=1;//设置pwm 发送标志置位
}
else if(strstr((const char *)BufTab,"ED1-1")!=NULL) //接收到LED1-1
{
PWML_LED1=3;rebackFalg=1;//设置pwm 发送标志置位
}
else if(strstr((const char *)BufTab,"ED1-2")!=NULL) //接收到LED1-2
{
PWML_LED1=6;rebackFalg=1;//设置pwm 发送标志置位
}
else if((strstr((const char *)BufTab,"PEN2")!=NULL)||(strstr((const char *)BufTab,"ED2-3")!=NULL)) //接收到 OPEN2
{
PWML_LED2=10;rebackFalg=1;//设置pwm 发送标志置位
}
else if(strstr((const char *)BufTab,"LOSE2")!=NULL) //接收到LLOSE2
{
PWML_LED2=0;rebackFalg=1;//设置pwm 发送标志置位
}
else if(strstr((const char *)BufTab,"ED2-1")!=NULL) //接收到LED2-1
{
PWML_LED2=3;rebackFalg=1;//设置pwm 发送标志置位
}
else if(strstr((const char *)BufTab,"ED2-2")!=NULL) //接收到LED2-2
{
PWML_LED2=6;rebackFalg=1;//设置pwm 发送标志置位
}
}
else if(strstr((const char *)BufTab,"PENALL")!=NULL) //接收OENALL
{
PWML_LED1=10;PWML_LED2=10;rebackFalg=1; //设置pwm 发送标志置位
}
else if(strstr((const char *)BufTab,"LOSEALL")!=NULL) //接收到CLOSEALL
{
PWML_LED1=0;PWML_LED2=0; rebackFalg=1;
}
for(i=0;i<10;i++) //清空wifi数据数组
{
BufTab[i]='0';
}
if((sendDataFlag == 1)&&(rebackFalg != 0))//接收到数后返回ok
{
if(MesCount == 0) //发送信息计数
{
MesCount =1;
printf("AT+CIPSEND=0,2\r\n"); //发送固定字节数据的at命令
}
else
{
if(rebackFalg ==1) //返回标志置位
{printf("OK");} //发送ok
MesCount = 0; //发送信息计数
rebackFalg = 0;
}
sendDataFlag = 0; //定时发送数据清空
}
led1Count++; //led 对比pwm值计数
led2Count++; //led 对比pwm值计数
if(led1Count<PWML_LED1) //led1 PWM对比
{
LED1=0; //开灯
}
else if((led1Count>=PWML_LED1)&&(led1Count<=10)) //led1 PWM对比
{
LED1=1; //关灯
}
else
{
led1Count=0; //一个周期结束
}
if(led2Count<PWML_LED2) //led2 PWM对比
{
LED2=0; //开灯
}
else if((led2Count>=PWML_LED2)&&(led2Count<=10)) //led2 PWM对比
{
LED2=1; //关灯
}
else
{
led2Count=0; //一个周期结束
}
}
}