桌面温湿度监测仪
文章目录
目录
文章目录
前言
一、模块
二、硬件
1.原理图
2.PCB布局
3.实物图
三、软件
1.STM32CubeMX配置
2.程序
总结
前言
同事在我们自己建的硬件发烧友群里发了个嘉立创的硬件设计活动,这次活动内容是在嘉立创的工作页面进行PCB设计,通过筛选后可以得到器件购买券白嫖器件,然后自己进行手工焊接和程序烧录。
此次是白嫖桌面温湿度监测仪……
一、模块
1.单片机STM32G030K6T6
2.温湿度传感器SHT40-AD1B
3.LED数码管SP420361N
4.电池BH-AA-A5BJ012 + 1.5V 5号电池*2
二、硬件
1.原理图
![]()
2.PCB布局
3.实物图
PS:在电池接引脚处由于LED数码管没有反应,测的时候没有测出3V电压,所以在电池正极和器件上单独跳了根线出来
三、软件
1.STM32CubeMX配置
首先通过原理图的引脚功能分配进行相关的引脚功能配置,这里也涉及到了相关的时钟知识
(1)GPIO的配置
(2)NVIC
(3)Timers
(4)Clock
(5)项目配置
2.程序
int main(void) { /* USER CODE BEGIN 1 */ float temperature = 0; float humidity = 0; /* 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 */ HAL_DeInit(); /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_ADC1_Init(); MX_I2C1_Init(); MX_TIM14_Init(); /* USER CODE BEGIN 2 */ HAL_Delay(100); SN74HC595_Send_Data(SN_DIG,0xFF); //关闭数码管显示 SN74HC595_Send_Data(SN_LED1,0x00); SN74HC595_Send_Data(SN_LED2,0x00); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if(device_paramter.KeyStatus == KEY_SHAKE_STATE) { HAL_Delay(10); if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5) == GPIO_PIN_RESET) { while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5) == GPIO_PIN_RESET); SHT40_Read_RHData(&temperature,&humidity); //读取温湿度 device_paramter.Temp = temperature * 10; //放大温湿度 device_paramter.Humi = humidity * 10; HAL_TIM_Base_Start_IT(&htim14); //开始定时器,显示两次数据 device_paramter.sleepStatus = 0; //清除休眠标志 device_paramter.KeyStatus = KEY_NO_PRESS; //清除按下标志 } } else if(device_paramter.sleepStatus == 1) //显示结束,进入休眠 { HAL_SuspendTick(); //暂停滴答定时器,防止通过滴答定时器中断唤醒 HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); /* 执行WFI指令, 进入睡眠模式 */ } }void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM14) { HAL_TIM_Base_Stop_IT(&htim14); updata_flag++; if(updata_flag <= 5000) { ShowNum(1,1,(device_paramter.Temp/100)); ShowNum(1,2,(device_paramter.Temp / 10 % 10)); ShowNum(1,3,device_paramter.Temp%10); } else if(updata_flag <= 10000) { ShowNum(2,1,(device_paramter.Humi/100)); ShowNum(2,2,(device_paramter.Humi / 10 % 10)); ShowNum(2,3,device_paramter.Humi%10); } else { updata_flag = 0; sleep_flag++; } __HAL_TIM_SetCounter(&htim14,0); if(sleep_flag >= 2) { sleep_flag = 0; device_paramter.sleepStatus = 1; SN74HC595_Send_Data(SN_DIG,0xFF); SN74HC595_Send_Data(SN_LED1,0x00); SN74HC595_Send_Data(SN_LED2,0x00); } else{ HAL_TIM_Base_Start_IT(&htim14); } } }程序主要涉及到读取温湿度的调用,定时器的设置并且调用,这里对两个LED数码管数字的显示逻辑进行了配置
总结
在程序录入调试后,需要注意焊接问题,还有电池的正负串接,在我装入电池后,发现数码管无法显示,于是用仪器监测从电池正极出来的电压,发现Q1防反接保护处并没有对应的电压显示,重新焊接发现也是这个问题,所以就跳了根线引了电压(初步分析是在PCB画板走线的时候此处流通的线宽还是太小,过孔也不到位)
软件代码包链接:通过网盘分享的文件:程序代码.7z
链接: https://pan.baidu.com/s/13vZAPg0aTbPIGLfQjgPu7w?pwd=d79a 提取码: d79a