IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32CubeMX基础例程(小熊派):09.厨房烟雾监测系统加强版 -> 正文阅读

[嵌入式]STM32CubeMX基础例程(小熊派):09.厨房烟雾监测系统加强版

1、准备开发板

这里我选用了一块网红开发板:”小熊派“,这款板子的人气比较高,还是全国大学生物联网设计竞赛(华为杯)的华为竞赛开发板,我个人也比较喜欢用这款板子,这款板子在放在纸箱吃灰半年之后,被我重新拿了起来,并想借此写博客的机会,整理一下自己的代码。

开发板功能区分布图
在这里插入图片描述

开发板俯视图
在这里插入图片描述

我们前面实现了一个厨房烟雾监测系统,还有一点点的欠缺,就是不能通过按键进行烟雾浓度阈值的修改,现在我们把这部分功能进行完善。到了这里我们该怎么做呢,方法就是用标志位难点主要是在:只有两个按键,但是要实现画面切换,并且修改阈值的操作。解决方法:按键按下的时候,进入阈值设置模式,当再按下上次按键的时候,进行阈值的加或者减,当按下另一个按键的时候,就会回到主菜单,这样就可以巧秒的利用两个按键了。

2、在MDK中编写代码

在main.c中编写以下代码

/* USER CODE BEGIN 0 */

float smoke_value;		//烟雾浓度值
float Smoke_UT = 5;//防止开机时阈值比烟雾浓度值小,导致蜂鸣器发声
char LCD_Str[30];

unsigned char F1btn_back_flag;	//按键1返回主菜单标志位
unsigned char F2btn_back_flag;	//按键2返回主菜单标志位


unsigned char display_mode;//设置显示的模式
typedef enum
{
	NORMAL,		//正常模式
	SETUP			//设置模式
}ENUM_DISPLAY_MODE;

//设置当前显示模式
void setDisplayMode(ENUM_DISPLAY_MODE mode)
{
	display_mode = mode;
}

//获取当前显示模式
ENUM_DISPLAY_MODE getDisplayMode(void)
{
	return display_mode;
}


//阈值修改函数
void Info_Alter(char *info)
{
    char *uwRet;
    uwRet = strstr(info, "UT");
    if (uwRet != NULL)
    {
        uwRet = strchr(uwRet, ':');
        if (uwRet != NULL)
        {
            uwRet++;
			printf("设定烟雾浓度阈值为:%s\r\n",uwRet);
			Smoke_UT = atof(uwRet);
	//			printf("烟雾浓度阈值为:%f\r\n",Smoke_UT);
        }
    }
}

//LCD显示函数
void LCD_Display(void)
{
	if(getDisplayMode() == NORMAL)
	{
		sprintf(LCD_Str,"smoke:%0.2f",smoke_value);	
		LCD_ShowString(40, 50+24+32, 240, 32, 32, LCD_Str);	//LCD显示烟雾浓度
	}
	else
	{
		sprintf(LCD_Str,"upthv:%0.2f",Smoke_UT);	
		LCD_ShowString(40, 50+24+32, 240, 32, 32, LCD_Str);	//LCD显示烟雾浓度报警阈值
	}
}

