做了一个联网控制的智能窗帘
移植了freeROTS上电测试后能正常运行十几秒,之后就卡死了,屏幕不动,按键也不管用
总共创建了三个任务,一个屏幕显示各种数据,一个控制电机,一个esp01s发送数据给云平台
找不出问题在哪
单片机用的是stm32f103c8t6,freeROTS模板是在CSDN上下载的
部分代码
uint8_t g[]="&cmd=2&uid=87d1267617024de1b6af42828dbeb1aa&topic=bishe&msg=#";
uint8_t x[]="&cmd=1&uid=87d1267617024de1b6af42828dbeb1aa&topic=bishe\r\n";
uint8_t rst[]="AT+RST\r\n";
uint8_t ping[]="ping\r\n";
#define START_TASK_PRIO 1
#define START_STK_SIZE 128
TaskHandle_t StartTask_Handler;
void start_task(void *pvParameters);
#define DJ_TASK_PRIO 2
#define DJ_STK_SIZE 50
TaskHandle_t DJTask_Handler;
void DJ_task(void *pvParameters);
#define XH_TASK_PRIO 3
#define XH_STK_SIZE 50
TaskHandle_t XHTask_Handler;
void XH_task(void *pvParameters);
#define WIFI_TASK_PRIO 4
#define WIFI_STK_SIZE 50
TaskHandle_t WIFITask_Handler;
void WIFI_task(void *pvParameters);
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
//各种模块初始化
delay_init();
BH1750_Init();
OLED_Init();
DJInit ();
Key_Init();
timeInit();
DHT_Read();
Usart_Init();
OLED_ShowHZ(2,1,135);
OLED_ShowHZ(2,3,137);
OLED_ShowHZ(2,5,139);
Usart_SendArray(rst,sizeof(rst));
//等待连上网络
while(flag==0)
{
OLED_ShowHZ(2,1,135);
OLED_ShowHZ(2,3,137);
OLED_ShowHZ(2,5,139);
OLED_ShowChar(2, 7, '.');
OLED_ShowChar(2, 8, ' ');
OLED_ShowChar(2, 9, ' ');
OLED_ShowChar(2, 11, ' ');
Delay_ms(200); OLED_ShowChar(1, 1, '.');
OLED_ShowChar(2, 7, '.');
OLED_ShowChar(2, 9, '.');
OLED_ShowChar(2, 11, ' ');
Delay_ms(200); OLED_ShowChar(1, 2, '.');
OLED_ShowChar(2, 7, '.');
OLED_ShowChar(2, 9, '.');
OLED_ShowChar(2, 11, '.');
Delay_ms(200); OLED_ShowChar(1, 3, '.');
}
//连上网络发送at指令
espinit();
OLED_Clear();
xTaskCreate((TaskFunction_t )start_task,
(const char* )"start_task",
(uint16_t )START_STK_SIZE,
(void* )NULL,
(UBaseType_t )START_TASK_PRIO,
(TaskHandle_t* )&StartTask_Handler);
vTaskStartScheduler();
}
void start_task(void *pvParameters)
{
taskENTER_CRITICAL();
xTaskCreate((TaskFunction_t )DJ_task,
(const char* )"DJ_task",
(uint16_t )DJ_STK_SIZE,
(void* )NULL,
(UBaseType_t )DJ_TASK_PRIO,
(TaskHandle_t* )&DJTask_Handler);
xTaskCreate((TaskFunction_t )XH_task,
(const char* )"XH_task",
(uint16_t )XH_STK_SIZE,
(void* )NULL,
(UBaseType_t )XH_TASK_PRIO,
(TaskHandle_t* )&XHTask_Handler);
xTaskCreate((TaskFunction_t )WIFI_task,
(const char* )"WIFI_task",
(uint16_t )WIFI_STK_SIZE,
(void* )NULL,
(UBaseType_t )WIFI_TASK_PRIO,
(TaskHandle_t* )&WIFITask_Handler);
vTaskDelete(StartTask_Handler);
taskEXIT_CRITICAL();
}
//控制电机
void DJ_task(void *pvParameters)
{
while(1)
{ //根据定时设定的时间判断是否关闭窗帘
if(kflag==1)
{
DJK();
kflag=0;
}
if(gflag==1)
{
DJG ();
gflag=0;
}
//在白天时间段判断光强,改变窗帘状态
if(h>4 && h<20 && hflag!=h)
{
if(BH1750_Read_Data()DJK();
if(BH1750_Read_Data()>upper_limit)
DJG ();
}
//手机发送数据控制窗帘
if(kg==1)
{DJK ();kg=3;hflag=h;}
if(kg==0)
{DJG ();kg=3;hflag=h;}
vTaskDelay(100);
}
}
//屏幕显示,包括按键功能
void XH_task(void *pvParameters)
{
while(1)
{
DHT_Read();
xianshi();
vTaskDelay(100);
}
}
//esp01s向云平台发送数据
void WIFI_task(void *pvParameters)
{
uint8_t i=0;
while(1)
{
light=BH1750_Read_Data();
Usart_SendArray1(g, sizeof(g),dat[0],dat[2],light,M);//发送温湿度,光强,窗帘状态等数据
vTaskDelay(500);
i++;
if(i>100)
{
Usart_SendArray(ping,sizeof(ping));//一段时间发送一次心跳指令
i=0;
}
}
我个人感觉问题可能出在esp01那一块,是不是网络不好导致esp01s发送过数据没有及时反馈cmd=2&res=1就又发送一次数据导致数据卡顿,或者是我的代码有问题,还是对freerote用发上有问题,各位帮帮忙,分析一下问题所在。
不知道你这个问题是否已经解决, 如果还没有解决的话: