首页 » 通讯 » 基于单片机stm32的家用燃气可视化实时监控报警仪 - 物联网 嵌入式_数据_温湿度

基于单片机stm32的家用燃气可视化实时监控报警仪 - 物联网 嵌入式_数据_温湿度

雨夜梧桐 2025-01-13 16:25:06 0

扫一扫用手机浏览

文章目录 [+]

基于单片机的家用燃气的可视化实时监控报警仪

难度系数:4分事情量:4分创新点:3分1 简介

本项目设计紧张功能是可以用于家用燃气的可视化实时监控的迷你报警器,传感器部分和米家等绝大多数网络上的家用燃气报警利用的同等,还支持便捷改换传感器。
具备WIFI模块,支持AT命令的设置。

基于单片机stm32的家用燃气可视化实时监控报警仪 - 物联网 嵌入式_数据_温湿度 基于单片机stm32的家用燃气可视化实时监控报警仪 - 物联网 嵌入式_数据_温湿度 通讯

2 紧张器件HK32F031K6U6主控芯片SP485E芯片ch340e芯片MIC5219-3.3稳压芯片WiFi模块3 实现效果

基于单片机stm32的家用燃气可视化实时监控报警仪 - 物联网 嵌入式_数据_温湿度 基于单片机stm32的家用燃气可视化实时监控报警仪 - 物联网 嵌入式_数据_温湿度 通讯
(图片来自网络侵删)

4 设计事理4.1 硬件部分

本项目涉及到的功能模块有:

USB转TTL通信USB与单片机通信USB与WIFI模块通信单片机驱动OLED液晶屏单片机驱动AHT20/21温湿度芯片单片机PWM驱动蜂鸣器单片机AD采集可燃传感器的电压值等功能。

前面和USB干系的测试方法便是插电脑和正常利用的485转接线进行连线传输,考试测验不同的波特率和传输速率进行收发通信,不丢包,稳定传输便是通过测试,否则要检讨硬件电路上的问题,是否有虚焊和器件上的破坏。
OLED和温湿度芯片采取IIC干系的驱动,单输出IIC可以不加上拉电阻能实现功能,但是交互式的,要获取数据的就必须加上上拉电阻才能收数正常。
而且燃气传感器是催化燃烧办法的,本身会发热,且发热量还不小,故该当尽可能的把温湿度芯片和可燃传感器分的远点,不然温度和湿度测试的都不准确。
每个功能模块通过软件编程实现功能后都要进行比拟。
屏幕驱动比较直不雅观,看到什么便是什么了,温湿度须要进行一定的补偿。
末了蜂鸣器和按键功能的增加,蜂鸣器是5020的封装,想要实现比较亮的声音就要剖析和测试,不断调教,找到比较响亮的蜂鸣声。
按键功能可以做很多的联动,这里把它做成了掌握屏幕显示反转的功能。

紧张事理图

4.2 软件部分

整体逻辑流程如下:

5 部分核心代码

