STM32温湿度控制系统:按键控制和串口通信
printf('hello world!\n');
while (1)
{
// 获取温湿度
call_sht11(&Tem, &Hum);
printf('%d℃ %d%%RH\r\n', Tem, Hum);
if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 0)
{
HAL_Delay(300);
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
if (HAL_GPIO_ReadPin(LED1_GPIO_Port, LED1_Pin) == GPIO_PIN_SET)
{
printf('OUT');
}
else
{
printf('ENTER');
}
}
if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == 0)
{
HAL_Delay(300);
HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
if (HAL_GPIO_ReadPin(LED2_GPIO_Port, LED2_Pin) == GPIO_PIN_SET)
{
printf('STOP');
}
else
{
printf('FIRE');
}
}
if (uart1RxState == 1)
{
if (strstr((const char *)uart1RxBuff, cmdLightupStr) != NULL) // 判断串口是否有发送'LIGHT UP'指令
{
HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET);
printf('LIGHT UP OK');
}
else if (strstr((const char *)uart1RxBuff, cmdLightoffStr) != NULL)
{
HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_SET);
printf('LIGHT OFF OK');
}
if (strstr((const char *)uart1RxBuff, cmdWaterONStr) != NULL)
{
HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_Pin, GPIO_PIN_RESET);
printf('WATER ON OK');
}
else if (strstr((const char *)uart1RxBuff, cmdWateroffStr) != NULL)
{
HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_Pin, GPIO_PIN_SET);
printf('WATER OFF OK');
}
uart1RxState = 0;
uart1RxCounter = 0;
memset(uart1RxBuff, 0, 128);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
将获取温湿度的操作放在一个单独的线程或定时器中进行,避免影响按键操作的响应速度。或者使用中断来处理按键事件,更加及时地响应按键操作。
同时,可以考虑使用RTOS来管理多个任务和线程,提高系统的稳定性和可维护性。例如,可以将获取温湿度、处理串口指令、处理按键事件等操作分别放在不同的任务中进行,通过消息队列或信号量来进行任务之间的通信和同步。这样可以更好地实现系统的模块化和可扩展性,方便后续的系统升级和维护。
原文地址: https://www.cveoy.top/t/topic/owNj 著作权归作者所有。请勿转载和采集!