/* USER CODE END 0 */
int main(void)
{
  /* USER CODE BEGIN 1 */

	unsigned char key;	//按键值

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
	uint32_t smoke_time = 0;		//烟雾定时采集
  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  MX_ADC1_Init();
  MX_SPI2_Init();
  MX_TIM2_Init();
  MX_TIM16_Init();
  /* USER CODE BEGIN 2 */
	
	USART_Interupt_Enable();	//使能串口接收中断和空闲中断
	TIM_Interupt_Enable();		//使能定时器更新中断并启动定时器
	
	LCD_Init();			//LCD初始化
	
	LCD_Clear(BLUE);//清屏为蓝色
	
	LCD_ShowString(65, 50+24+32, 240, 32, 32, "Welcome");//显示字符串,字体大小32*32
	LCD_Draw_Circle(120, 120, 60);//画圆 半径r=60
	LCD_Draw_Circle(120, 120, 80);//画圆 半径r=80
	LCD_Draw_Circle(120, 120, 100);//画圆 半径r=100
	LCD_Draw_Circle(120, 120, 120);//画圆 半径r=120
	HAL_Delay(500);		//欢迎页面动画时间
	
	LCD_Clear(BLACK);//清屏为黑色
	LCD_ShowString(10, 10, 240, 24, 24, "Monitoring system");//显示字符串,字体大小24*24
	LCD_Draw_Circle(120, 120, 85);//画圆 半径r=80
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		
	   if(time2Count - smoke_time >= 1000)	//( 1ms * 1000 )计时一秒
   	   {
				smoke_time = time2Count;												//记下当前定时器的值
				smoke_value = (float)ADC_GetValue()/4096*3.3;			//转化为电压值
				printf("smoke_value:%f\r\n",smoke_value);
				if(smoke_value > Smoke_UT)	//如果烟雾浓度超过阈值
				{
					printf("报警中...");
					BEEP_ON;//蜂鸣器发声
				}
				else
				{
					BEEP_OFF;//蜂鸣器关闭
				}
		}
		
		key = KEY_Scan(0);		//按键扫描函数(在这里不能使用连按)
		if(key == 1)	//如果按键1按下
		{
			LED_Set(LED_ON)//点亮LED
			F2btn_back_flag = 1;		//设置按键2返回主页面使能(再按下按键2返回主界面)
			Smoke_UT += 0.1;		//将阈值加0.1
			if(F1btn_back_flag == 1)	//如果按键1返回主页面使能(这时候按下按键1返回主页面)
			{
				F1btn_back_flag = 0;	//将按键1返回主页面失能
				setDisplayMode(NORMAL);	//设置显示模式为正常模式
				continue;
			}
			setDisplayMode(SETUP);	//设置显示模式为设置模式
		}
		else if(key == 2)	//如果按键2按下
		{
			LED_Set(LED_OFF)//熄灭LED
			F1btn_back_flag = 1;		//设置按键1返回主页面使能(再按下按键1返回主界面)	
			Smoke_UT -= 0.1;		//将阈值减0.1
			if(Smoke_UT<=0)			//防止阈值为负数
				Smoke_UT = 0;
			if(F2btn_back_flag == 1)	//如果按键2返回主页面使能(这时候按下按键2返回主页面)
			{ 
				F2btn_back_flag = 0;	//将按键1返回主页面失能
				setDisplayMode(NORMAL);	//设置显示模式为正常模式
				continue;
			}
			setDisplayMode(SETUP);	//设置显示模式为设置模式
		}
		
		LCD_Display();		//在显示LCD上显示画面
		
		
		if(usart1Info.InfBit.finishFlag == REC_OK)		//如果串口数据接收成功
		{
				usart1Info.rxBuf[usart1Info.InfBit.dataLen++] = '\0';	//在数组最后添加\0,这样可以截断字符串
				printf("usart1Info.rxBuf:%s\r\n",usart1Info.rxBuf);		//打印字符串
				Info_Alter((char*)usart1Info.rxBuf);							//进行阈值的修改
				usart1Info.InfBit.finishFlag = REC_WAIT;				//将标志位设置成等待接收状态
				usart1Info.InfBit.dataLen = 0;							//将接收的数据长度设置为0
		}

  }
  /* USER CODE END 3 */
}

3、实验现象

实现的功能
1、给单片机上电会显示欢迎界面然后进入烟雾浓度显示界面
2、按下按键1控制LED点亮,按下按键2控制LED熄灭
3、ADC采集烟雾传感器浓度,并显示到LCD屏幕上
4、通过串口助手向单片机发送阈值设置指令,设置阈值成功后会给串口助手返回修改成功信息
5、烟雾浓度超过所设置的阈值时,触发蜂鸣器报警
6、按下按键1时,就会进入阈值设置画面,再按下按键1,烟雾浓度阈值就会加0.1,当按下按键2的时候就会回到主页面
按下按键2时,就会进入阈值设置画面,再按下按键2,烟雾浓度阈值就会减0.1,当按下按键1的时候就会回到主页面

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

[外链图片转存中…(img-seB2Y1W2-1626783255189)]

在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 14:21:29  更:2021-07-22 14:23:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/6 18:33:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码