void HAL_Delay_us_init(uint8_t SYSCLK){fac_us=SYSCLK; } void HAL_Delay_us(uint32_t nus){uint32_t ticks;uint32_t told,tnow,tcnt=0;uint32_t reload=SysTick->LOAD;ticks=nusfac_us; told=SysTick->VAL; while(1){tnow=SysTick->VAL;if(tnow!=told){if(tnow<told)tcnt+=told-tnow;else tcnt+=reload-tnow+told;told=tnow;if(tcnt>=ticks)break; }};}/ USER CODE END PFP // Private user code ---------------------------------------------------------// USER CODE BEGIN 0 // 函数名称: Get_analog_voltage(u8 ch) 完成韶光: 2017.5.24 编 写 人: DIX 入口参数: u8 ch 返 回 值: 电压值 功能解释: ADC旗子暗记转换为电压值mV 备表明释: 得到ADC仿照出的电压 12位精度 (0~3.3V之间的mV值)/uint16_t Get_analog_voltage(uint8_t AD) {uint32_t sum=0; //采样20次的累计和uint8_t count; uint16_t A_AD_Value; //单通道AD的变量值ADC_ChannelConfTypeDef sConfig;hadc.Instance->CHSELR = 0; if(AD==8){sConfig.Channel = ADC_CHANNEL_8;}else{sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;}sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;HAL_ADC_ConfigChannel(&hadc, &sConfig);A_AD_Value=0; //AD值清0for(count=0;count<50;count++) //重复采样50次{HAL_ADCEx_Calibration_Start(&hadc); //校准ADCHAL_ADC_Start(&hadc); //开启ADCHAL_ADC_PollForConversion(&hadc, 10); //等待转换过程sum += HAL_ADC_GetValue(&hadc); //得到50采样的累计和}A_AD_Value=sum/50; //AD采样50次后取均匀值A_AD_Value=(uint16_t)(A_AD_Value3300/4096); //扩大了1000倍整数为1mV值sum=0; //清0总值return A_AD_Value; //返回值}int8_t Temper_Judgment(void){int8_t temper;uint16_t adc_value=0;adc_value = Get_analog_voltage(0); temper = (int8_t)((adc_value-449)/1.61);return temper; //返回值}//u16进制转换为字符串void u16tostr(u16 dat) {u8 temp[4];u8 i=0,j=0,k=0;while(dat){temp[i]=(dat%10+0x30);i++;dat/=10;}j=i;k=j;//for(i=0;i<j;i++)//{//str1[i] = temp[j-i-1];//}for(i=0;i<4;i++){if(4-k>i)str1[i] =' ';else { //j=j-1; str1[i] = temp[--j];}}if(!i) {str1[i++]='0';}//return str1;}/ USER CODE END 0 // @brief The application entry point. @retval int /int main(void){ / USER CODE BEGIN 1 /u8 x=1;//u32 CT_data[2]={0};// volatile float hum=0,tem=0; / USER CODE END 1 / / MCU Configuration--------------------------------------------------------/ / Reset of all peripherals, Initializes the Flash interface and the Systick. / HAL_Init(); / USER CODE BEGIN Init /HAL_Delay_us_init(24); //系统24MHz时钟 / 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_ADC_Init(); MX_USART2_UART_Init(); MX_TIM3_Init(); MX_TIM1_Init(); MX_TIM2_Init(); MX_TIM6_Init(); MX_USART1_UART_Init(); / USER CODE BEGIN 2 /HAL_TIM_Base_Start_IT(&htim2); //开启定时器2HAL_TIM_Base_Start_IT(&htim3); //开启定时器3HAL_TIM_Base_Start_IT(&htim1); //开启定时器6 OLED_Init();OLED_Clear(); OLED_DisplayTurn(1);//AHT20.alive=!AHT20_Init(); //AHT20温湿度传感器初始化temphum_init(); //ATH20初始化/打开串口1空闲中断/ //__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE); //使能串口2中断/打开串口1吸收DMA中断/ //HAL_UART_Receive_DMA(&huart2,rx_buffer,BUFFER_SIZE); //串口吸收DMA通道 / USER CODE END 2 / / Infinite loop / / USER CODE BEGIN WHILE / while (1) { / USER CODE END WHILE / / USER CODE BEGIN 3 /if(btimer) //1s中断{btimer = 0;bcont++;//Now_U = Get_analog_voltage(8); //采取内部ADC采样if(bcont==1){OLED_Clear(); //清屏//HAL_Delay(1000); //延时1秒OLED_DrawBMP(0,0,64,6,BMP5); //图片显示LOGO}if(bcont==5){OLED_Clear(); //清屏OLED_ShowCHinese(4,0,11); //第OLED_ShowCHinese(24,0,12); //六OLED_ShowCHinese(44,0,13); //届OLED_ShowCHinese(4,2,14); //立OLED_ShowCHinese(24,2,15); //创OLED_ShowCHinese(44,2,16); //杯OLED_ShowCHinese(0,4,3); //燃OLED_ShowCHinese(16,4,17); //气OLED_ShowCHinese(32,4,19); //监OLED_ShowCHinese(48,4,20); //测//OLED_ShowString(8,4,"Ex",16); //OLED_ShowString(0,4," O L E D",16); //OLED_ShowString(0,4," 29.1",16); //数据//OLED_ShowCHinese(44,4,21); //℃}if(bcont==9){OLED_Clear(); //清屏//OLED_ShowString(0,0,"12.6",16); //数据//OLED_ShowString(32,0,"%LEL",16); //可燃单位OLED_ShowCHinese(0,0,22); //温OLED_ShowCHinese(16,0,23); //湿OLED_ShowCHinese(32,0,24); //度OLED_ShowString(0,2," 26.2",16); //数据OLED_ShowCHinese(44,2,21); //℃OLED_ShowString(0,4,"50.7",16); //数据OLED_ShowString(40,4,"%RH",16); //湿度单位}if(bcont>=19){Now_U = Get_analog_voltage(8); //采取内部ADC采样Temper=Temper_Judgment(); //温度换算函数///--------AHT20读取数据---------///if(AHT20.alive)// 如果AHT20传感器存在,则读取温湿度数据//{////读取AHT20的 20Bit原始数据//AHT20.flag = AHT20_ReadHT(AHT20.HT);////实际标准单位转换// StandardUnitCon(&AHT20);//}if(bcont==19){OLED_Clear(); //清屏}if(Now_U>=900 && Now_U<2000){OLED_ShowCHinese(32,4,7); //警OLED_ShowCHinese(48,4,8); //戒} else if(Now_U>=2000){OLED_ShowCHinese(32,4,9); //危OLED_ShowCHinese(48,4,10); //险}else{OLED_ShowCHinese(32,4,5); //安OLED_ShowCHinese(48,4,6); //全}u16tostr(Now_U);OLED_ShowString(0,0,"U:",16); //电压OLED_ShowString(16,0,str1,16); //数据OLED_ShowString(48,0,"mV",16); //电压单位 memset(str1,0,4);OLED_ShowNum(4,2,Calculate_Concentration(Now_U),3,16); //显示浓度if(Calculate_Concentration(Now_U)>=10)HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);elseHAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_4); memset(str1,0,4);OLED_ShowString(32,2,"%LEL",16); //可燃单位OLED_ShowString(0,4,"Ex",16); //可燃标致}if(bcont>=50){//AHT20_Read_CTdata(CT_data); //不经由CRC校验,直接读取AHT20的温度和湿度数据 // hum = CT_data[0]10010/1024/1024; //打算得到湿度值(放大了10倍)// tem = CT_data[1]20010/1024/1024-500; //打算得到温度值(放大了10倍)//HAL_Delay(2000); //延时1秒bcont=0;}}if(!HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin)){//读取KEY按键引脚,低电平表示按下//HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);//LED引脚电平取反HAL_Delay(10); //延时OLED_Clear(); x=!x; //变量取反OLED_DisplayTurn(x);while(!HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin))//等待松手,防松手抖动HAL_Delay(10); //延时}} / USER CODE END 3 /}

完全代码可进群免费领取!

嵌入式物联网的学习之路非常漫长,不少人由于学习路线不对或者学习内容不足专业而错失落高薪offer。
不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。
点击下方链接,0元领取学习资源,让你的学习之路更加顺畅!
记得点赞、关注、收藏、转发哦!

点击这里找小助理0元领取:扫码进群领资料

相关文章