界面基本流程
基本板块分布
功能模块的图标样式筛选
光标动态功能
基本板块分布
项目要求:显示器要显示实时温度、湿度、温度最高和最低阈值、湿度最高和最低阈值,以及电池电压。
根据要求,设计了五个板块区域显示;其中温度和湿度的最高、最低阈值要求可以通过按键设置调整。
当温度超过温度最高阈值:例如设定的温度最高阈值为30°,当温度传感器超过时,加热开启并对应的led信号灯常量,低于最低温度阈值时,降温设备启动,对应的led灯常亮,湿度超过阈值,同理。
但我考虑到不同设备开启时对应的信号灯亮,关闭时对应的灯灭不够直观的让用户知道风机,制冷和制热等设备的运行状态,我就在屏幕上加入了三个板块对应显示温湿度调节设备的运行状态。
五向按键操作(代码汇总在最下方)
![](https://img-blog.csdnimg.cn/img_convert/dd78ae225edbfa4d6bb3be83b4c235ca.jpeg)
操作五向按键,朝上拨动按键光设置标会移动到最高温度阈值,朝下拨动光标移动到湿度阈值,向右拨动按键阈值+1,朝左拨动按键阈值-1,实现用户可根据实际情况随时设置调整温湿度标准;
各板块介绍
![](https://img-blog.csdnimg.cn/img_convert/0cef6d3a21637d0a81026adf184ec797.jpeg)
拨动光标到最低温度阈值,再左右拨动按键进行设置调整+或-阈值。
上面三个板块:是温度和湿度调节的运行状态,U:30°:最高温度阈值 L:26°是通过按键调整的最低温度阈值(默认是20°)。温度调节设备是当温度高于30°时,制冷设备开启(此时时关闭);
当温度低于最低阈值20°+5度时,此刻最低阈值26°,当前温度是25.5°远远低于舒适条件,制热设备开启(on)保持温度恒温,并且光标高亮。让用户更直观的看到设备运行状态!
按键代码:
注意事项:按键需要进行防抖设置,我的方案是通过代码实现避免物理按键通电瞬间的抖动,但是在代码的实现过程中,要注意不能在按键中断内写延时来预防物理按键抖动HAL_Delay(150);我想了个办法,通过GPIO.C里写了extern 变量传到 到了main.c里,解决了此文题:下方是重要部分的代码实现;
gpio部分代码(1/2页)
//GPIO.C
/* Includes ------------------------------------------------------------------*/
#include "gpio.h"
/* USER CODE BEGIN 0 */
#include "adc.h"
#include <stdio.h>
uint16_t value[2];
extern uint8_t TMAX;
extern uint8_t TMIN;
extern uint8_t HMAX;
int key_Y;
extern int key_X;
extern int temp;
/* USER CODE END 0 */
//..........
//没有全部截取代码 下方是按键中断的所有代码
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==GPIO_PIN_8)
{
HAL_ADC_Start(&hadc1);
while(!(ADC1->ISR &1<<2)){};
value[0]=HAL_ADC_GetValue(&hadc1);
while(!(ADC1->ISR &1<<3)){};
value[1]=HAL_ADC_GetValue(&hadc1);
if(value[0]>2300&&value[0]<2400)//上
{
key_Y=2;
temp=key_Y;
}
if(value[0]>1150&&value[0]<1300)//下
{
key_Y=8;
temp=key_Y;
}
if(value[0]>1900&&value[0]<2100)//左
{
key_X=4;
}
if(value[0]>3000&&value[0]<3100)//右
{
key_X=6;
}
if(value[0]>2700&&value[0]<2800)//中
{
key_Y=5;
temp=key_Y;
}
HAL_ADC_Stop(&hadc1);
}
}
main.c代码 (2/2页)
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
uint8_t humiH;
uint8_t humiL;
uint8_t tempH;
uint8_t tempL;
uint8_t HMAX=50;
uint8_t TMAX=30;
uint8_t TMIN=20;
uint8_t rev[10];
char re[10];
int key_X=0;
int temp=0;
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
delay_init(64);
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
MX_TIM3_Init();
HAL_TIM_Base_Start_IT(&htim3);
/* USER CODE BEGIN 2 */
Lcd_Init();
FS_DHT11_Init();
showimage(gImage_wenshidu);//显示背景图
uint8_t windy[32]="off";
uint8_t cool[32]="off";
uint8_t hot[32]="off";
uint8_t buf1[32];
uint8_t buf2[32];
uint8_t buf3[32];
uint8_t buf4[32];
uint8_t buf5[32];
uint8_t buf6[32];
int id=9;
uint16_t buf;
uint16_t v;
uint8_t vcc[32];
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(150);
HAL_ADC_Start(&hadc1);
while(!(ADC1->ISR&1<<3)){};
v=HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);
sprintf((char *)vcc,"%.2fV",(v*(3.3/4095)));
//HAL_UART_Transmit(&huart1,vcc,strlen((char *)vcc), 100);
// HAL_Delay(2000);
//HAL_ADC_PollForConversion(&hadc1, 100);
DHT11_Read_Data(&humiH,&humiL,&tempH,&tempL);//HMAX=50 TMAX=32 TMIN=25;
if(temp==2)
{
Gui_DrawFont_GBK16(88,40, BLACK,GREEN, buf3);
if(key_X==4)
{
Gui_DrawFont_GBK16(88,40, BLACK,GREEN, buf3);
TMAX--;key_X=0;
}
if(key_X==6)
{ Gui_DrawFont_GBK16(88,40, BLACK,GREEN, buf3);
TMAX++;key_X=0;
}
}else
Gui_DrawFont_GBK16(88,40, BLACK,WHITE, buf3);
if(temp==5)
{
Gui_DrawFont_GBK16(88,54, BLACK,GREEN, buf4);
if(key_X==4)
{
Gui_DrawFont_GBK16(88,54, BLACK,GREEN, buf4);
TMIN--;key_X=0;
}
if(key_X==6)
{
Gui_DrawFont_GBK16(88,54, BLACK,GREEN, buf4);
TMIN++;key_X=0;
}
}else
Gui_DrawFont_GBK16(88,54, BLACK,WHITE, buf4);
if(temp==8)
{
Gui_DrawFont_GBK16(88,98, BLACK,GREEN, buf5);
if(key_X==4)
{
Gui_DrawFont_GBK16(88,98, BLACK,GREEN, buf5);
HMAX--;key_X=0;
}
if(key_X==6)
{ Gui_DrawFont_GBK16(88,98, BLACK,GREEN, buf5);
HMAX++;key_X=0;
}
}else
Gui_DrawFont_GBK16(88,98, BLACK,WHITE, buf5);
//湿度过高
if(humiH>=HMAX)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0|GPIO_PIN_1,GPIO_PIN_RESET);
strcpy((char *)windy,"on ");
Gui_DrawFont_GBK16(9,27, BLUE,YELLOW, windy);//开关状态
}
else if(humiH<HMAX)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0|GPIO_PIN_1,GPIO_PIN_SET);
strcpy((char *)windy,"off");
Gui_DrawFont_GBK16(9,27, BLUE,WHITE, windy);//开关状态
}
//低温加热
if(tempH<=TMIN)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);
strcpy((char *)hot,"on ");
Gui_DrawFont_GBK16(89,27, RED,YELLOW, hot);
}
else if(tempH>=TMIN+5)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);
strcpy((char *)hot,"off");
Gui_DrawFont_GBK16(89,27, RED,WHITE, hot);
}
//高温降温
if(tempH>TMAX)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0|GPIO_PIN_1,GPIO_PIN_RESET);
strcpy((char *)cool,"on ");
Gui_DrawFont_GBK16(51,27, GREEN,YELLOW, cool);
}
else if(tempH<=TMAX-5)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0|GPIO_PIN_1,GPIO_PIN_SET);
strcpy((char *)cool,"off");
Gui_DrawFont_GBK16(51,27, GREEN,WHITE, cool);
}
sprintf((char *)buf1,"%d.%d\n", tempH,tempL);//温度
sprintf((char *)buf2,"%d.%d\n", humiH,humiL);//湿度
sprintf((char *)buf3,"U:%d\n",TMAX);//温度上限
sprintf((char *)buf4,"L:%d\n",TMIN);//温度下限
sprintf((char *)buf5,"L:%d\n",HMAX);//湿 下限
sprintf((char *)buf6,"ID:%d\n", id);//ID
Gui_DrawFont_GBK16(44,54, BLACK,WHITE, buf1);
Gui_DrawFont_GBK16(44,98, BLACK,WHITE, buf2);
Gui_DrawFont_GBK16(42,113, RED,WHITE,buf6);
Gui_DrawFont_GBK16(86,113, RED,WHITE, vcc);
HAL_UART_Receive_IT(&huart1,rev,3);
//HAL_ADC_Start_DMA(&hadc1, (uint32_t *)&buf,1);
}
/* USER CODE END 3 */
}