【年中粉丝节】+STM32G491 Nucleo-64开发板+AHT10温湿度传感器,实现温湿度检测并在OLED上显示。 年中我也来分享一波自己做过的,凑个热闹,搞点积分!!! 开发板用的是STM32G491 Nucleo-64开发板: 具体参数如下图: 传感器是奥松的AHT10,IIC接口: 显示用的是12864的OLED,也是IIC接口。 下面进入程序配置,打开CUBEMX。选择IIC1跟IIC2还有串口跟LED。 生成程序后用keil打开,修改逻辑部分: 先是OLED,在之前的标准库的例程上修改一下写函数,其他的基本不变: 串口修改(没有用到): 接着是AHT10的,由于硬件IIC没有测试成功,采用的模拟IIC: /** brief 检查AHT10读温湿度数据 param *temperature:需要读出的温度数据,float指针类型,精度范围+-0.3C param *humidity:需要读出的湿度数据,u8指针类型,精度范围+-2RH return 0 读数据正常 1读数据失败 */ uint8_t AHT10ReadData(float *temperature,uint8_t *humidity) { uint8_t ack; uint32_t SRH=0,ST=0; uint8_t databuff[6]; IIC_Start(); IIC_Send_Byte(AHT10_WRITE); IIC_Wait_Ack(); IIC_Send_Byte(0xac); IIC_Wait_Ack(); IIC_Send_Byte(0x33); IIC_Wait_Ack(); IIC_Send_Byte(0x00); IIC_Wait_Ack(); IIC_Stop(); HAL_Delay(80);//延时一会等待数据读出 IIC_Start(); IIC_Send_Byte(AHT10_READ); IIC_Wait_Ack(); ack=IIC_Read_Byte(1); if((ack&0x40)==0) { databuff[0]=IIC_Read_Byte(1); databuff[1]=IIC_Read_Byte(1); databuff[2]=IIC_Read_Byte(1); databuff[3]=IIC_Read_Byte(1); databuff[4]=IIC_Read_Byte(0); IIC_Stop(); SRH=(databuff[0]<<12)+(databuff[1]<<4)+(databuff[2]>>4); ST=((databuff[2]&0X0f)<<16)+(databuff[3]<<8)+(databuff[4]); *humidity=(int)(SRH*100.0/1024/1024+0.5); *temperature=((int)(ST*2000.0/1024/1024+0.5))/10.0-50; return 0; } IIC_Stop(); return 1; } 最后在主程序调用和显示即可: int main(void) { /* USER CODE BEGIN 1 */ float TEM[1]={0}; uint8_t HUM[1]={0}; /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); 6 ^" F g# _& U# K /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ ) j, `: Q m1 f0 _- _4 Y /* USER CODE END SysInit */ 4 n* [( @/ @5 j% m. U! T /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_LPUART1_UART_Init(); // MX_I2C1_Init(); MX_I2C2_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ OLED_Init(); AHT10Init(); //IIC初始化 // AHT10Reset(); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ + q+ H X W L. n h) g) ~. ` /* USER CODE BEGIN 3 */ //温度: OLED_ShowChinese(0,0,4,16,1); OLED_ShowChinese(16,0,5,16,1); OLED_ShowChinese(32,0,2,16,1); OLED_ShowChinese(48,0,3,16,1); OLED_ShowString(64,0,":",16,1); OLED_Write_Float(72,0,TEM[0],16,1); OLED_ShowChinese(112,0,10,16,1); //湿度: OLED_ShowChinese(0,20,4,16,1); OLED_ShowChinese(16,20,5,16,1); OLED_ShowChinese(32,20,11,16,1); OLED_ShowChinese(48,20,3,16,1); OLED_ShowString(64,20,":",16,1); OLED_Write_Int(72,20,HUM[0],16,1); OLED_ShowString(112,20,"%",16,1); OLED_Refresh(); % M3 a c% g$ G! F- w HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin); AHT10ReadData(TEM,HUM); printf("TEM=%0.1f,HUM=%d\n",TEM[0],HUM[0]); HAL_Delay(1000); } /* USER CODE END 3 */ } 下面是实测图:
如果对程序有兴趣的可以留言,HAL库的程序确实有点大,传不上来。 分享结束!年中给日天添把火!!! : ]& z/ X3 ]* d4 A$ Y# m" `( T; ]" U3 x |
为什么截图有些显示不出来9 u. Q* D% E& U* l- B/ } |