描述
<h3>1、项目功能介绍</h3>
<p>温湿度测量仪项目使用STM32G030K6T6芯片作为主控芯片,Arm Cortex-M0+内核,最大主频64Mhz,具有32KB的Flash、8K的SRAM,供电电压在2.0V~3.6V。
使用IIC通信,采集来自sht40传感器的温湿度数据,通过74HC595让数码管显示温湿度数据。
空闲时间进入低功耗睡眠模式,按键进入正常运行模式,运行结束自动进入低功耗睡眠模式,等待按键唤醒。
利用IP5306给锂电池充电,锂电池(3.0-4.2V),Type-c接口用于充电锂电池及供电运行电路。
并加入了LED灯珠备用照明。</p>
<h3>2、项目属性</h3>
<p>首次公开</p>
<h3>3、开源协议</h3>
<p>Public Domain</p>
<p>权利/权益不为个人或团体所有,这些知识发明属于公有文化遗产。</p>
<h3>4、硬件部分</h3>
<p><img src="//image.lceda.cn/oshwhub/aeeab69f377f48c38a785e6e0e41d61b.png" alt="image.png"></p>
<h3>5、软件部分</h3>
<h1>include "main.h"</h1>
<h1>include "adc.h"</h1>
<h1>include "i2c.h"</h1>
<h1>include "tim.h"</h1>
<h1>include "gpio.h"</h1>
<p>void SystemClock_Config(void);
struct DEVICE_PARAMTER device_paramter = {0};
int main(void)
{
/<em> USER CODE BEGIN 1 </em>/
float temperature = 0;<br>
float humidity = 0;
/<em> USER CODE END 1 </em>/
HAL_Init();
SystemClock_Config();
HAL_DeInit();
MX_GPIO_Init();<br>
MX_ADC1_Init();
MX_I2C1_Init();
MX_TIM14_Init();
/<em> USER CODE BEGIN 2 </em>/
HAL_Delay(100);
SN74HC595_Send_Data(SN_DIG,0xFF); //关闭数码管显示
SN74HC595_Send_Data(SN_LED1,0x00);
SN74HC595_Send_Data(SN_LED2,0x00);</p>
<p>/<em> USER CODE END 2 </em>/
HAL_SuspendTick(); //暂停滴答定时器,防止通过滴答定时器中断唤醒
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); /<em> 执行WFI指令, 进入睡眠模式 </em>/
/<em> Infinite loop </em>/
/<em> USER CODE BEGIN WHILE </em>/
while (1)
{
/<em> USER CODE END WHILE </em>/</p>
<pre><code>/* 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指令, 进入睡眠模式
}</code></pre>
<p>}
/<em> USER CODE END 3 </em>/
}</p>
<p>/**</p>
<ul>
<li>@brief System Clock Configuration</li>
<li>
<p>@retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};</p>
<p>/*<em> Configure the main internal regulator output voltage
</em>/
HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);</p>
<p>/** Initializes the RCC Oscillators according to the specified parameters</p>
</li>
<li>
<p>in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;
RCC_OscInitStruct.PLL.PLLN = 8;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}</p>
<p>/*<em> Initializes the CPU, AHB and APB buses clocks
</em>/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;</p>
<p>if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}</p>
</li>
</ul>
<p>/<em> USER CODE BEGIN 4 </em>/</p>
<p>/<em> USER CODE END 4 </em>/</p>
<p>/**</p>
<ul>
<li>@brief This function is executed in case of error occurrence.</li>
<li>@retval None
<em>/
void Error_Handler(void)
{
/</em> USER CODE BEGIN Error_Handler_Debug <em>/
/</em> User can add his own implementation to report the HAL error return state <em>/
__disable_irq();
while (1)
{
}
/</em> USER CODE END Error_Handler_Debug */
}</li>
</ul>
<h1>ifdef USE_FULL_ASSERT</h1>
<p>/**</p>
<ul>
<li>@brief Reports the name of the source file and the source line number</li>
<li>where the assert_param error has occurred.</li>
<li>@param file: pointer to the source file name</li>
<li>@param line: assert_param error line source number</li>
<li>@retval None
<em>/
void assert_failed(uint8_t </em>file, uint32_t line)
{
/<em> USER CODE BEGIN 6 </em>/
/<em> User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) </em>/
/<em> USER CODE END 6 </em>/
}
<h1>endif /<em> USE_FULL_ASSERT </em>/</h1></li>
</ul>
<h3>7、大赛LOGO验证</h3>
<p><img src="//image.lceda.cn/oshwhub/70368304f1cb401c9987786e6318fe09.png" alt="image.png"></p>
评论(0)